题面

传送门

Sol

我也不知道哪里来的题目哪里来的\(OJ\)

子树变成\(DFS\)序后就是裸的树套树

# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
const int _(3e4 + 1);
typedef long long ll; IL int Input(){
RG int x = 0, z = 1; RG char c = getchar();
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
} int w[_], n, tmp1[20], tmp2[20], first[_], cnt, L[_], R[_], idx, num, rt[_];
struct Edge{
int to, next;
} edge[_ << 1];
struct Segment{
int ls, rs, sz;
} T[_ * 200]; IL void Add_Graph(RG int u, RG int v){
edge[cnt] = (Edge){v, first[u]}, first[u] = cnt++;
} IL void Dfs(RG int u, RG int ff){
L[u] = ++idx;
for(RG int e = first[u]; e != -1; e = edge[e].next)
if(edge[e].to != ff) Dfs(edge[e].to, u);
R[u] = idx;
} IL void Modify(RG int &x, RG int l, RG int r, RG int p, RG int v){
if(!x) x = ++num; T[x].sz += v;
if(l == r) return;
RG 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);
} IL void Add(RG int x, RG int v, RG int d){
for(; x <= n; x += x & -x) Modify(rt[x], 1, 10000, v, d);
} IL int QueryKth(RG int l, RG int r, RG int k){
if(l == r) return l;
RG int sum = 0, mid = (l + r) >> 1;
for(RG int i = 1; i <= tmp1[0]; ++i) sum -= T[T[tmp1[i]].ls].sz;
for(RG int i = 1; i <= tmp2[0]; ++i) sum += T[T[tmp2[i]].ls].sz;
if(k <= sum){
for(RG int i = 1; i <= tmp1[0]; ++i) tmp1[i] = T[tmp1[i]].ls;
for(RG int i = 1; i <= tmp2[0]; ++i) tmp2[i] = T[tmp2[i]].ls;
return QueryKth(l, mid, k);
}
for(RG int i = 1; i <= tmp1[0]; ++i) tmp1[i] = T[tmp1[i]].rs;
for(RG int i = 1; i <= tmp2[0]; ++i) tmp2[i] = T[tmp2[i]].rs;
return QueryKth(mid + 1, r, k - sum);
} IL int Kth(RG int l, RG int r, RG int k){
tmp1[0] = tmp2[0] = 0;
for(RG int i = l - 1; i; i -= i & -i) tmp1[++tmp1[0]] = rt[i];
for(RG int i = r; i; i -= i & -i) tmp2[++tmp2[0]] = rt[i];
return QueryKth(1, 10000, k);
} IL int QuerySum(RG int x, RG int l, RG int r, RG int ql, RG int qr){
if(!x) return 0;
if(ql <= l && qr >= r) return T[x].sz;
RG int mid = (l + r) >> 1, ret = 0;
if(ql <= mid) ret = QuerySum(T[x].ls, l, mid, ql, qr);
if(qr > mid) ret += QuerySum(T[x].rs, mid + 1, r, ql, qr);
return ret;
} IL int Sum(RG int x, RG int l, RG int r){
RG int ret = 0;
for(; x; x -= x & -x) ret += QuerySum(rt[x], 1, 10000, l, r);
return ret;
} int main(RG int argc, RG char* argv[]){
n = Input();
for(RG int i = 1; i <= n; ++i) first[i] = -1, w[i] = Input();
for(RG int i = 1; i < n; ++i){
RG int u = Input(), v = Input();
Add_Graph(u, v), Add_Graph(v, u);
}
Dfs(1, 0);
for(RG int i = 1; i <= n; ++i) Add(L[i], w[i], 1);
for(RG int q = Input(); q; --q){
RG int op = Input(), u = Input(), x = Input(), y;
if(op == 1) printf("%d\n", Kth(L[u], R[u], x));
else if(op == 2) y = Input(), printf("%d\n", Sum(R[u], x, y) - Sum(L[u] - 1, x, y));
else Add(L[u], w[u], -1), w[u] = x, Add(L[u], w[u], 1);
}
return 0;
}

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

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

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

  2. 【SYZOI Round1】滑稽的树

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

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

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

  4. 吉首大学2019年程序设计竞赛(重现赛) J 滑稽树下你和我 (递归)

    链接:https://ac.nowcoder.com/acm/contest/992/J来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K ...

  5. 【UR #17】滑稽树前做游戏

    假装看懂的样子 假装会做的样子 UOJ Round #17 题解 加上一个(t-w)^c,c是和i相连的点的度数 是一个多项式的话可以归纳证明 一些具体实现: 多项式存储,保留t,y, f=ai*t^ ...

  6. 2017-9-12 NOIP模拟赛[hkd]

    NOIP 2017 全假模拟冲刺 T1 Spfa 题目描述B 国在耗资百亿元之后终于研究出了新式武器——连环阵(Zenith ProtectedLinked Hybrid Zone).传说中,连环阵是 ...

  7. 9.12NOIP模拟题

    NOIP 2017 全假模拟冲刺                                               hkd 题目名称 Spfa 走楼梯缩小版 滑稽 题目类型 传统 传统 传统 ...

  8. 『大 树形dp』

    大 Description 滑稽树上滑稽果,滑稽树下你和我,滑稽树前做游戏,滑稽多又多.树上有 n 个节点,它们构成了一棵树,每个节点都有一个滑稽值. 一个大的连通块是指其中最大滑稽值和最小滑稽值之差 ...

  9. NOIP模拟80

    学考+OJ改名祭 T1 邻面合并 解题思路 状压 DP ...(于是贪心竟然有 60pts 的高分?? code) 状态设计的就非常妙了,如果状态是 1 就表示是一个分割点也就是一个矩形的右边界. 那 ...

随机推荐

  1. css 实现文字图片垂直对齐

    给图片使用vertical-align:middle;就可以实现 <!DOCTYPE html> <html lang="en"> <head> ...

  2. Oracle中-事务-序列-视图-数据类型笔记

    事务(Transaction) 事务(Transaction)是一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位,是数据库环境中的逻辑工作单位. 事务是为了保证数据库的完整性 在o ...

  3. CDQZ Day5

    1DP #1题目名称 题目名称匹配块路径染色输入文件名 输入文件名match.in.in.inblock.inpath.inpaint.in输出文件名 输出文件名match.out.out.out.o ...

  4. js的跨域问题和解决办法

    我们在开发中,经常会遇到跨域请求数据问题,那么什么是跨域呢?跨域就是js在不用域之间的数据传输或者通信,比如你在使用ajax从另外一个域请求数据,或者你的页面引入了iframe,要从iframe中获取 ...

  5. JAVA统计一定范围内的质数个数

    public class TestNumber{ public static void main(String[] args){ System.out.println(roundPrimeCount( ...

  6. FastDFS安装、配置、部署(一)-安装和部署 (转)

    FastDFS是一个开源的,高性能的的分布式文件系统,他主要的功能包括:文件存储,同步和访问,设计基于高可用和负载均衡,FastDFS非常适用于基于文件服务的站点,例如图片分享和视频分享网站 Fast ...

  7. JS框架设计之主流框架的引入机制DomeReady一种子模块

    DomReady其实是一种名为"DomContentLoaded"事件的名称,不过由于框架的需要,它与真正的DomContentLoaded有区别,在旧的JS书籍中m都会让我们把J ...

  8. selenium IDE 命令 一

    Actions 描述了用户所会作出的操作.Action 有两种形式: action和actionAndWait, action会立即执行,而actionAndWait会假设需要较长时间才能得到该act ...

  9. Linux下jdk安装过程

    注意:rpm 与软件相关命令 相当于 window 下的软件助手 管理软件 1 查看当前 Linux 系统是否已经安装 java 1)在命令窗口输入,可以查看系统自带的OpenJDK版本信息. jav ...

  10. 带有权重的服务器SLB的实现

    1)参考了网络上的算法,但是那个算法仅仅是用于展示“权重轮循”的意图,在真正的网络下,因为是并行的,所以不可能单纯一个简单的循环可以解决问题. 2)用lock的话性能显然有损失. 3)想了一阵,结合C ...