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 }
话说在写之前还搞了一波事情,有兴趣的话可以看这里……
233333333