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

2
1 2
10 20
1
0 1 5

Sample Output

2

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的妹子树的更多相关文章

  1. BZOJ 3720 gty的妹子树

    块状树裸题 块状树: 首先对树进行分块,分出的每一块都是一个连通块 通常的分块的方式如下: 1.父亲所在块不满,分到父亲所在块中 2.父亲所在块满,自己单独开一个块 (貌似有更为优越的分块方式? 注意 ...

  2. Gty的妹子树(bzoj 3720)

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

  3. BZOJ3720 Gty的妹子树

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

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

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

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

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

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

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

  7. BZOJ 3731: Gty的超级妹子树

    3731: Gty的超级妹子树 Time Limit: 7 Sec  Memory Limit: 32 MBSubmit: 346  Solved: 96[Submit][Status][Discus ...

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

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

  9. bzoj3731: Gty的超级妹子树

    一代神题啊orz(至少是以前年代的神题吧) 块状树 复杂度nsqrtnlogn 真是exciting 还没有卡时限 话不多说直接上代码 (最近解锁了记事本写代码的技能...感觉越来越依赖OJ调试了.. ...

随机推荐

  1. react Native 运行报错之一 gradle-2.14.1-all解压失败的问题

    在react-native run-android  时 可能出现压缩包不成功的情况,原因是压缩包失败,需要手动解压到相应目录, 目录:C:\Users\Administrator\.gradle\w ...

  2. ASP.NET MVC生成静态页面

    1.先付上封装好生成静态页的原代码: public class Common { #region 获取模板页的Html代码 /// <summary> /// 获取页面的Html代码 // ...

  3. mysql数据库基本操作(六)

    外键约束 创建外键 前面讲的表单查询都是一张表,但项目中表与表之间是有关联的,比如我们创建的学生表,他们可能在不同班级,不同班级有不同的班主任,他们之间的关系大概是这样的:每一个班主任会对应多个学生 ...

  4. 笔记-迎难而上之Java基础进阶7

    序列化流 把对象以流的方式写入到文件中保存,叫做对象的序列化 把文件中保存的对象,以流的方式读取出来,叫做对象大反序列化 对象的序列化流_ObjectOutputtream继承自OutputStrea ...

  5. JS版汉字与拼音互转终极方案,附简单的JS拼音

    前言 网上关于JS实现汉字和拼音互转的文章很多,但是比较杂乱,都是互相抄来抄去,而且有的不支持多音字,有的不支持声调,有的字典文件太大,还比如有时候我仅仅是需要获取汉字拼音首字母却要引入200kb的字 ...

  6. centos中httpd Server not started: (13)Permission denied: make_sock: could not bind to address [::]:8888

    Install semanage tools: sudo yum -y install policycoreutils-python Allow port 88 for httpd: sudo sem ...

  7. Android Studio +MAT 分析内存泄漏实战

    对于内存泄漏,在Android中如果不注意的话,还是很容易出现的,尤其是在Activity中,比较容易出现,下面我就说下自己是如何查找内存泄露的. 首先什么是内存泄漏? 内存泄漏就是一些已经不使用的对 ...

  8. android 内存泄漏出现的情况

    非静态内部类的静态实例由于内部类默认持有外部类的引用,而静态实例属于类.所以,当外部类被销毁时,内部类仍然持有外部类的引用,致使外部类无法被GC回收.因此造成内存泄露. 类的静态变量持有大数据对象静态 ...

  9. PS中把图片白色背景变成透明的方法

    用魔术橡皮擦擦去白色(调整容差,取消连续,点选白色部分),保存成png格式

  10. Flutter开发记录part2

    (1)文本超出折叠:child: Text('跑马灯dddd的范德萨范德萨放多少范德萨范德萨范德萨范德萨范德萨发',maxLines: 1,overflow: TextOverflow.ellipsi ...