Gty的妹子树(bzoj 3720)
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
- /*
- 刚开始打算在dfs序上搞事情,然后发现不会动态维护,所以只能树上分块。
- 先搞出一个块长len,在dfs时,超过这个len就重新划分一块,维护块之间的连通性。
- 添加的时候可以超过len就更新一块新的,但是由于懒的写,所以直接添加的,导致跑到了10000+。
- */
- #include<cstdio>
- #include<iostream>
- #include<vector>
- #include<algorithm>
- #include<cmath>
- #define N 60010
- using namespace std;
- int w[N],head[N],fa[N],dep[N],bl[N],size[N],ind[N],vis[N],n,m,cnt,len;
- struct node{int v,pre;}e[N*];
- vector<int> g[N],blo[N];
- void add(int u,int v){
- e[++cnt].v=v;
- e[cnt].pre=head[u];
- head[u]=cnt;
- }
- void dfs(int x){
- for(int i=head[x];i;i=e[i].pre){
- if(e[i].v==fa[x]) continue;
- fa[e[i].v]=x;dep[e[i].v]=dep[x]+;
- if(size[x]<len) size[bl[e[i].v]=bl[x]]++;
- else {
- g[bl[x]].push_back(bl[e[i].v]);
- g[bl[e[i].v]].push_back(bl[x]);
- }
- dfs(e[i].v);
- }
- }
- int query(int x,int y){
- int ans=;
- if(bl[x]==x){
- ans+=blo[x].end()-upper_bound(blo[x].begin(),blo[x].end(),y);
- for(int i=;i<g[bl[x]].size();i++){
- int v=g[bl[x]][i];
- if(dep[v]<dep[x]) continue;
- ans+=query(v,y);
- }
- return ans;
- }
- else {
- ans+=w[x]>y;
- for(int i=head[x];i;i=e[i].pre){
- if(fa[x]==e[i].v) continue;
- ans+=query(e[i].v,y);
- }
- return ans;
- }
- }
- void modify(int x,int y){
- int pos=lower_bound(blo[bl[x]].begin(),blo[bl[x]].end(),w[x])-blo[bl[x]].begin();
- w[x]=y;blo[bl[x]][pos]=y;
- sort(blo[bl[x]].begin(),blo[bl[x]].end());
- }
- void join(int x,int y){
- fa[++n]=x;w[n]=y;dep[n]=dep[x]+;
- add(x,n);add(n,x);
- blo[bl[n]=bl[x]].push_back(y);
- sort(blo[bl[x]].begin(),blo[bl[x]].end());
- }
- int main(){
- scanf("%d",&n);
- //len=sqrt((double)n/log((double)n)*log(2));
- len=sqrt(n);
- for(int i=;i<n;i++){
- int u,v;scanf("%d%d",&u,&v);
- add(u,v);add(v,u);
- }
- for(int i=;i<=n;i++)
- scanf("%d",&w[i]),size[i]=,bl[i]=i;
- dfs();
- for(int i=;i<=n;i++){
- blo[bl[i]].push_back(w[i]);
- if(!vis[bl[i]])vis[bl[i]]=,ind[++ind[]]=bl[i];
- }
- for(int i=;i<=ind[];i++)
- sort(blo[ind[i]].begin(),blo[ind[i]].end());
- scanf("%d",&m);int ans=;
- for(int i=;i<=m;i++){
- int opt,x,y;scanf("%d%d%d",&opt,&x,&y);
- x^=ans;y^=ans;
- if(opt==) ans=query(x,y),printf("%d\n",ans);
- else if(opt==) modify(x,y);
- else join(x,y);
- }
- return ;
- }
Gty的妹子树(bzoj 3720)的更多相关文章
- 【BZOJ3720】Gty的妹子树 块状树
[BZOJ3720]Gty的妹子树 我曾在弦歌之中听过你,檀板声碎,半出折子戏.舞榭歌台被风吹去,岁月深处尚有余音一缕……Gty神(xian)犇(chong)从来不缺妹子……他来到了一棵妹子树下,发现 ...
- 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 3720] Gty的妹子树 (树上分块)
树上分块(块状树) Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕-- Gty神(xian)犇(chong)从来不缺妹子-- 他来到了 ...
- BZOJ 3720: Gty的妹子树 [树上size分块]
传送门 题意: 一棵树,询问子树中权值大于$k$的节点个数,修改点权值,插入新点:强制在线 一开始以为询问多少种不同的权值,那道CF的强制在线带修改版,直接吓哭 然后发现看错了这不一道树上分块水题.. ...
- BZOJ.3720.Gty的妹子树(树分块)
题目链接 洛谷上惨遭爆零是为什么.. 另外这个树分块算法是假的. /* 插入删除只涉及一个数,故每次可以枚举一遍,而不是重构完后sort */ #include<cmath> #inclu ...
- [BZOJ 3720][JZYZOJ 2016]gty的妹子树 强制在线 树分块/树套树
jzyzoj的p2016 先码着,强制在线的树分块或者树套树?关键是我树分块还在入门阶段树套树完全不会啊摔 http://blog.csdn.net/jiangyuze831/article/de ...
- BZOJ3720 Gty的妹子树 【树分块】
题目 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕-- Gty神(xian)犇(chong)从来不缺妹子-- 他来到了一棵妹子树下,发现每个妹子有一个美丽度 ...
- BZOJ3720 Gty的妹子树 询问分块、主席树
传送门 学到了询问分块的科技-- 对于修改操作,每发生了\(S\)次修改就重构整棵树,小于\(S\)次的修改操作丢到一个队列里面. 对于每一次查询操作,先在主席树上查询当前子树内部大于\(k\)的节点 ...
- bzoj3720: Gty的妹子树(树分块)
传送门 好珂怕…… 树分块是什么东西啊……感觉好暴力…… 直接贴一下好了->这里 //minamoto #include<iostream> #include<cstdio&g ...
随机推荐
- 用vscode开发vue应用[转]
https://segmentfault.com/a/1190000019055976 现在用VSCode开发Vue.js应用几乎已经是前端的标配了,但很多时候我们看到的代码混乱不堪,作为一个前端工程 ...
- python hdfs初体验
新建目录 chr 新建文件hdfstest1.txt并写入内容 复制hdfstest1.txt的内容到hdfstest2.txt
- Linux网络管理及基础设置
一.网络管理 1 临时配置网络(ip,网关,dns) 用ifconfig命令设定网卡的IP地址: ens33网卡的IP地址为192.168.16.154, ifconfig ens33 192.168 ...
- Linux之Nginx服务 nfs文件存储 负载均衡
一.搭建Nginx服务 Nginx 是俄罗斯人编写的十分轻量级的HTTP 服务器,Nginx,它的发音为"engine X",是一个高性能的HTTP和反向代理服务器,同时也是一个I ...
- 利用java自带的base64实现加密、解密
package com.stone.util; import java.io.UnsupportedEncodingException; import sun.misc.*; public class ...
- ios runloop学习
今天突然才之间才意识到NSTimer这样的运行方式,是在多线程中实现的循环还是在主线程中去实现的呢.当然不可能是在主线程中的while那么简单,那样什么都干不了,简单看了下NSTimer是以同步方式运 ...
- 51nod——1174 区间中最大的数(ST)
题目链接 给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. 例如: 1 7 6 3 1.i = 1, j = 3,对应的数为7 6 3,最大的数 ...
- C++系统学习之二:字符串
上一篇文章主要学习的是C++的基本类型,它们是C++语言直接定义的,它们体现了计算机硬件本身具备的能力.而本篇文章将主要学习内置类型之外的标准库所定义的类型,分别是string和vector,此外还将 ...
- [LUOGU] P1880 [NOI1995]石子合并
题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1 ...
- sql server存储过程修改,存储到mysql笔记
由于有些项目要迁移到mysql上,数据迁移用MySQLWorkbench就能很好的迁移,最难的是存储过程之类的. 下面是sql server存储过程和mysql存储过程的转化: SQL SERVER: ...