cjoj

sol

子树转化成dfs序上的区间。

所以就变成了:区间Kth,区间内[a,b]范围内的数有多少个,单点修改

裸的树套树啊。

code

#include<cstdio>
#include<algorithm>
using namespace std;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 3e4+5;
struct segment_tree{int ls,rs,v;}t[N*150];
int n,m,a[N],to[N<<1],nxt[N<<1],head[N],cnt,dfn[N],low[N],rt[N],tot,t1,t2,tmp1[20],tmp2[20];
void link(int u,int v){to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;}
void dfs(int u,int f)
{
dfn[u]=++cnt;
for (int e=head[u];e;e=nxt[e])
if (to[e]!=f) dfs(to[e],u);
low[u]=cnt;
}
void Modify(int &x,int l,int r,int p,int v)
{
if (!x) x=++tot;t[x].v+=v;
if (l==r) return;int mid=l+r>>1;
if (p<=mid) Modify(t[x].ls,l,mid,p,v);
else Modify(t[x].rs,mid+1,r,p,v);
}
int Query(int l,int r,int k)
{
if (l==r) return l;
int mid=l+r>>1,sum=0;
for (int i=1;i<=t1;++i) sum+=t[t[tmp1[i]].ls].v;
for (int i=1;i<=t2;++i) sum-=t[t[tmp2[i]].ls].v;
if (k<=sum)
{
for (int i=1;i<=t1;++i) tmp1[i]=t[tmp1[i]].ls;
for (int i=1;i<=t2;++i) tmp2[i]=t[tmp2[i]].ls;
return Query(l,mid,k);
}
else
{
for (int i=1;i<=t1;++i) tmp1[i]=t[tmp1[i]].rs;
for (int i=1;i<=t2;++i) tmp2[i]=t[tmp2[i]].rs;
return Query(mid+1,r,k-sum);
}
}
int PreQuery(int l,int r,int k)
{
t1=t2=0;
for (int i=r;i;i-=i&-i) tmp1[++t1]=rt[i];
for (int i=l-1;i;i-=i&-i) tmp2[++t2]=rt[i];
return Query(1,10000,k);
}
int Sum(int x,int l,int r,int ql,int qr)
{
if (!x||l>=ql&&r<=qr) return t[x].v;
int mid=l+r>>1;
if (qr<=mid) return Sum(t[x].ls,l,mid,ql,qr);
if (ql>mid) return Sum(t[x].rs,mid+1,r,ql,qr);
return Sum(t[x].ls,l,mid,ql,qr)+Sum(t[x].rs,mid+1,r,ql,qr);
}
int main()
{
n=gi();
for (int i=1;i<=n;++i) a[i]=gi();
for (int i=1;i<n;++i)
{
int u=gi(),v=gi();
link(u,v);link(v,u);
}
cnt=0;dfs(1,0);
for (int i=1;i<=n;++i)
for (int j=dfn[i];j<=n;j+=j&-j)
Modify(rt[j],1,10000,a[i],1);
m=gi();
while (m--)
{
int opt=gi(),u=gi();
if (opt==1)
{
int k=gi();
printf("%d\n",PreQuery(dfn[u],low[u],k));
}
if (opt==2)
{
int l=gi(),r=gi(),ans=0;
for (int j=low[u];j;j-=j&-j) ans+=Sum(rt[j],1,10000,l,r);
for (int j=dfn[u]-1;j;j-=j&-j) ans-=Sum(rt[j],1,10000,l,r);
printf("%d\n",ans);
}
if (opt==3)
{
for (int j=dfn[u];j<=n;j+=j&-j) Modify(rt[j],1,10000,a[u],-1);
a[u]=gi();
for (int j=dfn[u];j<=n;j+=j&-j) Modify(rt[j],1,10000,a[u],1);
}
}
return 0;
}

[CJOJ2425][SYZOI Round1]滑稽的树的更多相关文章

  1. [SYZOI Round1] 滑稽♂树

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

  2. 【SYZOI Round1】滑稽的树

    Description zzsyz实验楼里面种了一棵滑稽树,只有滑稽之力达到大乘期的oier才能看到.虽然我们看不到,但是还是知道一些信息: 这真的是一棵树,由n个节点,n-1条边联通.一号滑稽果同时 ...

  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. 使用 Xcode 5 生成和使用静态库

      本文转载至 http://blog.csdn.net/qq331436155/article/details/18363267   静态库Static Libraryiosxcode   在项目中 ...

  2. 替换jar包内指定的文件

    用Java jar 工具来替换. ① jar uvf test.jar test.class 把test.class 直接添加到jar包的根目录,也就是替换到根目录文件. ②jar uvf test. ...

  3. 异常:The JSP specification requires that an attribute name is preceded by whitespace

    The JSP specification requires that an attribute name is preceded by whitespace: 其实这句话翻译就是 属性后面要必须有空 ...

  4. 20179209《Linux内核原理与分析》安全类实验答疑

    实验一 题目 Nmap 配合 Metasploit 进行端口扫描 问题 Nmap怎么配合Metasploit进行端口扫描? 回答 这里的Nmap配合Metasploit进行端口扫描是指在Metaspl ...

  5. eclipse svn 分支合并到主干

    最近公司产品上线,整个系统架构包含有七八个子系统,并且子系统都是集群部署.所以每次升级维护都要确保尽可能不出问题.因为整个系统刚上线不久,意味着新系统不定期有BUG需修复,但新功能模块也在持续的开发中 ...

  6. Centos下MySQL数据库主从双向同步配置

    MYSQL支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环.当一个从服务器连接到主服务 ...

  7. JS中如何获取<Select>中value和text的值

    原文地址:JS中如何获取<Select>中value和text的值 html代码: <select id = "city" onchange="chan ...

  8. 构造代码块、构造函数、this执行顺序

    一.构造函数 对象一建立就会调用与之对应的构造函数. 构造函数的作用:可以用于给对象进行初始化. 构造函数的小细节:当一个类中没有定义构造函数时,系统会默认给该类加一个空参数的构造函数:当在类中自定义 ...

  9. php生成各种验证码

    片段 1 片段 2 片段 3 index.html ```<script type="text/javascript" src="jquery.min.js&quo ...

  10. OSI模型网络分层

    OSI TCP/IP --- ------- 应用层 表示层 应用层 会话层 ----- ------- 传输层 TCP UDP ----- ------- 网络层 IPv4/IPv6 ----- - ...