• 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
    ");
     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
    ",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

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

  • 相关阅读:
    让HTML5来为你定位(转)
    Web开发者应知的URL编码知识(转)
    Web开发:URL编码与解码(转)
    用virtualenv建立多个Python独立开发环境(转)
    使用Ajax方式POST JSON数据包(转)
    俞敏洪:我和马云就差了8个字...(转)
    HTTP返回码中301与302的区别(转)
    Postgresql 正则表达式(转)
    【双十一狂欢,一触即发!】安全圈的学习节|绝对省钱攻略
    安全运维中基线检查的自动化之ansible工具巧用
  • 原文地址:https://www.cnblogs.com/hzoier/p/6613330.html
Copyright © 2020-2023  润新知