【BZOJ 2588】 Spoj 10628. Count on a tree|树上K大|树链剖分|主席树
来源:互联网 发布:java pageoffice 编辑:程序博客网 时间:2024/05/17 02:07
我沙茶
我沙茶
我沙茶
傻到去写链剖! 本来求个LCA又好写又快.....
#include <cstdio>#include <iostream>#include <algorithm>using namespace std;#define MAXN 100010int team[MAXN],head,tail;int fa[MAXN],son[MAXN],size[MAXN],loc[MAXN],top[MAXN],depth[MAXN];int tot,g[MAXN*2],nnext[MAXN*2],num[MAXN*2];void Add(int x,int y){tot++;nnext[tot]=g[x];g[x]=tot;num[tot]=y;}void Lian_Pou(){team[++tail]=1;depth[1]=1;while(head<tail){int x=team[++head];for(int i=g[x];i;i=nnext[i]){int tmp=num[i];if(depth[tmp]!=0) continue ;fa[tmp]=x;depth[tmp]=depth[x]+1;team[++tail]=tmp;}}for(int i=tail;i>=1;i--){int x=team[i];size[x]=1;for(int j=g[x];j;j=nnext[j]){int tmp=num[j];if(tmp==fa[x]) continue ;size[x] += size[tmp];if(size[tmp]>size[son[x]]) son[x]=tmp;}}loc[1]=1;top[1]=1;for(int i=1;i<=tail;i++){int x=team[i];int cnt=loc[x];if(son[x]!=0){loc[son[x]]=cnt+1;top[son[x]]=top[x];cnt+=size[son[x]];}for(int j=g[x];j;j=nnext[j]){int tmp=num[j];if(tmp==fa[x]||tmp==son[x]) continue ;loc[tmp]=cnt+1;top[tmp]=tmp;cnt+=size[tmp];}}}struct INIT{int num;int loc;int no;} init[MAXN];bool cmp(INIT a,INIT b) {return a.loc<b.loc;}bool cmp1(INIT a,INIT b){return a.num<b.num;}int cnt;int seg_tot;struct H{int L,R;int sum;}seg[MAXN*20];void Seg_Add(int now,int l,int r,int x,int last){if(l==r) {seg[now].sum=seg[last].sum+1;;return ;}int mid=(l+r)/2;if(x<=mid) {seg[now].L=++seg_tot;seg[now].R=seg[last].R;last=seg[last].L;Seg_Add(seg[now].L,l,mid,x,last);}else{seg[now].R=++seg_tot;seg[now].L=seg[last].L;last=seg[last].R;Seg_Add(seg[now].R,mid+1,r,x,last);}seg[now].sum=seg[seg[now].L].sum+seg[seg[now].R].sum;}int hash[MAXN];int root[MAXN];int LL[MAXN],RR[MAXN],LN,RN;void Solve(int x,int y){LN=0;RN=0;while(top[x]!=top[y]){if(depth[top[x]]<depth[top[y]]) swap(x,y);LL[++LN]=root[loc[top[x]]-1];RR[++RN]=root[loc[x]];x=fa[top[x]];}if(depth[x]<depth[y]) swap(x,y);LL[++LN]=root[loc[y]-1];RR[++RN]=root[loc[x]];}int Q(int l,int r,int k){if(l==r) return l;int S=0;for(int i=1;i<=LN;i++) {S-=seg[seg[LL[i]].L].sum;S+=seg[seg[RR[i]].L].sum;}int mid=(l+r)/2;if(k<=S){for(int i=1;i<=LN;i++) LL[i]=seg[LL[i]].L;for(int i=1;i<=RN;i++) RR[i]=seg[RR[i]].L;return Q(l,mid,k);}else{for(int i=1;i<=LN;i++) LL[i]=seg[LL[i]].R;for(int i=1;i<=RN;i++) RR[i]=seg[RR[i]].R;k-=S;return Q(mid+1,r,k);}}int main(){//freopen("a.in","r",stdin);//freopen("wa.out","w",stdout);int n,m;cin >> n >> m;for(int i=1;i<=n;i++) scanf("%d",&init[i].num);for(int i=1;i<n;i++){int x,y;scanf("%d %d",&x,&y);Add(x,y);Add(y,x);}Lian_Pou();for(int i=1;i<=n;i++) init[i].loc=loc[i];sort(init+1,init+1+n,cmp1);init[1].no=1;for(int i=2;i<=n;i++) if(init[i].num!=init[i-1].num) init[i].no=init[i-1].no+1; else init[i].no=init[i-1].no;cnt=init[n].no;for(int i=1;i<=n;i++) hash[init[i].no]=init[i].num;sort(init+1,init+n+1,cmp);for(int i=1;i<=n;i++){root[i]=++seg_tot;Seg_Add(root[i],1,cnt,init[i].no,root[i-1]);}int last=0;for(int i=1;i<=m;i++){int u,v,k;scanf("%d %d %d",&u,&v,&k);u^=last;Solve(u,v);last=hash[Q(1,cnt,k)];if(i!=m) printf("%d\n",last);else printf("%d",last);}return 0;}
0 0
- 【BZOJ 2588】 Spoj 10628. Count on a tree|树上K大|树链剖分|主席树
- 2588: Spoj 10628. Count on a tree (主席树,树上路径第K大值)
- SPOJ 10628. Count on a tree (树上第k大,LCA+主席树)
- BZOJ BZOJ 2588: Spoj 10628. Count on a tree 树上主席树
- bzoj 2588: Spoj 10628. Count on a tree(树上主席树)
- 【BZOJ 2588】Spoj 10628. Count on a tree 主席树+树上差分
- 【BZOJ 2588】Count on a tree 【树上路径第K大】【LCA+主席树】
- SPOJ COT Count on a tree (树上k大 主席树模板)
- BZOJ 2588: Spoj 10628. Count on a tree|主席树
- [主席树] BZOJ 2588 Spoj 10628. Count on a tree
- BZOJ 2588 Spoj 10628. Count on a tree 主席树
- Spoj 10628. Count on a tree 树上主席树
- Bzoj 2588 Spoj 10628. Count on a tree(树链剖分LCA+主席树)
- SPOJ Count on a tree 树上第k大。
- SPOJ Count on a tree(树上第K大)
- SPOJ COTCount on a tree 树上第k大(主席树)
- [BZOJ]2588: Spoj 10628. Count on a tree 主席树+LCA
- 【BZOJ】2588 Spoj 10628. Count on a tree LCA+主席树
- 结构体的初始化
- 搞懂树状数组
- 写博客真难啊
- gdb调试技巧
- ios 应用内跳转到相应的系统界面的url
- 【BZOJ 2588】 Spoj 10628. Count on a tree|树上K大|树链剖分|主席树
- JVM:垃圾回收问题
- CSS3新特性学习
- Android电子学习资料
- mysql中unique和distinct
- JavaScript 生成树结构
- .9图片
- Java对象的强、软、弱和虚引用(二)
- FZU 2101 大三的美好时光 (DP+线段树)