Gty的妹子树

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 2149  Solved: 781
[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

2017.9.28新加数据一组by GXZlegend,未重测

Source

传说中的树分块,但是会被暴力卡,我貌似没找出什么方法,

和根一起一起到达根号n就就分块,这个没什么用,会被菊花图卡掉的。

 #include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath> #define N 60007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,m,block,ans,tot;
int a[N],fa[N],bl[N];
int cnt,hed[N],nxt[N<<],rea[N<<];
int Cnt,Hed[N],Nxt[N<<],Rea[N<<]; struct Node
{
int a[],siz;
void insert(int x){a[++siz]=x;}
void change(int x,int y)
{
int t=upper_bound(a+,a+siz+,x)-a;t--;
a[t]=y;
sort(a+,a+siz+);
}
int query(int x)
{
int t=upper_bound(a+,a+siz+,x)-a;
return siz-t+;
}
}blo[N];
inline void add(int u,int v)
{
nxt[++cnt]=hed[u];
hed[u]=cnt;
rea[cnt]=v;
}
inline void add_two_way(int u,int v)
{
add(u,v);
add(v,u);
}
inline void ins(int u,int v)
{
Nxt[++Cnt]=Hed[u];
Hed[u]=Cnt;
Rea[Cnt]=v;
}
void dfs(int u)
{
if (blo[bl[fa[u]]].siz==block)
blo[bl[u]=++tot].insert(a[u]),ins(bl[fa[u]],tot);
else blo[bl[u]=bl[fa[u]]].insert(a[u]);
for (int i=hed[u];i!=-;i=nxt[i])
{
int v=rea[i];
if (v==fa[u]) continue;
fa[v]=u,dfs(v);
}
}
void block_dfs(int u,int z)
{
ans+=blo[u].query(z);
for (int i=Hed[u];i!=-;i=Nxt[i])
{
int v=Rea[i];
block_dfs(v,z);
}
}
void solve(int u,int z)
{
if (a[u]>z) ans++;
for (int i=hed[u];i!=-;i=nxt[i])
{
int v=rea[i];
if (v==fa[u]) continue;
if (bl[v]==bl[u]) solve(v,z);
else block_dfs(bl[v],z);
}
}
int main()
{
memset(hed,-,sizeof(hed));
memset(Hed,-,sizeof(Hed));
n=read(),block=sqrt(n);
for (int i=;i<n;i++)
add_two_way(read(),read());
for (int i=;i<=n;i++) a[i]=read();
dfs();
for (int i=;i<=tot;i++)
sort(blo[i].a+,blo[i].a+blo[i].siz+); m=read();
for (int i=;i<=m;i++)
{
int opt=read(),x=read(),y=read();
x^=ans,y^=ans;
if (opt==)
{
ans=;
solve(x,y);
printf("%d\n",ans);
}
else if (opt==)
{
blo[bl[x]].change(a[x],y);
a[x]=y;
}
else
{
a[++n]=y,add_two_way(x,n),fa[n]=x;
if (blo[bl[x]].siz==block)
blo[bl[n]=++tot].insert(y),ins(bl[x],tot);
else
{
blo[bl[n]=bl[x]].insert(y);
sort(blo[bl[n]].a+,blo[bl[n]].a+blo[bl[n]].siz+);
}
}
}
}

bzoj 3720 Gty的妹子树 树分块?瞎搞的更多相关文章

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

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

  2. BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec  Memory ...

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

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

  4. BZOJ 3720: Gty的妹子树 [树上size分块]

    传送门 题意: 一棵树,询问子树中权值大于$k$的节点个数,修改点权值,插入新点:强制在线 一开始以为询问多少种不同的权值,那道CF的强制在线带修改版,直接吓哭 然后发现看错了这不一道树上分块水题.. ...

  5. BZOJ.3720.Gty的妹子树(树分块)

    题目链接 洛谷上惨遭爆零是为什么.. 另外这个树分块算法是假的. /* 插入删除只涉及一个数,故每次可以枚举一遍,而不是重构完后sort */ #include<cmath> #inclu ...

  6. bzoj 3744: Gty的妹子序列 主席树+分块

    3744: Gty的妹子序列 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 101  Solved: 34[Submit][Status] Descr ...

  7. BZOJ 3744 Gty的妹子序列 (分块 + BIT)

    3744: Gty的妹子序列 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1931  Solved: 570[Submit][Status][Dis ...

  8. BZOJ 3744 Gty的妹子序列

    Description 我早已习惯你不在身边, 人间四月天 寂寞断了弦. 回望身后蓝天, 跟再见说再见-- 某天,蒟蒻Autumn发现了从 Gty的妹子树上掉落下来了许多妹子,他发现 她们排成了一个序 ...

  9. BZOJ 3720 gty的妹子树

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

随机推荐

  1. JAVA 反射之Method

    ★ Method没有构造器,只能通过Class获取. 重点方法: class.getDeclaredMethods():获取所有方法. class.getDeclaredMethod(String n ...

  2. Python标准库--inspect

    inspect模块是针对模块,类,方法,功能等对象提供些有用的方法.例如可以帮助我们检查类的内容,检查方法的代码,提取和格式化方法的参数等. import inspect import os clas ...

  3. [KAFKA]kafka常用操作

    -- kafka路径示例 /opt/cloudera/parcels/KAFKA/bin-- kafka启动./kafka-server-start.sh -daemon ../config/serv ...

  4. itop-4412开发板学习-内核信号量

    1. 翻翻书看下,linux提供两种信号量,内核信号量,由内核控制路径使用,System V IPC信号量,由用户态进程使用.下面的就是内核部分的信号量.内核信号量类似于自旋锁,当锁关闭着时,不允许内 ...

  5. nginx error_page

    1. error_page语法 语法: error_page code [ code... ] [ = | =answer-code ] uri | @named_location 默认值: no 使 ...

  6. OpenCV入门:(五:更改图片对比度和亮度)

    1. 理论 图片的转换就是将图片中的每个像素点经过一定的变换,得到新像素点,新像素点组合成一张新的图片. 改变图片对比度和亮度的变换如下: 其中α和β被称作增益参数(gain parameter)和偏 ...

  7. Python网络编程(进程池、进程间的通信)

    线程池的原理:        线程池是预先创建线程的一种技术.线程池在还没有任务到来之前,        创建一定数量的线程,放入空闲队列中.这些线程都是处于睡眠状态,        即均为启动,不消 ...

  8. C++学习---- static关键字用法总结

    static: 作用:存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化.共有两种变量存储在静态存储区:全局变量和static变量. 1.隐藏:(静态全局变量和静态函数)   ...

  9. static 关键字解析(转)

    static关键字解析   Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面 ...

  10. 第18讲——string类

    关键字:string类  字符串  C-风格字符串  C库字符串函数 字符串:存储在内存的连续字节中的一系列字符. C++处理字符串的方式有两种: 来自C语言,常被称为C-风格字符串: 基于strin ...