块状树裸题

块状树:

首先对树进行分块,分出的每一块都是一个连通块

通常的分块的方式如下:

1、父亲所在块不满,分到父亲所在块中

2、父亲所在块满,自己单独开一个块

(貌似有更为优越的分块方式?

注意这是不严格的分块,即每个块的大小不一定都是设定的阈值blo

对于这道题,首先修改和添加直接块内暴力就可以了

对于询问,首先我们对每个块排序,块不完全在询问子树内的单点询问,块完全在询问子树内的块内二分

分块真是骗分利器,但是块状树最大的缺点是容易被菊花树卡住

(貌似修改和添加可以去掉一个log,但是我太弱了,并不想写)

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std; const int oo=0x7fffffff;
const int maxn=;
int n,m,u,v,f,ans,tot,blo;
int pos[maxn],fa[maxn],w[maxn];
int a[][],cnt[];
struct Graph{
int h[maxn],next[maxn],to[maxn],sum;
void add(int x,int y){++sum;next[sum]=h[x];h[x]=sum;to[sum]=y;}
}G,T;
void read(int &num){
num=;char ch=getchar();
while(ch<'!')ch=getchar();
while(ch>=''&&ch<='')num=num*+ch-'',ch=getchar();
}
bool cmp(const int &i,const int &j){return i>j;}
void check_block(int u){
int k=pos[fa[u]];
if(cnt[k]==blo){
pos[u]=++tot;a[tot][]=oo;
a[tot][++cnt[tot]]=w[u];
T.add(k,tot);
}else a[k][++cnt[k]]=w[u],pos[u]=k;
for(int i=G.h[u];i;i=G.next[i]){
if(G.to[i]==fa[u])continue;
fa[G.to[i]]=u;
check_block(G.to[i]);
}return;
}
int Get_pos(int u){
int L=,R=cnt[u];
while(L<R){
int mid=L+((R-L+)>>);
if(a[u][mid]>v)L=mid;
else R=mid-;
}return L;
}
void Get_block(int u){
ans+=Get_pos(u);
for(int i=T.h[u];i;i=T.next[i])Get_block(T.to[i]);
}
void Get_ask(int u){
if(w[u]>v)ans++;
for(int i=G.h[u];i;i=G.next[i]){
if(G.to[i]==fa[u])continue;
if(pos[G.to[i]]==pos[u])Get_ask(G.to[i]);
else Get_block(pos[G.to[i]]);
}return;
}
void Get_insert(int u,int k){
pos[u]=k;w[u]=v;a[k][++cnt[k]]=v;
sort(a[k]+,a[k]+cnt[k]+,cmp);
}
void Get_modify(int u){
int k=pos[u];
for(int i=;i<=cnt[k];++i){
if(a[k][i]==w[u]){a[k][i]=v;break;}
}
w[u]=v;
sort(a[k]+,a[k]+cnt[k]+,cmp);
} int main(){
read(n);
for(int i=;i<n;++i){
read(u);read(v);
G.add(u,v);G.add(v,u);
}
for(int i=;i<=n;++i)read(w[i]);
blo=(int)(sqrt(n));
fa[]=;pos[]=;tot=;
check_block();
for(int i=;i<=tot;++i)sort(a[i]+,a[i]+cnt[i]+,cmp);
//for(int i=1;i<=n;++i)cout<<pos[i]<<endl;
//cout<<endl;
read(m);
while(m--){
read(f);read(u);read(v);
u^=ans;v^=ans;
if(f==){
ans=;
Get_ask(u);
printf("%d\n",ans);
}else if(f==){
n++;fa[n]=u;G.add(u,n);
if(cnt[pos[u]]==blo){
pos[n]=++tot;w[n]=v;a[tot][]=oo;
a[tot][++cnt[tot]]=w[n];
T.add(pos[u],tot);
}else Get_insert(n,pos[u]);
}else Get_modify(u);
}return ;
}

gty的妹子树

BZOJ 3720 gty的妹子树的更多相关文章

  1. 3720: Gty的妹子树

    3720: Gty的妹子树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1440  Solved: 482[Submit][Status][Disc ...

  2. bzoj 3720: Gty的妹子树 块状树

    3720: Gty的妹子树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 412  Solved: 153[Submit][Status] Descr ...

  3. bzoj 3720 Gty的妹子树 树分块?瞎搞

    Gty的妹子树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2149  Solved: 781[Submit][Status][Discuss] D ...

  4. Gty的妹子树(bzoj 3720)

    Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕…… Gty神(xian)犇(chong)从来不缺妹子…… 他来到了一棵妹子树下,发现每 ...

  5. BZOJ3720 Gty的妹子树

    Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕…… Gty神(xian)犇(chong)从来不缺妹子…… 他来到了一棵妹子树下,发现每 ...

  6. [bzoj 3720] Gty的妹子树 (树上分块)

    树上分块(块状树) Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕-- Gty神(xian)犇(chong)从来不缺妹子-- 他来到了 ...

  7. BZOJ 3720: Gty的妹子树 [树上size分块]

    传送门 题意: 一棵树,询问子树中权值大于$k$的节点个数,修改点权值,插入新点:强制在线 一开始以为询问多少种不同的权值,那道CF的强制在线带修改版,直接吓哭 然后发现看错了这不一道树上分块水题.. ...

  8. 【块状树】bzoj3720 Gty的妹子树

    块状树.教程见:http://z55250825.blog.163.com/blog/static/1502308092014163413858/将树按一定大小分块,分成许多子树,在每个子树的根节点记 ...

  9. BZOJ.3720.Gty的妹子树(树分块)

    题目链接 洛谷上惨遭爆零是为什么.. 另外这个树分块算法是假的. /* 插入删除只涉及一个数,故每次可以枚举一遍,而不是重构完后sort */ #include<cmath> #inclu ...

随机推荐

  1. Linux 如何设置只允许域名访问站点而禁止IP访问站点

    最近在论坛里看到有人问到 Linux 如何设置只允许域名访问站点而禁止IP访问站点的问题,之前自己也用过这个功能,可以防止别人用 IP 地址来访问到自己的网站,下面我就我自己的环境给出解决方法,我用的 ...

  2. 2013-07-23 IT 要闻速记快想

    ### ========================= ###苹果的新动向今天华尔街日报称,苹果正在测试13英寸的大号iPad,以及更大屏幕的iPhone.而早在五月份,韩国资讯网站 ET New ...

  3. 拥抱ARM妹纸第二季 之 第一次 点亮太阳

    上次做鱼缸LED灯时还有很多材料正好拿来用.穆等等哥- 俺去找材料. 材料列表     3W LED   x  3     散热片     x  1     恒流IC     x  1     其他零 ...

  4. Java String.split()注意点

    //String[] aa = "aaa|bbb|ccc".split("|");//错误 String[] aa = "aaa|bbb|ccc&qu ...

  5. iOS 进阶 第九天(0408)

    0408 makekeyAndVisible解释 一个程序可以有多个Window,但只有一个窗口能够成为主窗口.如图中所示,此时的window2是主窗口.主窗口用处大了.从iOS7开始无论是主窗口还是 ...

  6. 深入理解用mysql_fetch_row()以数组的形式返回查询结果

    同mysql_result()一样,mysql_fetch_row()也可以用来获取查询结果集,其区别在于函数的返回值不是一个字符串,而是一个数组.函数定义如下. 复制代码 代码如下: array m ...

  7. JavaScript判断闰年

    <html><head>   <meta http-equiv="content-type" content="text/html;char ...

  8. WPF 多线程处理(3)

    WPF 多线程处理(1) WPF 多线程处理(2) WPF 多线程处理(3) WPF 多线程处理(4) WPF 多线程处理(5) WPF 多线程处理(6) 首先我们需要几个属性来保存取得的数据,因为在 ...

  9. 无法将 flash.display::Sprite@156b7b1 转换为 mx.core.IUIComponent

    无法将 flash.display::Sprite@156b7b1 转换为 mx.core.IUIComponent 在Flex Application里,是不能直接用addChild添加Sprite ...

  10. Jquery 判断浏览器类型

    $(function() { //FireFox2及以上 if ($.browser.MozillaSideBar && $.browser.version >= "1 ...