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 }
  • 相关阅读:
    题目:有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生一对兔子,假如兔子都不死,问M个月时兔子的数量,M为键盘读入的正整数。(请用java语言作答)
    无聊游戏随笔--学院篇
    Java数组冒泡,选择,插入三种常用排序法及自带的快速排序法
    js写年月日三级下拉列表框
    查询避免Unknown column ‘xxx’ in ‘where clause’
    MyEclipse运行web程序报错,先检查这几点!
    Servlet开发之中线程安全问题
    取消Eclipse等号、分号、空格代码自动补全
    try/catch、finally语句的执行顺序测试
    02-MySQL双机热备的搭建
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9574866.html
Copyright © 2011-2022 走看看