• [BZOJ 3720][JZYZOJ 2016]gty的妹子树 强制在线 树分块/树套树


    jzyzoj的p2016

    先码着,强制在线的树分块或者树套树?关键是我树分块还在入门阶段树套树完全不会啊摔

     
    http://blog.csdn.net/jiangyuze831/article/details/41445003
    果然我除了抄代码什么也不会......树分块之类的东西完全不会计算复杂度.....
    似乎upper_bound非常浪费时间..所以更改的时候直接循环查找不然会超时......
    static这种东西不要胡乱用......如果在后面直接赋值会赋值不上........
    看代码就能想起来具体内容所以不需要那么详细解释了......
    树分块↓
      1 #include<cstdio>
      2 #include<cstring>
      3 #include<cmath>
      4 #include<iostream>
      5 #include<algorithm>
      6 #include<queue>
      7 #include<cstdlib>
      8 using namespace std;
      9 const int maxn=60010;
     10 int n,m;
     11 int lastans=0;
     12 int f[2*maxn]={};
     13 int ad=0;
     14 struct nod{
     15     int y;
     16     int next;
     17 }e[maxn*2];
     18 struct node{
     19     int num;
     20     int a[1010];
     21     inline int ask(int k){
     22         int fff=upper_bound(a+1,a+num+1,k)-a-1;
     23         return num-fff;
     24     }
     25 }blo[10010];
     26 struct no{
     27     int next[maxn];
     28     int ai[maxn];
     29     int head[maxn];
     30     int shu;
     31     inline void add(int x,int y){
     32         next[++shu]=head[x];
     33         ai[shu]=y;
     34         head[x]=shu;
     35     }
     36 }gre;
     37 int bel[maxn]={};
     38 int tail=0;
     39 int sz;
     40 int a[maxn]={},head[maxn]={};
     41 int tot=0;
     42 inline void init(int x,int y){
     43     e[++tail].next=head[x];
     44     e[tail].y=y;
     45     head[x]=tail;
     46 }
     47 void dfs(int x,int fa){
     48     int now=bel[x];
     49     blo[now].a[++blo[now].num]=a[x];
     50     f[x]=fa;
     51     for(int i=head[x];i;i=e[i].next){
     52         if(e[i].y==fa){
     53             continue;
     54         }
     55         if(blo[now].num<sz){
     56             bel[e[i].y]=now;
     57         }
     58         else{
     59             bel[e[i].y]=++tot;
     60         }
     61         if(bel[e[i].y]!=now){
     62             gre.add(now,bel[e[i].y]);
     63         }
     64         dfs(e[i].y,x);
     65     }
     66 }
     67 int coun(int x,int k){
     68     int ans=blo[x].ask(k);
     69     for(int i=gre.head[x];i;i=gre.next[i]){
     70         ans+=coun(gre.ai[i],k);
     71     }
     72     return ans;
     73 }
     74 int cnt(int x,int fa,int k){
     75     int ans=a[x]>k;
     76     for(int i=head[x];i;i=e[i].next){
     77         if(e[i].y==fa) continue;
     78         if(bel[e[i].y]==bel[x]){
     79             ans+=cnt(e[i].y,x,k);
     80         }
     81         else{
     82             ans+=coun(bel[e[i].y],k);
     83         }
     84     }
     85     return ans;
     86 }
     87 int main(){
     88     //freopen("wtf.in","r",stdin);
     89     //freopen("wtf.out","w",stdout);
     90     memset(e,0,sizeof(e));
     91     memset(blo,0,sizeof(blo));
     92     scanf("%d",&n);
     93     ad=n;
     94     int u,v;
     95     sz=(int)sqrt((double)n);
     96     for(int i=1;i<n;i++){
     97         scanf("%d%d",&u,&v);
     98         init(u,v);
     99         init(v,u);
    100     }
    101     for(int i=1;i<=n;i++){
    102         scanf("%d",&a[i]);
    103     }
    104     scanf("%d",&m);
    105     bel[1]=++tot;
    106     dfs(1,0);
    107     for(int i=1;i<=tot;++i){
    108         sort(blo[i].a+1,blo[i].a+blo[i].num+1);
    109     }
    110     for(int op,u,x,i=1;i<=m;++i){
    111         
    112         scanf("%d%d%d",&op,&u,&x);
    113         u^=lastans,x^=lastans;
    114         if(op==0){
    115             printf("%d
    ",lastans=cnt(u,f[u],x));
    116         }
    117         else if(op==1){
    118             int fr=bel[u];
    119             for(int i=1;i<=blo[fr].num;i++){
    120                 if(blo[fr].a[i]==a[u]){
    121                     blo[fr].a[i]=a[u]=x;
    122                 }
    123             }
    124             sort(blo[fr].a+1,blo[fr].a+1+blo[fr].num);
    125         }
    126         else{
    127             int fr=bel[u];
    128             a[++ad]=x;
    129             init(u,ad);
    130             f[ad]=u;
    131             if(blo[fr].num<sz){
    132                 bel[ad]=fr;
    133                 blo[fr].a[++blo[fr].num]=x;
    134                 sort(blo[fr].a+1,blo[fr].a+1+blo[fr].num);
    135             }
    136             else{
    137                 bel[ad]=++tot;
    138                 blo[bel[ad]].a[++blo[bel[ad]].num]=x;
    139                 gre.add(fr,bel[ad]);
    140             }
    141         }
    142     }
    143     return 0;
    144 }
    View Code

  • 相关阅读:
    组合数学练习
    floyd算法新理解
    图论练习
    GDOI2021 day2总结
    P3190 [HNOI2007]神奇游乐园
    P1932 A+B A-B A*B A/B A%B Problem
    P2289 [HNOI2004]邮递员
    P5056 【模板】插头dp
    P4323 [JSOI2016]独特的树叶
    CF1153D Serval and Rooted Tree
  • 原文地址:https://www.cnblogs.com/137shoebills/p/7783768.html
Copyright © 2020-2023  润新知