Description

zzsyz实验楼里面种了一棵滑稽树,只有滑稽之力达到大乘期的oier才能看到。虽然我们看不到,但是还是知道一些信息:
这真的是一棵树,由n个节点,n-1条边联通。一号滑稽果同时也是整棵滑稽树的树根。滑稽树上每个节点有一个滑稽果,每个滑稽果有它的重量。
雪甜甜公主是神犇当然看得到那棵滑稽树啦,现在她感兴趣的是这样三件事
1:滑稽树太大啦,雪甜甜公主有的时候只想知道,在以某一个滑稽果为根的子滑稽树里面,重量第k小的果子的重量是多少?
2:除了重量第k小的果子,雪甜甜还想知道以某个滑稽果为根的子滑稽树里面,重量在[a, b]这个范围内的滑稽果有多少个。
3:雪甜甜还喜欢吃滑稽果,但是吃完,原来滑稽果的位置上还会长出一个新的滑稽果,只是重量可能不一样。

Input

第一行一个正整数n,表示滑稽树有n个节点。
第二行n个正整数,分别描述1号,2号,,,,n号节点滑稽果的重量。
接下来n-1行,每行2个正整数u, v ∈ [1, n],表示滑稽果u与滑稽果v之间有树枝连接。
接下来一个正整数q,表示雪甜甜有q次行动
之后q行,有这样3种形式
1 u k 雪甜甜公主询问以u为根的子滑稽树中,重量第k小的滑稽果的重量。
2 u a b 雪甜甜公主想知道,以u为根的子滑稽树中,重量在[a, b]范围内的滑稽果有多少个。
3 u x 雪甜甜公主吃掉了编号为u的滑稽果,但是在原位置上立刻长出来了一个重量为x的滑稽果。因为位置没有变,所以编号还是u。

Output

对于每次询问,输出结果。

Sample Input

5
3 4 6 1 2
1 2
1 3
3 4
3 5
7
1 1 4
2 1 1 5
3 4 5
1 1 4
2 3 3 6
3 5 7
1 3 3

Sample Output

4
4
5
2
7

Hint

样例提示:

数据的范围及提示:
N:
对于前35%的数据满足,N <= 5000
对于前50%的数据满足,N <= 10000
对于前100%的数据满足,N <= 30000
滑稽果的重量:对于100%d的数据满足 滑稽果的重量 <= 10000
询问:询问的个数Q:
对于前50%的数据满足 Q <= 10000
对于前100%的数据满足 Q <= 50000
对于前25%的数据,只有第一种询问。
对于前65%的数据,有第1,2种询问。
对于100%的数据第1,2,3种询问都存在。
对于前35%的数据,满足一个特殊的限制条件:每次询问的滑稽果u = 1保证询问k小重量的滑稽果的时候,k值∈ [1, 子树的节点数]

题解:

变样的整体二分,直接记录进出子树的时间戳就可以转化为区间问题,

值得注意的是查找[L,R]的个数 的地方很细节.

只有t[i].k>mid 时才可以统计,不能取等,不然就会被加入到q1 然后被重复统计

 #include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int N=,M=,Q=M*+N;
const int INF=-2e8;
int head[N],num=;
struct Lin{
int next,to;
}b[N<<];
void init(int x,int y){
b[++num].next=head[x];
b[num].to=y;
head[x]=num;
}
int gi(){
int str=;char ch=getchar();
while(ch>'' || ch<'')ch=getchar();
while(ch>='' && ch<='')str=(str<<)+(str<<)+ch-,ch=getchar();
return str;
}
int n,m,val[N];
struct node{
int ki,x,y,k,cnt,id;
}t[Q<<],q1[Q<<],q2[Q<<];
int dfn[N],last[N],dfns=,tot=;
void dfs(int x){
dfn[x]=++dfns;
for(int i=head[x];i;i=b[i].next){
if(!dfn[b[i].to])dfs(b[i].to);
}
last[x]=dfns;
}
int a[N],ans[M],Tree[N*];
void add(int sta,int ad){
for(int i=sta;i<=n;i+=(i&(-i)))Tree[i]+=ad;
}
int getsum(int sta){
int sum=;
for(int i=sta;i>=;i-=(i&(-i)))sum+=Tree[i];
return sum;
}
int l1,l2;
void count(int ll,int rr,int dl,int dr)
{
l1=l2=;
for(int i=ll;i<=rr;i++)
{
if(t[i].ki==)
{
t[i].cnt=getsum(t[i].y)-getsum(t[i].x-);
if(t[i].cnt>=t[i].k)q1[++l1]=t[i];
else t[i].k-=t[i].cnt,q2[++l2]=t[i];
}
else if(t[i].ki==)
{
if(t[i].k>dr)
ans[t[i].id]+=(getsum(t[i].y)-getsum(t[i].x-))*t[i].cnt,q2[++l2]=t[i];
else
q1[++l1]=t[i];
}
else
{
if(t[i].y<=dr)add(t[i].x,t[i].cnt),q1[++l1]=t[i];
else q2[++l2]=t[i];
}
}
for(int i=;i<=l1;i++)
if(q1[i].ki==)
add(q1[i].x,-q1[i].cnt);
int now=ll-;
for(int i=;i<=l1;i++)
t[++now]=q1[i];
for(int i=;i<=l2;i++)
t[++now]=q2[i];
}
void div(int ll,int rr,int dl,int dr)
{
if(dl==dr){
for(int i=ll;i<=rr;i++)
if(t[i].ki==)ans[t[i].id]=dl;
return ;
}
int mid=(dl+dr)>>;
count(ll,rr,dl,mid);
int p=l1;
if(p)
div(ll,ll+p-,dl,mid);
if(p<=rr-ll)
div(ll+p,rr,mid+,dr);
}
int main()
{
n=gi();
for(int i=;i<=n;i++)
val[i]=gi();
int x,y;
for(int i=;i<n;i++){
x=gi();y=gi();
init(x,y);init(y,x);
}
dfs();
for(int i=;i<=n;i++){
a[dfn[i]]=val[i];
t[++tot]=(node){,dfn[i],val[i],,,};
}
m=gi();
int flag,z,qnum=;
for(int i=;i<=m;i++)
{
flag=gi();
if(flag==){
x=gi();y=gi();
t[++tot]=(node){,dfn[x],last[x],y,,++qnum};
}
else
if(flag==){
x=gi();y=gi();z=gi();
t[++tot]=(node){,dfn[x],last[x],y,-,++qnum};
t[++tot]=(node){,dfn[x],last[x],z+,,qnum};
}
else{
x=gi();y=gi();
t[++tot]=(node){,dfn[x],a[dfn[x]],,-,};
t[++tot]=(node){,dfn[x],y,,,};
a[dfn[x]]=y;
}
}
div(,tot,,);
for(int i=;i<=qnum;i++)printf("%d\n",ans[i]);
return ;
}

【SYZOI Round1】滑稽的树的更多相关文章

  1. [CJOJ2425][SYZOI Round1]滑稽的树

    cjoj sol 子树转化成dfs序上的区间. 所以就变成了:区间Kth,区间内[a,b]范围内的数有多少个,单点修改 裸的树套树啊. code #include<cstdio> #inc ...

  2. [SYZOI Round1] 滑稽♂树

    题面 传送门 Sol 我也不知道哪里来的题目哪里来的\(OJ\) 子树变成\(DFS\)序后就是裸的树套树 # include <bits/stdc++.h> # define RG re ...

  3. NOI前训练日记

    向别人学习一波,记点流水帐.17.5.29开坑. 5.29 早晨看了道据说是树状数组优化DP的题(hdu5542),然后脑补了一个复杂度500^3的meet in the middle.然后死T... ...

  4. HDU 5687 Problem C

    Problem C Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  5. 【SYZOJ279】滑稽♂树(树套树)

    [SYZOJ279]滑稽♂树(树套树) 题面 SYZOJ CJOJ 题目描述 zzsyz实验楼里面种了一棵滑稽树,只有滑稽之力达到大乘期的oier才能看到.虽然我们看不到,但是还是知道一些信息: 这真 ...

  6. 搜索(四分树):BZOJ 4513 [SDOI2016 Round1] 储能表

    4513: [Sdoi2016]储能表 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 395  Solved: 213[Submit][Status] ...

  7. BZOJ3196 二逼平衡树 ZKW线段树套vector(滑稽)

    我实在是不想再打一遍树状数组套替罪羊树了... 然后在普通平衡树瞎逛的时候找到了以前看过vector题解 于是我想:为啥不把平衡树换成vector呢??? 然后我又去学了一下ZKW线段树 就用ZKW线 ...

  8. 【ZJOI2017 Round1练习&BZOJ4765】D1T3 普通计算姬(主席树,分块)

    题意: 思路:分块 使用树状数组维护sum[i]的前缀和 使用主席树维护root到u的路径上点的编号出现的个数 每次操作如果是修改就加入队列 如果是询问,考虑块内操作对询问的影响,每次在x点加上y会使 ...

  9. 19牛客暑期多校 round1 A 有关笛卡尔树的结论

    题目传送门//res tp nowcoder 分析 定理:B1~B2当且仅当B1与B2有同构的笛卡尔树. (B₁~B₂ iff B₁ and B₂ have isomorphic Cartesian ...

随机推荐

  1. 第二周c语言PTA作业留

    6-1 计算两数的和与差(10 分) 本题要求实现一个计算输入的两数的和与差的简单函数. 函数接口定义: void sum_diff( float op1, float op2, float psum ...

  2. 转git取消commit

     如果不小心commit了一个不需要commit的文件,可以对其进行撤销. 先使用git log 查看 commit日志 commit 422bc088a7d6c5429f1d0760d008d8 ...

  3. python的迭代器、生成器、装饰器

    迭代器.生成器.装饰器 在这个实验里我们学习迭代器.生成器.装饰器有关知识. 知识点 迭代器 生成器 生成器表达式 闭包 装饰器 实验步骤 1. 迭代器 Python 迭代器(Iterators)对象 ...

  4. nyoj 黑色帽子

    黑色帽子 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述         最近发现了一个搞笑的游戏,不过目前还没玩过.一个舞会上,每个人头上都戴着一顶帽子,帽子只有黑 ...

  5. IT学习逆袭的新模式,全栈实习生,不8000就业不还实习费

    大家好: 我是马伦,也就是多年耕耘在IT培训一线的老马.老马一直怀揣普惠教育梦想初心,一直为莘莘学子能获得高质量的IT教育服务而奋斗. 之前老马在IT培训机构任职讲师多年,也有丰富的教学管理经验.接触 ...

  6. django报错invalid literal for int() with base 10: ''

    这种错误是因为模型类中某个字段的条件约束为int类型,但是给了一个字符串类型,所以报错,找到那个模型类的字段,并对应修改就好了.

  7. NFS PersistentVolume - 每天5分钟玩转 Docker 容器技术(151)

    上一节我们介绍了 PV 和 PVC,本节通过 NFS 实践. 作为准备工作,我们已经在 k8s-master 节点上搭建了一个 NFS 服务器,目录为 /nfsdata: 下面创建一个 PV mypv ...

  8. MySQL“Another MySQL daemon already running with the same unix socket” 报错信息处理

    Mysql "Another Mysql daemon already running with the same unix socket" 解决办法:rm var/lib/mys ...

  9. C语言学习(二)

    今天在程序员面试题中,碰到一个有意思的题目:数组a[N],存放了1至N-1个数,其中某个数重复一次,现在要求找出重复的数字且程序时间复杂度必须为O(N).乍一看,如果不计时间复杂度和空间复杂度程序比较 ...

  10. 《深入实践Spring Boot》阅读笔记之一:基础应用开发

    上上篇「1718总结与计划」中提到,18年要对部分项目拆分,进行服务化,并对代码进行重构.公司技术委员会也推荐使用spring boot,之前在各个技术网站中也了解过,它可以大大简化spring配置和 ...