BZOJ3720 Gty的妹子树
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的时候看一下父亲所在的块是否已经满了(设置为块的上限,在根号左右最佳),如果满了的话就新建一个块,并且把新建的块与父亲所在的块连边,否则加入父亲所在的块。每次插入,在块内部都是暴力处理。修改操作也是在块内暴力处理,修改完之后暴力移动,保证有序性。新的插入也是一样的,与第一遍DFS相同,只需看一下父亲所在块是不是满了。查询的话就DFS,发现儿子结点与自己所在块不同,就直接访问整个块,二分查找块内大于需查询的值的个数。
这道题有很多细节要注意,调了一个多小时,中间经历了WA、RE、TLE、MLE,也是醉了。
//It is made by jump~
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#ifdef WIN32
#define OT "%I64d"
#else
#define OT "%lld"
#endif
using namespace std;
typedef long long LL;
const int MAXN = ;
const int S = ; //实验表明,400附近最合适。。。
int n,ecnt,cnt;
int w[MAXN],father[MAXN];
int first[MAXN],next[MAXN*],to[MAXN*];
int ans,m;
int belong[MAXN];
int head[MAXN]; inline int getint()
{
int w=,q=;
char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar();
if (c=='-') q=, c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar();
return q ? -w : w;
} struct kuai_tree{
int size; int a[S+]; inline void insert(int x){//块内暴力插入新元素
size++; int i=size;
for(;i>=;i--) if(a[i-]>x) a[i]=a[i-]; else break;
a[i]=x;
} inline int zuo_ask(int x){//查找到相等的值的最左一位
int l=,r=size,mid;
while(l<=r) {
mid=(l+r)/;
if(a[mid]>=x) r=mid-;
else l=mid+;
}
return l;//!!!
} inline int you_ask(int x){//查找到相等的值的最右一位
int l=,r=size,mid;
while(l<=r) {
mid=(l+r)/;
if(a[mid]>x) r=mid-;
else l=mid+;
}
return r;//!!!
} inline void update(int x,int y){//块内暴力更改
int i=zuo_ask(x);
for(;i<size && a[i+]<y;i++) a[i]=a[i+];
for(;i> && a[i-]>y;i--) a[i]=a[i-];//无需等号
a[i]=y;
} inline int query(int x){
return size-you_ask(x);
}
}tr[MAXN]; inline void link(int x,int y){ next[++ecnt]=head[x]; head[x]=ecnt; to[ecnt]=y; } inline void dfs(int x,int fa){
if(tr[belong[fa]].size==S) {cnt++; belong[x]=cnt; link(belong[fa],cnt); tr[cnt].insert(w[x]);}//是belong而不是本身!!! 是cnt而不是本身
else { belong[x]=belong[fa]; tr[belong[fa]].insert(w[x]); }
father[x]=fa;
for(int i=first[x];i;i=next[i]) {
int v=to[i];
if(v==fa) continue;
dfs(v,x);
}
} inline void kuai_DFS(int x,int num){
ans+=tr[x].query(num);
for(int i=head[x];i;i=next[i]) kuai_DFS(to[i],num);
} inline void DFS(int x,int num){
if(w[x]>num) ans++;
for(int i=first[x];i;i=next[i]) {
int v=to[i];
if(v==father[x]) continue;
if(belong[x]==belong[v]) DFS(v,num);
else kuai_DFS(belong[v],num);
}
} inline void work(){
n=getint(); int x,y;
for(int i=;i<n;i++) {
x=getint(); y=getint();
next[++ecnt]=first[x]; first[x]=ecnt; to[ecnt]=y;
next[++ecnt]=first[y]; first[y]=ecnt; to[ecnt]=x;
}
for(int i=;i<=n;i++) w[i]=getint();
tr[].size=S; dfs(,);
m=getint(); int ljh;
for(int i=;i<=m;i++) {
ljh=getint(); x=getint(); y=getint();
x=x^ans; y=y^ans;
if(ljh==) { ans=; DFS(x,y); printf("%d\n",ans); }
else if(ljh==) { tr[belong[x]].update(w[x],y); w[x]=y; }
else{
w[++n]=y; father[n]=x; next[++ecnt]=first[x]; first[x]=ecnt; to[ecnt]=n;//都要连接一下
if(tr[belong[x]].size==S) {
cnt++; tr[cnt].insert(y); belong[n]=cnt;
link(belong[x],cnt);
}
else{
belong[n]=belong[x];
tr[belong[x]].insert(y);
}
}
}
} int main()
{
work();
return ;
}
BZOJ3720 Gty的妹子树的更多相关文章
- 【块状树】bzoj3720 Gty的妹子树
块状树.教程见:http://z55250825.blog.163.com/blog/static/1502308092014163413858/将树按一定大小分块,分成许多子树,在每个子树的根节点记 ...
- BZOJ 3720 gty的妹子树
块状树裸题 块状树: 首先对树进行分块,分出的每一块都是一个连通块 通常的分块的方式如下: 1.父亲所在块不满,分到父亲所在块中 2.父亲所在块满,自己单独开一个块 (貌似有更为优越的分块方式? 注意 ...
- 3720: Gty的妹子树
3720: Gty的妹子树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1440 Solved: 482[Submit][Status][Disc ...
- Gty的妹子树(bzoj 3720)
Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕…… Gty神(xian)犇(chong)从来不缺妹子…… 他来到了一棵妹子树下,发现每 ...
- BZOJ 3731: Gty的超级妹子树
3731: Gty的超级妹子树 Time Limit: 7 Sec Memory Limit: 32 MBSubmit: 346 Solved: 96[Submit][Status][Discus ...
- BZOJ3720 Gty的妹子树 【树分块】
题目 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕-- Gty神(xian)犇(chong)从来不缺妹子-- 他来到了一棵妹子树下,发现每个妹子有一个美丽度 ...
- 【块状树】bzoj3731 Gty的超级妹子树
带 加点 删边的块状树. 加点在 bzoj3720 说过. 删边其实就是块顶打标记,记录其属于哪棵树,防止在dfs搜集答案时跑到别的树上. 然后暴力把所在块拆开. 好像用邻接表存图,直接在vector ...
- bzoj3731: Gty的超级妹子树
一代神题啊orz(至少是以前年代的神题吧) 块状树 复杂度nsqrtnlogn 真是exciting 还没有卡时限 话不多说直接上代码 (最近解锁了记事本写代码的技能...感觉越来越依赖OJ调试了.. ...
- BZOJ3720 Gty的妹子树 询问分块、主席树
传送门 学到了询问分块的科技-- 对于修改操作,每发生了\(S\)次修改就重构整棵树,小于\(S\)次的修改操作丢到一个队列里面. 对于每一次查询操作,先在主席树上查询当前子树内部大于\(k\)的节点 ...
随机推荐
- mysql数据库误删除后的数据恢复操作说明
在日常运维工作中,对于mysql数据库的备份是至关重要的!数据库对于网站的重要性使得我们对mysql数据的管理不容有失!然后,是人总难免会犯错误,说不定哪天大脑短路了来个误操作把数据库给删除了,怎么办 ...
- UITableViewCell动态AutoLayout布局
相关链接: 使用Autolayout实现UITableView的Cell动态布局和高度动态改变 IOS tableView cell动态高度 (autoLayout) AutoLayoutClub 使 ...
- 【转】【Asp.Net】了解使用 ASP.NET AJAX 进行局部页面更新
简介Microsoft的 ASP.NET 技术提供了一个面向对象.事件驱动的编程模型,并将其与已编译代码的优势结合起来.但其服务器端的处理模型仍存在技术本身所固有的几点不足: 进行页面更新需要往返服务 ...
- 修改Tomcat可支持get形式url长度
maxHttpHeaderSize="8192" 加在 <Connector port="8081" maxHttpHeaderSize="31 ...
- fenghuangscannerV3 EXE版本
作者wils0n未给出EXE版本,鼓捣了下: 1.安装pyinstaller 2.fenghuangscanner目录防止pyinstaller下 3. pyinstaller.py --consol ...
- 本地RUN页面时候,将异常直接显示出来,而不是乱码
本地运行页面时,经常会遇到以下错误 oracle.jbo.JboException: JBO-29000: JBO-29000: JBO-26028: ???? MemberAttributesDis ...
- ZooKeeper学习第六期---ZooKeeper机制架构
一.ZooKeeper权限管理机制 1.1 权限管理ACL(Access Control List) ZooKeeper 的权限管理亦即ACL 控制功能,使用ACL来对Znode进行访问控制.ACL的 ...
- An Introduction to Interactive Programming in Python (Part 1) -- Week 2_2 练习
#Practice Exercises for Logic and Conditionals # Solve each of the practice exercises below. # 1.Wri ...
- http 请求头设置缓存
nginx不缓存设置 2013-08-15 10:47:39 分类: LINUX 在开发调试web的时候,经常会碰到因浏览器缓存(cache)而经常要去清空缓存或者强制刷新来测试的烦恼,提供下apa ...
- 大型网站系统架构实践(四)http层负载均衡之haproxy实践篇(一)
方案 上篇文章讲到了负载均衡的相关理论知识,这篇文章我打算讲讲实践方法以及实践中遇到的问题 方案:haproxy http层负载均衡 安装一个haproxy服务,两个web服务 haproxy:192 ...