3720: Gty的妹子树
3720: Gty的妹子树
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 1440 Solved: 482
[Submit][Status][Discuss]
Description
我曾在弦歌之中听过你,
檀板声碎,半出折子戏。
舞榭歌台被风吹去,
岁月深处尚有余音一缕……
Gty神(xian)犇(chong)从来不缺妹子……
他来到了一棵妹子树下,发现每个妹子有一个美丽度……
由于Gty很哲♂学,他只对美丽度大于某个值的妹子感兴趣。
他想知道某个子树中美丽度大于k的妹子个数。
某个妹子的美丽度可能发生变化……
树上可能会出现一只新的妹子……
维护一棵初始有n个节点的有根树(根节点为1),树上节点编号为1-n,每个点有一个权值wi。
支持以下操作:
0 u x 询问以u为根的子树中,严格大于x的值的个数。(u^=lastans,x^=lastans)
1 u x 把u节点的权值改成x。(u^=lastans,x^=lastans)
2 u x 添加一个编号为"当前树中节点数+1"的节点,其父节点为u,其权值为x。(u^=lastans,x^=lastans)
最开始时lastans=0。
Input
输入第一行包括一个正整数n(1<=n<=30000),代表树上的初始节点数。
接下来n-1行,每行2个整数u,v,为树上的一条无向边。
任何时刻,树上的任何权值大于等于0,且两两不同。
接下来1行,包括n个整数wi,表示初始时每个节点的权值。
接下来1行,包括1个整数m(1<=m<=30000),表示操作总数。
接下来m行,每行包括三个整数 op,u,v:
op,u,v的含义见题目描述。
保证题目涉及的所有数在int内。
Output
对每个op=0,输出一行,包括一个整数,意义见题目描述。
Sample Input
1 2
10 20
1
0 1 5
Sample Output
HINT
Source
分析:
这个SIZE值要注意,由于有二分操作,所以大小定为2.0*sqrt(n)*log2(n)比较好,而不是sqrt(n),证明略。
加点的时候,分两种情况讨论,
1.如果x节点所在块的数量还没有达到最大值,那就把y节点加进去,然后对整个序列快排。
2.如果达到了最大的值,就新建一个块。
最后询问的时候,由于每一次操作之后块里存的数组都是有序的,因此查找只需要二分。
写两个递归的query函数,在不整的块中暴力查找,在整的块中二分查找
g:存储树的形态
block:储存属于root的子树,且超过SIZE,另行分块的节点
g.del[i]:i边是否已重复,保证块外往块内转移不会出错
然后看代码
luogu's #1&&cogs's #1&&bzoj's #3 (id:bbsh)
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const int N=6e4+,M=N<<;
int n,m,last,size[N],sum,SIZE,w[N],top[N];
struct node{
int v[M],next[M],head[M],tot;
bool del[M];
inline void add(int x,int y){
v[++tot]=y;next[tot]=head[x];head[x]=tot;
}
}g,block,linked;
vector<int>list[N];
inline void init(int u,int f){
int root=top[u];
list[root].push_back(w[u]);
for(int i=g.head[u];i;i=g.next[i]){
if(g.v[i]==f){g.del[i]=;continue;}
if(size[root]<SIZE)
size[root]++,top[g.v[i]]=root;
else
block.add(root,g.v[i]);
init(g.v[i],u);
}
}
inline void query_block(int u,int x){
sum+=list[u].end()-upper_bound(list[u].begin(),list[u].end(),x);
for(int i=block.head[u];i;i=block.next[i])
query_block(block.v[i],x);
}
inline void query_out_board(int u,int x){
if(w[u]>x) sum++;
for(int i=g.head[u];i;i=g.next[i]){
if(g.del[i]) continue;
if(top[u]==top[g.v[i]])
query_out_board(g.v[i],x);
else
query_block(g.v[i],x);
}
}
int main(){
#ifndef online_judge
freopen("gtygirltree.in","r",stdin);
freopen("gtygirltree.out","w",stdout);
#endif
n=read();
SIZE=(int)ceil(2.0*sqrt(n)*log2(n));
for(int i=,x,y;i<n;i++){
x=read();y=read();
g.add(x,y);g.add(y,x);
}
for(int i=;i<=n;i++) w[i]=read(),top[i]=i,size[i]=;
init(,);
for(int i=;i<=n;i++) if(top[i]==i) sort(list[i].begin(),list[i].end());
m=read(),last=;
for(int opt,u,x,tp;m--;){
opt=read();u=read()^last;x=read()^last;
if(!opt){
sum=;
if(u==top[u])
query_block(u,x);
else
query_out_board(u,x);
printf("%d\n",last=sum);
}
else if(opt==){
tp=top[u];
list[tp].erase(lower_bound(list[tp].begin(),list[tp].end(),w[u]));
list[tp].insert(lower_bound(list[tp].begin(),list[tp].end(),x),x);
w[u]=x;
}
else{
w[++n]=x;
tp=top[u];
g.add(u,n);
if(size[tp]<SIZE){
top[n]=tp;
size[tp]++;
list[tp].insert(lower_bound(list[tp].begin(),list[tp].end(),x),x);
}
else{
top[n]=n;
size[u]=;
list[n].push_back(x);
block.add(tp,n);
}
}
}
return ;
}
3720: Gty的妹子树的更多相关文章
- BZOJ 3720 gty的妹子树
块状树裸题 块状树: 首先对树进行分块,分出的每一块都是一个连通块 通常的分块的方式如下: 1.父亲所在块不满,分到父亲所在块中 2.父亲所在块满,自己单独开一个块 (貌似有更为优越的分块方式? 注意 ...
- Gty的妹子树(bzoj 3720)
Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕…… Gty神(xian)犇(chong)从来不缺妹子…… 他来到了一棵妹子树下,发现每 ...
- BZOJ3720 Gty的妹子树
Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕…… Gty神(xian)犇(chong)从来不缺妹子…… 他来到了一棵妹子树下,发现每 ...
- 【块状树】bzoj3720 Gty的妹子树
块状树.教程见:http://z55250825.blog.163.com/blog/static/1502308092014163413858/将树按一定大小分块,分成许多子树,在每个子树的根节点记 ...
- 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 ...
- BZOJ 3731: Gty的超级妹子树
3731: Gty的超级妹子树 Time Limit: 7 Sec Memory Limit: 32 MBSubmit: 346 Solved: 96[Submit][Status][Discus ...
- [bzoj 3720] Gty的妹子树 (树上分块)
树上分块(块状树) Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕-- Gty神(xian)犇(chong)从来不缺妹子-- 他来到了 ...
- bzoj3731: Gty的超级妹子树
一代神题啊orz(至少是以前年代的神题吧) 块状树 复杂度nsqrtnlogn 真是exciting 还没有卡时限 话不多说直接上代码 (最近解锁了记事本写代码的技能...感觉越来越依赖OJ调试了.. ...
随机推荐
- EventBus 3.0: 入门使用及其使用 完全解析
前言 EventBus是greenrobot再Android平台发布的以订阅-发布模式为核心的开源库. EventBus翻译过来是事件总线意思.可以这样理解:一个个(event)发送到总线上, 然后E ...
- Codeforces 506D Mr. Kitayuta's Colorful Graph(分块 + 并查集)
题目链接 Mr. Kitayuta's Colorful Graph 把每种颜色分开来考虑. 所有的颜色分为两种:涉及的点的个数 $> \sqrt{n}$ 涉及的点的个数 $<= ...
- 余秋雨的话(与OI无关)
余秋雨的话 1.假如你想要一件东西,就放它走.它若能回来找你,就永远属于你:它若不回来,那根本就不是你的. 2. 一个人会落泪,是因为痛:一个人之所以痛,是因为在乎:一个人之所以在乎,是因为有感觉:一 ...
- OS | 死锁
死锁的四个条件 互斥 占用等待 非剥夺 循环等待 死锁的解决方案 死锁预防 间接预防:防止前三个条件中的任何一个的发生 直接预防:防止循环等待的发生 死锁避免 进程启动拒绝:不启动任何一个可能发生死锁 ...
- Algorithm | Sort
Bubble sort Bubble sort, sometimes incorrectly referred to as sinking sort, is a simple sorting algo ...
- Codeforces Round #324 (Div. 2) Marina and Vasya 乱搞推理
原题链接:http://codeforces.com/contest/584/problem/C 题意: 定义$f(s1,s2)$为$s1,s2$不同的字母的个数.现在让你构造一个串$s3$,使得$f ...
- flannel无法跨主机ping通容器的解决方式
前几天,出现了无法跨主机ping通容器的情况,导致一个node机网络中断,无法访问,排查过程如下. 首先确认,宿主机node2是可以ping通容器 [root@node2 ~]# ping 10.1. ...
- 左手系,右手系,row major, column major
http://www.cnblogs.com/minggoddess/p/3672863.html dx 左手系 row major ogl 右手系 column major 差了个 matrix ...
- 解决Linux下AES解密失败
前段时间,用了个AES加密解密的方法,详见上篇博客AES加密解密. 加解密方法在window上測试的时候没有出现不论什么问题.将加密过程放在安卓上.解密公布到Linuxserver的时候,安卓将加密的 ...
- Nginx学习——Nginx进程间的通信
nginx进程间的通信 进程间消息传递 共享内存 共享内存还是Linux下提供的最主要的进程间通信方式,它通过mmap和shmget系统调用在内存中创建了一块连续的线性地址空间,而通过munmap或者 ...