hdu5788 level up
来源:互联网 发布:mac pro 屏幕涂层脱落 编辑:程序博客网 时间:2024/06/06 05:13
贴下以前写的代码
比赛前我准备着重看的
主席树 树dp 字符串
#include<bits/stdc++.h>using namespace std;typedef long long ll;const int MAXN = 1e5+5;const int MOD = 1e9+7;int N;int A[MAXN];vector<int> mp[MAXN];int val[MAXN][2];/**********President Tree**********/int tot;struct Node{ int ls, rs, cc; Node(int a=0, int b=0, int c=0):ls(a), rs(b), cc(c){}}tree[MAXN*20];int sta[MAXN];int Build(int pos,int l,int r){ int rt = tot++; tree[rt].cc = 1; tree[rt].ls = tree[rt].rs = 0; if(l == r) return rt; int mid = (l+r) >> 1; if(pos <= mid) tree[rt].ls = Build(pos, l,mid); else tree[rt].rs = Build(pos, mid+1,r); return rt;}int Merge(int x,int y,int l,int r){ if(x == 0 || y == 0) return x+y; tree[x].cc += tree[y].cc; if(l == r) { tree[x].ls = tree[x].rs = 0; return x; } int mid = (l+r) >> 1; tree[x].ls = Merge(tree[x].ls, tree[y].ls, l, mid); tree[x].rs = Merge(tree[x].rs, tree[y].rs,mid+1, r); return x;}int Query(int rt,int K,int l,int r){ if(tree[rt].cc < K) return 100000; if(l == r) return l; int mid = (l+r)>>1; if(tree[tree[rt].ls].cc >= K) return Query(tree[rt].ls, K, l ,mid); else return Query(tree[rt].rs, K-tree[tree[rt].ls].cc, mid+1, r);}void dfs(int x){ sta[x] = Build(A[x], 1, 100000); for(int i = 0; i < mp[x].size(); ++i){ int y = mp[x][i]; dfs(y); sta[x] = Merge(sta[x], sta[y], 1, 100000); }// printf("%d\n",sta[x]); val[x][0] = Query(sta[x], tree[sta[x]].cc+1>>1, 1, 100000); val[x][1] = Query(sta[x], (tree[sta[x]].cc+1>>1)+1, 1, 100000);}/**************BIT*************/ll bitt[MAXN];void Add(int pos,int num){ for(int i = pos; i > 0; i -= i&-i) bitt[i] += num;}ll Sum(int pos){ ll ans = 0; for(int i = pos; i <= 100000; i += i&-i) ans += bitt[i]; return ans;}ll dfs2(int x){ Add(val[x][0], val[x][1]-val[x][0]); ll ans = Sum(val[x][0]); for(int i = 0; i < mp[x].size(); ++i){ int y = mp[x][i]; ans = max(ans, dfs2(y)); } Add(val[x][0], val[x][0]-val[x][1]); return ans;}int main(){ while(~scanf("%d",&N)){ memset(bitt,0,sizeof(bitt)); tot = 1; for(int i = 1; i <= N; ++i) scanf("%d",&A[i]); for(int i = 1; i <= N; ++i) mp[i].clear(); for(int i = 2; i <= N; ++i){ int a; scanf("%d",&a); mp[a].push_back(i); } dfs(1); ll sum = 0; for(int i = 1; i <= N; ++i) sum += val[i][0]; printf("%lld\n", sum + dfs2(1)); } return 0;}
0 0
- hdu5788 level up
- [HDU5788] Level Up [2016 Multi-University Training Contest 5 1008 (2016多校联合训练5)]
- hdu5788 Level Up (2016多校第五场1008) 主席树
- level up
- hdu 3954 Level up
- hdu Level up
- hdu 3954 Level up
- 《Level up》书评
- HDU-3954-Level up
- coj 1468: Level Up
- HDU 5788 Level Up
- HDU 3954 Level up
- HDU 3954 Level up
- 【线段树】 hdu3954 Level up
- 线段树 HDU3954 Level Up
- Level-Up Your Machine Learning
- 2011阿里巴巴程序设计公开赛 / 1004 Level up
- HDU 3954 level up 线段树
- JAVA-可变参数
- 定义一个16位长整型数,统计里面0~9每个数字出现的次数。(包括将长整型转化为字符数组的方法及switch的用法)
- matlab cell排序
- C/C++中类的声明和定义
- Leetcode 311. Sparse Matrix Multiplication
- hdu5788 level up
- matlab cell保存mat 以及提取
- 异常之Tomcat7.0服务器无法发布项目
- JAVA-SYSTEM/RUNTIME/DATE/CALENDAR
- 实现一个简陋的MVC框架
- 防火墙类型总结
- 全概公式和贝叶斯公式的理解
- struts2文件上传总结
- Jquery 使用Ajax获取后台返回的Json数据后,页面处理