树剖想法题——BZOJ3626

本来是打算作为树剖练习的最后一题的,结果一直WA。

本来以为是自己写的太丑。

最后发现5w的数据

我开了10w的数组

然而有一个数组要×2

哦,好棒棒。

  1 #include<cstring>
  2 #include<cstdio>
  3 #include<cmath>
  4 #include<algorithm>
  5 #define foru(i,x,y) for(LL i=x;i<=y;i++)
  6 using namespace std;
  7 typedef int LL;
  8 const LL N=2e5;
  9 const LL mod=201314;
 10 struct edge{LL to,nxt;}e[2*N];
 11 struct node{LL s,t;}t[10*N];
 12 struct que{LL id,flag,p;}a[N];
 13 LL f[N],b[N],d[N],id[N],ans[N],siz[N],son[N],top[N],head[N],
 14    cnt,ne,n,m,nq,q[N];
 15     
 16 bool cmp(que a,que b){return a.p<b.p;}
 17     
 18 void add(LL a,LL b){
 19     e[++ne]=(edge){b,head[a]};head[a]=ne;
 20 }
 21     
 22 void dfs(LL k,LL fa,LL dep){
 23     f[k]=fa;d[k]=dep;siz[k]=1;son[k]=0;
 24     for(LL i=head[k];i;i=e[i].nxt){
 25         LL v=e[i].to;
 26         if(v==fa)continue;
 27         dfs(v,k,dep+1);
 28         siz[k]+=siz[v];
 29         if(siz[v]>siz[son[k]])son[k]=v;
 30     }
 31 }
 32     
 33 void build(LL k,LL tp){
 34     id[k]=++cnt;top[k]=tp;
 35     if(son[k])build(son[k],tp);
 36     for(LL i=head[k];i;i=e[i].nxt){
 37         LL v=e[i].to;
 38         if(v!=son[k]&&v!=f[k])build(v,v);
 39     }
 40 }
 41     
 42 #define mid ((L+R)>>1)
 43 #define ls (k<<1)
 44 #define rs ls+1
 45     
 46 void pd(LL k,LL L,LL R){
 47     t[k].s+=t[k].t*(R-L+1);
 48     if(t[k].s>=mod)t[k].s%=mod;
 49     t[ls].t+=t[k].t; t[rs].t+=t[k].t;
 50     t[k].t=0;
 51 }
 52     
 53 void pu(LL k,LL L,LL R){
 54     t[k].s=t[ls].s+t[rs].s;
 55     if(t[k].s>=mod)t[k].s%=mod;
 56 }
 57     
 58 void update(LL k,LL L,LL R,LL l,LL r,LL x){
 59     pd(k,L,R);
 60     if(r<L||l>R)return;
 61     if(l<=L&&R<=r){t[k].t+=x;return;}
 62     update(ls,L,mid,l,r,x); update(rs,mid+1,R,l,r,x);
 63     pd(ls,L,mid);pd(rs,mid+1,R);
 64     pu(k,L,R);
 65 }
 66     
 67 LL qur(LL k,LL L,LL R,LL l,LL r){
 68     pd(k,L,R);
 69     if(l>R||r<L)return 0;
 70     if(l<=L&&R<=r)return t[k].s;
 71     return qur(ls,L,mid,l,r)+qur(rs,mid+1,R,l,r);
 72 }
 73     
 74 LL get(LL x){
 75     LL ret=0;
 76     while(x){
 77         ret+=qur(1,1,cnt,id[top[x]],id[x]);
 78         if(ret>=mod)ret%=mod;
 79         x=f[top[x]];
 80     }
 81     return ret;
 82 }
 83     
 84 void change(LL x){
 85     while(x){
 86         update(1,1,cnt,id[top[x]],id[x],1);
 87         x=f[top[x]];
 88     }
 89 }
 90 int main(){
 91     LL x,l,r;
 92     scanf("%d%d",&n,&m);
 93     foru(i,2,n){
 94         scanf("%d",&x);x++;
 95         add(x,i);add(i,x);
 96     }
 97     foru(i,1,m){
 98         scanf("%d%d%d",&l,&r,&q[i]);q[i]++;
 99         a[++nq].p=l;a[nq].id=i;a[nq].flag=-1;
100         a[++nq].p=r+1;a[nq].id=i;a[nq].flag=1;
101     }
102     dfs(1,0,1);
103     build(1,1);
104     sort(a+1,a+1+nq,cmp);
105     LL j=0;
106     while(!a[j+1].p)j++;
107     foru(i,1,n){
108         change(i);
109         while(a[j+1].p==i)j++,ans[a[j].id]+=get(q[a[j].id])*a[j].flag;
110     }
111     foru(i,1,m)printf("%d\n",(ans[i]+mod)%mod);
112     return 0;
113 }

 

posted @ 2017-04-18 14:01  羊毛羊  阅读(260)  评论(0编辑  收藏  举报