您的位置:首页 > 其它

POJ 2985 The k-th LargestGroup(Treap+并查集)

2017-10-02 09:48 447 查看
wa了或者TLE了..

//#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]);
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: