zoukankan      html  css  js  c++  java
  • bzoj3720: Gty的妹子树(树分块)

    传送门

    好珂怕……

    树分块是什么东西啊……感觉好暴力……

    直接贴一下好了->这里

      1 //minamoto
      2 #include<iostream>
      3 #include<cstdio>
      4 #include<vector>
      5 #include<cstring>
      6 #include<algorithm>
      7 using namespace std;
      8 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
      9 char buf[1<<21],*p1=buf,*p2=buf;
     10 template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
     11 inline int read(){
     12     #define num ch-'0'
     13     char ch;bool flag=0;int res;
     14     while(!isdigit(ch=getc()))
     15     (ch=='-')&&(flag=true);
     16     for(res=num;isdigit(ch=getc());res=res*10+num);
     17     (flag)&&(res=-res);
     18     #undef num
     19     return res;
     20 }
     21 char sr[1<<21],z[20];int C=-1,Z;
     22 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
     23 inline void print(int x){
     24     if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;
     25     while(z[++Z]=x%10+48,x/=10);
     26     while(sr[++C]=z[Z],--Z);sr[++C]='
    ';
     27 }
     28 const int N=60005,SIZE=305;
     29 int head[N],Next[N<<1],ver[N<<1],tot;
     30 inline void add(int u,int v){
     31     ver[++tot]=v,Next[tot]=head[u],head[u]=tot;
     32 }
     33 int n,m,cnt,w[N],bh[N],bt,fa[N],belong[N],bn[N<<1],bv[N<<1];
     34 struct Block{
     35     vector<int> a;
     36     Block(){a.clear();}
     37     inline void ins(int x){
     38         a.push_back(x);
     39         for(int i=a.size()-1;i;--i)
     40         if(a[i-1]>a[i]) swap(a[i-1],a[i]);else break;
     41     }
     42     inline void update(int x,int k){
     43         int pos=lower_bound(a.begin(),a.end(),x)-a.begin();
     44         a[pos]=k;
     45         for(int i=pos;i;--i)
     46         if(a[i-1]>a[i]) swap(a[i-1],a[i]);else break;
     47         for(int i=pos,s=a.size()-1;i<s;++i)
     48         if(a[i]>a[i+1]) swap(a[i],a[i+1]);else break;
     49     }
     50     inline int query(int x){
     51         return a.end()-upper_bound(a.begin(),a.end(),x);
     52     }
     53 }bl[N];
     54 inline void add_bl(int u,int v){
     55     bv[++bt]=v,bn[bt]=bh[u],bh[u]=bt;
     56 }
     57 void dfs(int u,int f){
     58     fa[u]=f;
     59     if(bl[belong[f]].a.size()==SIZE){
     60         belong[u]=++cnt;
     61         bl[cnt].ins(w[u]);
     62         add_bl(belong[f],cnt);
     63     }
     64     else{
     65         belong[u]=belong[f],bl[belong[u]].ins(w[u]);
     66     }
     67     for(int i=head[u];i;i=Next[i]){
     68         if(ver[i]!=f) dfs(ver[i],u);
     69     }
     70 }
     71 int dfsbl(int u,int k){
     72     int ans=bl[u].query(k);
     73     for(int i=bh[u];i;i=bn[i])
     74     ans+=dfsbl(bv[i],k);
     75     return ans;
     76 }
     77 int dfsans(int u,int k){
     78     int ans=w[u]>k?1:0;
     79     for(int i=head[u];i;i=Next[i]){
     80         int v=ver[i];
     81         if(v==fa[u]) continue;
     82         if(belong[v]==belong[u]) ans+=dfsans(v,k);
     83         else ans+=dfsbl(belong[v],k);
     84     }
     85     return ans;
     86 }
     87 int main(){
     88     //freopen("testdata.in","r",stdin);
     89     n=read();
     90     for(int i=1;i<n;++i){
     91         int u=read(),v=read();add(u,v),add(v,u);
     92     }
     93     for(int i=1;i<=n;++i) w[i]=read();
     94     dfs(1,0);
     95     m=read();
     96     int ans=0;
     97     while(m--){
     98         int opt=read(),u=read(),x=read();
     99         u^=ans,x^=ans;
    100         switch(opt){
    101             case 0:ans=dfsans(u,x);print(ans);break;
    102             case 1:bl[belong[u]].update(w[u],x);w[u]=x;break;
    103             case 2:{
    104                 w[++n]=x,add(u,n),fa[n]=u;
    105                 if(bl[belong[u]].a.size()==SIZE){
    106                     belong[n]=++cnt,bl[cnt].ins(w[n]);
    107                     add_bl(belong[u],cnt);
    108                 }
    109                 else{
    110                     belong[n]=belong[u],bl[belong[n]].ins(w[n]);
    111                 }
    112                 break;
    113             }
    114         }
    115     }
    116     Ot();
    117     return 0;
    118 }
  • 相关阅读:
    Fidder4 顶部提示 “The system proxy was changed,click to reenable fiddler capture”。
    redis 哨兵 sentinel master slave 连接建立过程
    虚拟点赞浏览功能的大数据量测试
    python基础练习题(题目 字母识词)
    python基础练习题(题目 回文数)
    python基础练习题(题目 递归求等差数列)
    python基础练习题(题目 递归输出)
    python基础练习题(题目 递归求阶乘)
    python基础练习题(题目 阶乘求和)
    python基础练习题(题目 斐波那契数列II)
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9574866.html
Copyright © 2011-2022 走看看