POJ 2985 The k-th LargestGroup(Treap+并查集)
2017-10-02 09:48
447 查看
wa了或者TLE了..
静态数组实现..
参考https://vjudge.net/solution/2661312
可是还是wa了..
//#include<bits/stdc++.h> #include<iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define sf scanf #define pf printf #define mem(a,b) memset(a,b,sizeof(a)); #define rep(i,a,b) for(int i=(a);i<=(b);++i) #define MP make_pair #define ULL unsigned long long #define LL long long #define inf 0x3f3f3f3f #define md ((ll+rr)>>1) #define ls (i<<1) #define rs (ls|1) #define eps 1e-5 #define ree freopen("in.txt","r",stdin); #define bug pf("----------------"); #define N 200005 #define M 500020 #define INF 1e9 int par ,sz ; int n,m; struct Node{ Node *ch[2]; int r,v,s; Node(int v):v(v){ r=rand(); s=1; ch[0]=ch[1]=NULL; } void maintain(){ s=1; if(ch[0])s+=ch[0]->s; if(ch[1])s+=ch[1]->s; } int cmp(int x){ if(x==v)return -1; return x<v?0:1; } }*root; void rotate(Node*&o,int d){ Node*k=o->ch[d^1]; o->ch[d^1]=k->ch[d]; k->ch[d]=0; o->maintain(); k->maintain(); o=k; } void insert(Node*&o,int v){ if(o==NULL)o=new Node(v); else{ int d=v<o->v?0:1; insert(o->ch[d],v); if(o->ch[d]->r>o->r){ rotate(o,d^1); } } o->maintain(); } void remove(Node*&o,int v){ int d=o->cmp(v); if(d==-1){ Node*u=o; if(o->ch[0]&&o->ch[1]){ int d2=o->ch[0]->r<o->ch[1]->r?0:1; rotate(o,d2); remove(o->ch[d2],v); } else{ if(o->ch[0]==NULL)o=o->ch[1]; else o=o->ch[0]; delete u; } } else remove(o->ch[d],v); if(o)o->maintain(); } int kth(Node*o,int k){ if(o==NULL||k<=0||k>o->s)return 1; int s=(o->ch[1]==NULL)?0:o->ch[1]->s; if(k==s+1)return o->v; else if(k<=s)return kth(o->ch[1],k); else return kth(o->ch[0],k-s-1); } int Find(int x){ return x==par[x]?x:Find(par[x]); } void bind(int i,int j){ int fa=Find(i),fb=Find(j); if(fa!=fb){ if(sz[fa]!=1)remove(root,sz[fa]); if(sz[fb]!=1)remove(root,sz[fb]); insert(root,sz[fa]+sz[fb]); par[fa]=fb; sz[fb]+=sz[fa]; } } int main(){ //ree root=NULL; sf("%d%d",&n,&m); rep(i,1,n)par[i]=i,sz[i]=1; int op; rep(i,1,m){ sf("%d",&op); if(op==1){ int k; sf("%d",&k); pf("%d\n",kth(root,k)); } else{ int x,y; sf("%d%d",&x,&y); bind(x,y); } } }
静态数组实现..
参考https://vjudge.net/solution/2661312
可是还是wa了..
//#include<bits/stdc++.h> #include<iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define sf scanf #define pf printf #define mem(a,b) memset(a,b,sizeof(a)); #define rep(i,a,b) for(int i=(a);i<=(b);++i) #define MP make_pair #define ULL unsigned long long #define LL long long #define inf 0x3f3f3f3f #define md ((ll+rr)>>1) #define ls (i<<1) #define rs (ls|1) #define eps 1e-5 #define ree freopen("in.txt","r",stdin); #define bug pf("----------------"); #define N 200500 #define M 500020 #define INF 1e9 int fa ,cnt ; int n,m; struct Node{ int v,r,s,cnt; Node*ch[2]; Node(){} Node(int v):v(v){ ch[0]=ch[1]=NULL; r=rand(); s=cnt=1; } 101ed int cmp(int x){ if(v==x)return -1; return x<v?0:1; } void mt(){ s=cnt; if(ch[0]) s+=ch[0]->s; if(ch[1]) s+=ch[1]->s; } }pool[N<<1]; int sz; void rt(Node*&p,int d){ Node*k=p->ch[d^1]; p->ch[d^1]=k->ch[d]; k->ch[d]=p; p->mt(); k->mt(); p=k; } void insert(Node*&p,int x){ if(!p){ pool[sz]=Node(x); p=&pool[sz++]; return; } int d=p->cmp(x); if(d==-1){ p->s++; p->cnt++; return ; } insert(p->ch[d],x); if(p->ch[d]->r >p->r) rt(p,d^1); p->mt(); } void remove(Node*&p,int x){ int d=p->cmp(x); if(d==-1){ if(p->cnt>1){ p->cnt--;p->s--; return; } if(p->ch[0]==NULL) p=p->ch[1]; else if(p->ch[1]==NULL) p=p->ch[0]; else{ int d2=p->ch[0]->r>p->ch[1]->r?1:0; rt(p,d2); remove(p->ch[d2],x); } } else remove(p->ch[d],x); if(p) p->mt(); } int kth(Node*p,int k){ if(!p)return 0; int tot=0; if(p->ch[1]) tot=p->ch[1]->s; if(k>tot&&k<=tot+p->cnt) return p->v; if(k<=tot) return kth(p->ch[1],k); return kth(p->ch[0],k-tot-p->cnt); } int Find(int x){ return x==fa[x]?x:Find(fa[x]); } Node*root; int main(){ //ree while(~sf("%d%d",&n,&m)){ sz=0; root=NULL; rep(i,1,n)fa[i]=i,cnt[i]=1,insert(root,1); int op; rep(i,1,m){ sf("%d",&op); if(op==1){ int k; sf("%d",&k); pf("%d\n",kth(root,k)); } else{ int x,y; sf("%d%d",&x,&y); int fx=Find(x),fy=Find(y); if(fx!=fy){ remove(root,cnt[fx]); remove(root,cnt[fy]); cnt[fx]+=cnt[fy]; fa[fx]=fy; insert(root,cnt[fx]); } } } } }
相关文章推荐
- POJ 2985 The k-th LargestGroup(Treap+并查集)
- POJ2985 The k-th Largest Group(treap+并查集)
- poj 2985 The k-th Largest Group (Treap+并查集)
- Treap树(并查集 + 树堆)POJ —— 2985 The k-th Largest Group
- POJ 2985 The k-th Largest Group [并差集+treap]
- POJ2985 The k-th Largest Group (并查集+treap)
- Poj 2985 The k-th Largest Group
- poj 2985 The k-th Largest Group(线段树+并查集)
- POJ 2985 The k-th Largest Group(树状数组 并查集/查找第k大的数)
- 树状数组从前往后求和,用来解第k大(或小)的数 poj 2985 The k-th Largest Group
- poj 2985 The k-th Largest Group (并查集x全局动态第k大)
- 树状数组从前往后求和,用来解第k大(或小)的数 poj 2985 The k-th Largest Group
- poj 2985 The k-th Largest Group 并查集+树状数组求第k大
- POJ 题目2985 The k-th Largest Group(线段树单点更新求第k大值,并查集)
- POJ 2985 The k-th Largest Group
- 树状数组从前往后求和,用来解第k大(或小)的数 poj 2985 The k-th Largest Group
- [poj-2985]The k-th Largest Group_Treap+并查集
- POJ 2985 The k-th Largest Group (树状数组学习)
- poj 2985 并查集+线段树 线段树求第k大数 The k-th Largest Group
- POJ2985 The k-th Largest Group