zoukankan      html  css  js  c++  java
  • 树剖想法题——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
    ",(ans[i]+mod)%mod);
    112     return 0;
    113 }
  • 相关阅读:
    coco2dx--Permission denied
    在Winform中屏蔽UnityWebPlayer的右键以及自带Logo解决方案整理
    Setup Factory 程序打包
    T—SQL用法剪辑,方便以后查看
    如何用asp.net MVC框架、highChart库从sql server数据库获取数据动态生成柱状图
    微软ASP.NET MVC 学习地址
    一个用WPF做的简单计算器源代码
    wpMVVM模式绑定集合的应用
    windows phone上下文菜单ContextMenu的使用示例
    CListCtrl 防止闪烁,调整行显示长度
  • 原文地址:https://www.cnblogs.com/y-m-y/p/6727468.html
Copyright © 2011-2022 走看看