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

题面

SYZOJ

CJOJ

题目描述

zzsyz实验楼里面种了一棵滑稽树,只有滑稽之力达到大乘期的oier才能看到。虽然我们看不到,但是还是知道一些信息:

这真的是一棵树,由n个节点,n-1条边联通。一号滑稽果同时也是整棵滑稽树的树根。

滑稽树上每个节点有一个滑稽果,每个滑稽果有它的重量。

雪甜甜公主是神犇当然看得到那棵滑稽树啦,现在她感兴趣的是这样三件事

1:滑稽树太大啦,雪甜甜公主有的时候只想知道,在以某一个滑稽果为根的子滑稽树里面,重量第k小的果子的重量是多少?

2:除了重量第k小的果子,雪甜甜还想知道以某个滑稽果为根的子滑稽树里面,重量在[a, b]这个范围内的滑稽果有多少个。

3:雪甜甜还喜欢吃滑稽果,但是吃完,原来滑稽果的位置上还会长出一个新的滑稽果,只是重量可能不一样。

输入格式

第一行一个正整数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。

输出格式

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

样例

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

output

4

4

5

2

7

题解

树套树大裸题

直接来一个带修改主席树就没了

真简单

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 55555
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int n,W[MAX];
struct Line{int v,next;}e[MAX<<1];
int h[MAX],cnt=1;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
int dfn[MAX],low[MAX],tim;
void dfs(int u,int ff)
{
dfn[u]=++tim;
for(int i=h[u];i;i=e[i].next)
if(e[i].v!=ff)dfs(e[i].v,u);
low[u]=tim;
}
int rt[MAX],tot;
struct Node{int ls,rs,v;}t[MAX<<7];
int lb(int x){return x&(-x);}
void Modify(int &x,int ff,int l,int r,int p,int w)
{
x=++tot;t[x]=t[ff];t[x].v+=w;
if(l==r)return;
int mid=(l+r)>>1;
if(p<=mid)Modify(t[x].ls,t[ff].ls,l,mid,p,w);
else Modify(t[x].rs,t[ff].rs,mid+1,r,p,w);
}
void preModify(int x,int p,int w)
{
for(int i=x;i<=n;i+=lb(i))
Modify(rt[i],rt[i],1,10000,p,w);
}
int tmp1[MAX],tmp2[MAX],t1,t2;
void preQuery(int l,int r)
{
t1=t2=0;
for(int i=l;i;i-=lb(i))tmp1[++t1]=rt[i];
for(int i=r;i;i-=lb(i))tmp2[++t2]=rt[i];
}
int Query(int l,int r,int K)
{
if(l==r)return l;
int s=0,mid=(l+r)>>1;
for(int i=1;i<=t1;++i)s-=t[t[tmp1[i]].ls].v;
for(int i=1;i<=t2;++i)s+=t[t[tmp2[i]].ls].v;
if(s>=K)
{
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-s);
}
}
int QuerySum(int l,int r,int L,int R)
{
int ret=0;
if(L<=l&&r<=R)
{
for(int i=1;i<=t1;++i)ret-=t[tmp1[i]].v;
for(int i=1;i<=t2;++i)ret+=t[tmp2[i]].v;
return ret;
}
int mid=(l+r)>>1;
if(L<=mid)
{
int T1[MAX],T2[MAX];
for(int i=1;i<=t1;++i)T1[i]=tmp1[i],tmp1[i]=t[tmp1[i]].ls;
for(int i=1;i<=t2;++i)T2[i]=tmp2[i],tmp2[i]=t[tmp2[i]].ls;
ret+=QuerySum(l,mid,L,R);
for(int i=1;i<=t1;++i)tmp1[i]=T1[i];
for(int i=1;i<=t2;++i)tmp2[i]=T2[i];
}
if(R>mid)
{
int T1[MAX],T2[MAX];
for(int i=1;i<=t1;++i)T1[i]=tmp1[i],tmp1[i]=t[tmp1[i]].rs;
for(int i=1;i<=t2;++i)T2[i]=tmp2[i],tmp2[i]=t[tmp2[i]].rs;
ret+=QuerySum(mid+1,r,L,R);
for(int i=1;i<=t1;++i)tmp1[i]=T1[i];
for(int i=1;i<=t2;++i)tmp2[i]=T2[i];
}
return ret;
}
int main()
{
n=read();
for(int i=1;i<=n;++i)W[i]=read();
for(int i=1;i<n;++i)
{
int u=read(),v=read();
Add(u,v);Add(v,u);
}
dfs(1,0);
for(int i=1;i<=n;++i)
preModify(dfn[i],W[i],1);
int Q=read();
while(Q--)
{
int opt=read(),u=read();
if(opt==1)
{
preQuery(dfn[u]-1,low[u]);
printf("%d\n",Query(1,10000,read()));
}
if(opt==2)
{
int l=read(),r=read();
preQuery(dfn[u]-1,low[u]);
printf("%d\n",QuerySum(1,10000,l,r));
}
if(opt==3)
{
preModify(dfn[u],W[u],-1);
W[u]=read();
preModify(dfn[u],W[u],1);
}
}
return 0;
}

【SYZOJ279】滑稽♂树(树套树)的更多相关文章

  1. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

  2. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

  3. BZOJ4170 极光(CDQ分治 或 树套树)

    传送门 BZOJ上的题目没有题面-- [样例输入] 3 5 2 4 3 Query 2 2 Modify 1 3 Query 2 2 Modify 1 2 Query 1 1 [样例输出] 2 3 3 ...

  4. bzoj3262: 陌上花开(树套树)

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  5. bzoj3295: [Cqoi2011]动态逆序对(树套树)

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  6. BZOJ 3110 k大数查询 & 树套树

    题意: 有n个位置,每个位置可以看做一个集合,现在要求你实现一个数据结构支持以下功能: 1:在a-b的集合中插入一个数 2:询问a-b集合中所有元素的第k大. SOL: 调得火大! 李建说数据结构题能 ...

  7. BZOJ 3110 树套树 && 永久化标记

    感觉树套树是个非常高深的数据结构.从来没写过 #include <iostream> #include <cstdio> #include <algorithm> ...

  8. 【BZOJ-1452】Count 树状数组 套 树状数组

    1452: [JSOI2009]Count Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1769  Solved: 1059[Submit][Stat ...

  9. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...

随机推荐

  1. 一个经典的PHP加密解密算法authcode

    项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理.最常见的应用在用户登录以及一些API ...

  2. HIS系统患者实体OO设计的一点思考

    软件开发的生命周期中,数据库建模后,在某个数据库系统中形成相对应的表,之后再根据数据库模型设计相关的业务对象及其关系.这其实是进行了两次设计,一次是数据库模型设计,数据库模型设计是根据现实业务提取出来 ...

  3. python爬虫:爬取慕课网视频

    前段时间安装了一个慕课网app,发现不用注册就可以在线看其中的视频,就有了想爬取其中的视频,用来在电脑上学习.决定花两天时间用学了一段时间的python做一做.(我的新书<Python爬虫开发与 ...

  4. 第六章P2P技术及应用

    第六章P2P技术及应用 P2P技术在我们日常生活中非常实用,例如我们常用的QQ.PPLive.BitTorrent就是基于P2P技术研发.下面将本章中的重点内容进行归纳. 文章中的Why表示产生的背景 ...

  5. windows下Mongodb图形化工具安装及配置

    接上篇文章<Windows下Mongodb安装部署.docx> 一.RockMongo 1.RockMongo需要php环境,首先需要搭建php环境,选择采用 下载xampp,这里我用的是 ...

  6. Java Monitoring&Troubleshooting Tools

    JDK Tools and Utilities Monitoring Tools You can use the following tools to monitor JVM performance ...

  7. Machine Learning笔记整理 ------ (一)基本概念

    机器学习的定义:假设用P来评估计算机程序在某任务类T上的性能,若一个程序通过利用经验E,使其在T中任务获得了性能改善,我们则说关于任务类T和P,该程序对经验E进行了学习(Mitchell, 1997) ...

  8. 二分图最大匹配模版 m√(n) 复杂度

    周大爷在比赛中搜到的黑科技二分图模版,复杂度为m√(n): 注意:点的序号要从0开始! 需要把nx,ny都赋值为n(点数) ; *; struct Edge { int v; int next; } ...

  9. ThinkPHP - 6 - 学习笔记(2015.5.4)

    解决:OneThink 站点无法被友言uyan后台识别 打开友言uyan插件功能,但OneThink站点无法被友言uyan后台检测到.页面生成的uyan代码为: <!-- UY BEGIN -- ...

  10. mongoDB操作2

    一.find操作 MongoDB中使用find来进行查询,通过指定find的第一个参数可以实现全部和部分查询. 1.查询全部 空的查询文档{}会匹配集合的全部内容.如果不指定查询文档,默认就是{}. ...