块状树裸题

块状树:

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

通常的分块的方式如下:

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. Objective-C中字典的使用方法总结

    在Objective-C中提供了两个类来实现字典,即NSDictionary和NSMutableDictionary.其中,NSMutableDictionary是NSDictionary的子类,它继 ...

  2. linux terminal 日常shell

    1 ubuntu中如何将终端添加到右键 /home/cui/.local/share/nautilus/scripts #!/bin/bash #cd $NAUTILUS_SCRIPT_CURRENT ...

  3. Linux C 程序 GTK+图形界面编程(22)

    GTK+图形界面编程 Linux大多是在字符界面,但也可以开发图形界面 目前已经存在多种Linux下开发图形界面的程序开发包:最常用的是Qt和GTK+ Qt是一个跨平台的图形界面开发库,不仅仅支持Li ...

  4. 【Qt】Qt国际化(系统文本-QMessageBox按钮、QLineEdit右键菜单等)【转】

    简介 使用Qt的时候,经常会遇到英文问题,例如:QMessageBox中的按钮.QLineEdit.QSpinBox.QScrollBar中的右键菜单等.通常情况下,我们软件都不会是纯英文的,那么如何 ...

  5. C# WinForm设置TreeView选中节点

    这里假定只有两级节点,多级方法类似.遍历节点,根据选中节点文本找到要选中的节点.treeView.SelectedNode = selectNode; /// <summary> /// ...

  6. 例题6-8 Tree Uva548

    这道题我一直尝试用scanf来进行输入,不过一直没有成功,因此先搁置一下,以后积累些知识再进行尝试. 这道题有两种解决方案: 即先建树,再遍历和边建树边遍历.这两种方案经过实践证实效率相差不太多.应该 ...

  7. Ubuntu16.04.1 安装MyCat

    Mycat是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而Mycat并没有存储引擎,所以并不是完全意义的分布式数据库系统. 安装Java环境,配置全局环境变量 MyCAT是使用JAV ...

  8. DataSnap如何监控Tcp/IP客户端的连接情况

    一个实例,如果客户端是TCP/IP是短连接的情况就没有必要了. 一.GlobVar.pas单元,定义应用系统全局数据类型及变量: unit GlobVar; interface uses System ...

  9. Linux驱动开发之开篇--HelloWorld

    Linux驱动的编写,大致分为两个过程,第一个过程为测试阶段,即为某一具体的设备,添加必要的驱动模块,为了节省编译时间,需要将代码单独放在一处,在编译时,只需要要调用内核的头文件即可:第二个过程为布置 ...

  10. zip压缩包密码破解

    有一种破解方法叫做Known plaintext attack.市面上的密码破解软件几乎都带有这个功能.操作方法就是找到加密压缩包中的任意一个文件,用同样的压缩软件同样的压缩方式压缩成一个不加密的包, ...