Wc2014 紫荆花之恋

传送门

终于把心头大恨切掉了……

不知道为啥以前的代码交到UOJ上会MLE……今天下午重写了一遍,然后就过了……(然而并不知道究竟发生了什么……)

这次是用bfs写的,果然bfs就是比dfs快啊……

http://uoj.ac/submission/138458

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<vector>
  5 #include<queue>
  6 using namespace std;
  7 const int maxn=100010,maxk=50;
  8 const double alpha=0.75;
  9 struct node{
 10     static inline int randint(){
 11         static int a=12132,b=233333333,p=998244353,x=666666666;
 12         x=a*x+b;x%=p;
 13         return x<0?(x+=p):x;
 14     }
 15     int key,size,p;
 16     node *ch[2];
 17     node(int k):key(k),size(1),p(randint()){}
 18     inline void refresh(){size=ch[0]->size+ch[1]->size+1;}
 19 }*null=new node(0),*root[maxn],*root1[maxn][maxk];
 20 void addnode(int,int);
 21 void destroy(int);
 22 void rebuild(int,int,int);
 23 int getcenter(int,int);
 24 void getdis(int,int,int);
 25 node *newnode(int);
 26 void delnode(node*);
 27 void insert(int,node*&);
 28 int order(int,node*);
 29 void destroy(node*);
 30 void rot(node*&,int);
 31 queue<node*>freenodes;
 32 vector<int>G[maxn],W[maxn];
 33 int p[maxn],depth[maxn],d[maxn][maxk],id[maxn][maxk];
 34 int size[maxn],siz[maxn][maxk],q[maxn];
 35 bool vis[maxn]={false};
 36 long long ans=0;
 37 int n,w[maxn],c;
 38 int main(){
 39     null->size=0;
 40     null->ch[0]=null->ch[1]=null;
 41     scanf("%*d%d",&n);
 42     for(int i=0;i<=n;i++){
 43         root[i]=null;
 44         fill(root1[i],root1[i]+maxk,null);
 45     }
 46     scanf("%*d%*d%d",&w[1]);
 47     vis[1]=true;
 48     size[1]=1;
 49     insert(-w[1],root[1]);
 50     printf("0\n");
 51     for(int i=2;i<=n;i++){
 52         scanf("%d%d%d",&p[i],&c,&w[i]);
 53         p[i]^=(ans%1000000000);
 54         G[i].push_back(p[i]);
 55         W[i].push_back(c);
 56         G[p[i]].push_back(i);
 57         W[p[i]].push_back(c);
 58         addnode(i,c);
 59         printf("%lld\n",ans);
 60     }
 61     return 0;
 62 }
 63 void addnode(int x,int c){
 64     depth[x]=depth[p[x]]+1;
 65     size[x]=1;
 66     vis[x]=true;
 67     insert(-w[x],root[x]);
 68     int rt=0;
 69     for(int u=p[x],k=depth[x]-1;u;u=p[u],k--){
 70         d[x][k]=d[p[x]][k]+c;
 71         id[x][k]=id[p[x]][k]?id[p[x]][k]:x;
 72         ans+=order(w[x]-d[x][k]+1,root[u])-order(w[x]-d[x][k]+1,root1[id[x][k]][k]);
 73         insert(d[x][k]-w[x],root[u]);
 74         insert(d[x][k]-w[x],root1[id[x][k]][k]);
 75         size[u]++;
 76         siz[id[x][k]][k]++;
 77         if(siz[id[x][k]][k]>size[u]*alpha+5)rt=u;
 78     }
 79     if(rt){
 80         destroy(rt);
 81         rebuild(rt,size[rt],p[rt]);
 82     }
 83 }
 84 void destroy(int x){
 85     int head=0,tail=0;
 86     q[tail++]=x;
 87     vis[x]=false;
 88     while(head!=tail){
 89         x=q[head++];
 90         destroy(root[x]);
 91         root[x]=null;
 92         for(int i=depth[q[0]];i<=depth[x];i++){
 93             destroy(root1[x][i]);
 94             root1[x][i]=null;
 95             d[x][i]=id[x][i]=siz[x][i]=0;
 96         }
 97         for(int i=0;i<(int)G[x].size();i++)if(vis[G[x][i]]&&depth[G[x][i]]>=depth[q[0]]){
 98             vis[G[x][i]]=false;
 99             q[tail++]=G[x][i];
100         }
101     }
102 }
103 void rebuild(int x,int s,int pr){
104     x=getcenter(x,s);
105     vis[x]=true;
106     p[x]=pr;
107     depth[x]=depth[pr]+1;
108     size[x]=s;
109     insert(-w[x],root[x]);
110     for(int i=0;i<(int)G[x].size();i++)if(!vis[G[x][i]]){
111         p[G[x][i]]=x;
112         d[G[x][i]][depth[x]]=W[x][i];
113         getdis(G[x][i],x,depth[x]);
114     }
115     for(int i=0;i<(int)G[x].size();i++)if(!vis[G[x][i]])rebuild(G[x][i],size[G[x][i]],x);
116 }
117 int getcenter(int x,int s){
118     int head=0,tail=0;
119     q[tail++]=x;
120     while(head!=tail){
121         x=q[head++];
122         size[x]=1;
123         for(int i=0;i<(int)G[x].size();i++)if(!vis[G[x][i]]&&G[x][i]!=p[x]){
124             p[G[x][i]]=x;
125             q[tail++]=G[x][i];
126         }
127     }
128     for(int i=s-1;i;i--)size[p[q[i]]]+=size[q[i]];
129     x=q[0];
130     for(;;){
131         bool ok=false;
132         for(int i=0;i<(int)G[x].size();i++)if(!vis[G[x][i]]&&G[x][i]!=p[x]&&(size[G[x][i]]<<1)>s){
133             x=G[x][i];
134             ok=true;
135             break;
136         }
137         if(!ok)break;
138     }
139     return x;
140 }
141 void getdis(int x,int rt,int k){
142     int head=0,tail=0;
143     q[tail++]=x;
144     while(head!=tail){
145         x=q[head++];
146         size[x]=1;
147         id[x][k]=q[0];
148         insert(d[x][k]-w[x],root[rt]);
149         insert(d[x][k]-w[x],root1[q[0]][k]);
150         for(int i=0;i<(int)G[x].size();i++)if(!vis[G[x][i]]&&G[x][i]!=p[x]){
151             p[G[x][i]]=x;
152             d[G[x][i]][k]=d[x][k]+W[x][i];
153             q[tail++]=G[x][i];
154         }
155     }
156     for(int i=tail-1;i;i--)size[p[q[i]]]+=size[q[i]];
157     siz[q[0]][k]=size[q[0]];
158 }
159 node *newnode(int k){
160     node *x;
161     if(freenodes.empty())x=new node(k);
162     else{
163         x=freenodes.front();
164         freenodes.pop();
165         *x=node(k);
166     }
167     return x;
168 }
169 inline void delnode(node *x){freenodes.push(x);}
170 void insert(int x,node *&rt){
171     if(rt==null){
172         rt=newnode(x);
173         rt->ch[0]=rt->ch[1]=null;
174         return;
175     }
176     int d=x>rt->key;
177     insert(x,rt->ch[d]);
178     rt->refresh();
179     if(rt->ch[d]->p<rt->p)rot(rt,d^1);
180 }
181 int order(int x,node *rt){
182     int ans=0,d;
183     while(rt!=null){
184         if((d=x>rt->key))ans+=rt->ch[0]->size+1;
185         rt=rt->ch[d];
186     }
187     return ans;
188 }
189 void destroy(node *x){
190     if(x==null)return;
191     destroy(x->ch[0]);
192     destroy(x->ch[1]);
193     delnode(x);
194 }
195 void rot(node *&x,int d){
196     node *y=x->ch[d^1];
197     x->ch[d^1]=y->ch[d];
198     y->ch[d]=x;
199     x->refresh();
200     (x=y)->refresh();
201 }
View Code

话说在写之前还搞了一波事情,有兴趣的话可以看这里……

posted @ 2017-03-24 20:44  AntiLeaf  阅读(233)  评论(0编辑  收藏  举报