BZOJ 3720 gty的妹子树
块状树裸题
块状树:
首先对树进行分块,分出的每一块都是一个连通块
通常的分块的方式如下:
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的妹子树的更多相关文章
- 3720: Gty的妹子树
3720: Gty的妹子树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1440 Solved: 482[Submit][Status][Disc ...
- bzoj 3720: Gty的妹子树 块状树
3720: Gty的妹子树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 412 Solved: 153[Submit][Status] Descr ...
- bzoj 3720 Gty的妹子树 树分块?瞎搞
Gty的妹子树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2149 Solved: 781[Submit][Status][Discuss] D ...
- Gty的妹子树(bzoj 3720)
Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕…… Gty神(xian)犇(chong)从来不缺妹子…… 他来到了一棵妹子树下,发现每 ...
- BZOJ3720 Gty的妹子树
Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕…… Gty神(xian)犇(chong)从来不缺妹子…… 他来到了一棵妹子树下,发现每 ...
- [bzoj 3720] Gty的妹子树 (树上分块)
树上分块(块状树) Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕-- Gty神(xian)犇(chong)从来不缺妹子-- 他来到了 ...
- BZOJ 3720: Gty的妹子树 [树上size分块]
传送门 题意: 一棵树,询问子树中权值大于$k$的节点个数,修改点权值,插入新点:强制在线 一开始以为询问多少种不同的权值,那道CF的强制在线带修改版,直接吓哭 然后发现看错了这不一道树上分块水题.. ...
- 【块状树】bzoj3720 Gty的妹子树
块状树.教程见:http://z55250825.blog.163.com/blog/static/1502308092014163413858/将树按一定大小分块,分成许多子树,在每个子树的根节点记 ...
- BZOJ.3720.Gty的妹子树(树分块)
题目链接 洛谷上惨遭爆零是为什么.. 另外这个树分块算法是假的. /* 插入删除只涉及一个数,故每次可以枚举一遍,而不是重构完后sort */ #include<cmath> #inclu ...
随机推荐
- 9种jQuery和css3图片动画特效代码演示
1.自由旋转的jQuery图片 演示和下载地址 2.css3阴影动画效果 演示和下载地址 3.拉窗帘特效图片 演示和下载地址 4.css3文字特效动画 演示和下载地址 5.css3时钟代码 演示和下载 ...
- 扩展 delphi 线程 使之传递参数.
新delphi的线程TThread有了CreateAnonymousThread方法,如果再为它加一个可传递的参数不就更好了吗?代码如下: TAnonymousThreadX<T> = c ...
- 原始套接字的简单tcp包嗅探
原始套接字 sock_raw = socket(AF_INET , SOCK_RAW , IPPROTO_TCP); while(1) { data_size = recvfrom(sock_raw ...
- .NET开发作业调度(job scheduling) - Quartz.NET
Quartz.NET是JAVA Job Scheduling框架Quartz在.NET平台上的实现,可以满足小型乃至大型企业应用中的Job Scheduling. 通过Nuget安装Quartz.NE ...
- c指针提高
今天看了两章C语言,于是乎编段程序复习下. 还是不清楚这些神奇的东西的到底要干嘛用... 敲完后,显得这段代码高大上 但是,想实现这个程序,需要这么写的复杂吗?==|| #include & ...
- hdu 5720 BestCoder 2nd Anniversary Wool 推理+一维区间的并
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5720 题意:有n(n <= 105)个数 ,每个数小于等于 1018:问在给定的[L,R]区间中 ...
- Oracle中的通配符
这是scott用户下的EMP表 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 7369 SMITH CLERK 7902 1980/12/17 800 ...
- Java 包(package)详解
为了更好地组织类,Java提供了包机制,用于区别类名的命名空间. 包的作用 1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2 如同文件夹一样,包也采用了树形目录的存储方式.同一 ...
- Financial Management
Financial Management 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 Larry graduated this year and finally ...
- linux下php多版本的并存实现
其实最简单的方法,就是通过nginx,生成多个php使用不同的端口,这实在简单,我写了两个版本,一个是apche服务,一个是nginx服务,使用一两个不同的版本,爽!