题面

Solution:

板子不解释

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring> using namespace std; namespace io {
char buf[1<<21], *pos = buf, *end = buf;
inline char getc()
{ return pos == end && (end = (pos = buf) + fread(buf, 1, 1<<21, stdin), pos == end) ? EOF : *pos ++; }
inline int rint() {
register int x = 0, f = 1; register char c;
while (!isdigit(c = getc())) if (c == '-') f = -1;
while (x = (x << 1) + (x << 3) + (c ^ 48), isdigit(c = getc()));
return x * f;
}
}
using io::rint; const int N = 1e5 + 1; int n, ans[N];
int Ht[N], a[N], SIZE;
int size[N<<6], rt[N], cnt, ls[N<<6], rs[N<<6];//线段树合并一般<<6位 int head[N], nxt[N<<1], ver[N<<1], tot;
void addEdge(int u, int v)
{ ver[++tot] = v, nxt[tot] = head[u], head[u] = tot; } void pushup(int x)
{ size[x] = size[ls[x]] + size[rs[x]]; } void insert(int &x, int lval, int rval, int val) {
x = ++cnt;
if (lval == rval) { size[x] ++; return; }
int mid = lval + rval >> 1;
if (val <= mid) insert(ls[x], lval, mid, val);
else insert(rs[x], mid+1, rval, val);
pushup(x);
} int query(int x, int lval, int rval, int Left, int Right) {
if (!x) return 0;
if (Left <= lval && rval <= Right) return size[x];
int mid = lval + rval >> 1;
int sum = 0;
if (Left <= mid) sum += query(ls[x], lval, mid, Left, Right);
if (mid < Right) sum += query(rs[x], mid + 1, rval, Left, Right);
return sum;
} int merge(int x, int y) {
if ((!x) || (!y)) return x + y;
ls[x] = merge(ls[x], ls[y]);
rs[x] = merge(rs[x], rs[y]);
pushup(x);
return x;
} void DFS(int u, int fa) {
insert(rt[u], 1, SIZE, a[u]);
for (int i = head[u]; i; i = nxt[i]) if (ver[i] != fa) DFS(ver[i], u);
for (int i = head[u]; i; i = nxt[i]) if (ver[i] != fa) rt[u] = merge(rt[u], rt[ver[i]]);
ans[u] = query(rt[u], 1, SIZE, a[u]+1, SIZE);
} int main() {
freopen("BZOJ4756.in", "r", stdin);
freopen("BZOJ4756.out", "w", stdout); n = rint();
for (int i = 1; i <= n; ++ i) a[i] = Ht[i] = rint();
for (int i = 2; i <= n; ++ i) {
int fa = rint();
addEdge(fa, i);
addEdge(i, fa);
} sort(Ht + 1, Ht + 1 + n);
SIZE = unique(Ht + 1, Ht + 1 + n) - Ht - 1;
for (int i = 1; i <= n; ++ i) a[i] = lower_bound(Ht + 1, Ht + 1 + n, a[i]) - Ht; DFS(1,0); for (int i = 1; i <= n; ++ i) printf("%d\n", ans[i]);
}

[模板]BZOJ4756线段树合并的更多相关文章

  1. P4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并 (树上差分+线段树合并)

    显然的树上差分问题,最后要我们求每个点数量最多的物品,考虑对每个点建议线段树,查询子树时将线段树合并可以得到答案. 用动态开点的方式建立线段树,注意离散化. 1 #include<bits/st ...

  2. luoguP4556 [Vani有约会]雨天的尾巴 /【模板】线段树合并 (线段树-权值-动态开点,树链剖分)

    中学毕业了,十七号就要前往武汉报道.中学的终点是武汉大学,人生的终点却不是,最初的热情依然失却,我还是回来看看这分类排版皆惨淡的博客吧,只是是用来保存代码也好.想要换一个新博客,带着之前的经验能把它整 ...

  3. [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并)

    [BZOJ 1483] [HNOI2009] 梦幻布丁 (线段树合并) 题面 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1 ...

  4. BZOJ4756:[USACO]Promotion Counting(线段树合并)

    Description n只奶牛构成了一个树形的公司,每个奶牛有一个能力值pi,1号奶牛为树根. 问对于每个奶牛来说,它的子树中有几个能力值比它大的. Input n,表示有几只奶牛 n<=10 ...

  5. 模板—字符串—后缀自动机(后缀自动机+线段树合并求right集合)

    模板—字符串—后缀自动机(后缀自动机+线段树合并求right集合) Code: #include <bits/stdc++.h> using namespace std; #define ...

  6. BZOJ4756: [Usaco2017 Jan]Promotion Counting(线段树合并)

    题意 题目链接 Sol 线段树合并板子题 #include<bits/stdc++.h> using namespace std; const int MAXN = 400000, SS ...

  7. 有趣的线段树模板合集(线段树,最短/长路,单调栈,线段树合并,线段树分裂,树上差分,Tarjan-LCA,势能线段树,李超线段树)

    线段树分裂 以某个键值为中点将线段树分裂成左右两部分,应该类似Treap的分裂吧(我菜不会Treap).一般应用于区间排序. 方法很简单,就是把分裂之后的两棵树的重复的\(\log\)个节点新建出来, ...

  8. 【dsu || 线段树合并】bzoj4756: [Usaco2017 Jan]Promotion Counting

    调半天原来是dsu写不熟 Description The cows have once again tried to form a startup company, failing to rememb ...

  9. bzoj 2243 [SDOI2011]染色(树链剖分+线段树合并)

    [bzoj2243][SDOI2011]染色 2017年10月20日 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询 ...

随机推荐

  1. 【luogu P3384 树链剖分】 模板

    题目链接:https://www.luogu.org/problemnew/show/P3384 诶又给自己留了个坑..不想写线段树一大理由之前的模板变量名太长 #include <cstdio ...

  2. static函数

    C语言中使用静态函数的好处:      静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多.       关键字“static”,译成中文就是“静态 ...

  3. VMware虚拟机修改BIOS启动项

    vmware默认是硬盘启动,要进bios里面设置成开机的启动顺序,要将光盘设置成第一启动项.但vm的开机画面比笔记本的还要快很多,基本都在1s内的,想进入 bios里面也有难度.. 对于网上说的开vm ...

  4. js 防抖 节流 JavaScript

    实际工作中,通过监听某些事件,如scroll事件检测滚动位置,根据滚动位置显示返回顶部按钮:如resize事件,对某些自适应页面调整DOM的渲染:如keyup事件,监听文字输入并调用接口进行模糊匹配等 ...

  5. React中需要多个倒计时的问题

    最近有一个需求是做一个闪购列表,列表中每一个商品都有倒计时,如果每一个倒计时都去生成一个setTimeout的话,一个页面就会有很多定时器,感觉这种做法不是非常好,于是换了一个思路. 思路是这样的,一 ...

  6. C++继承和派生练习(一)--关于从people(人员)类派生出student(学生)类等

    . 从people(人员)类派生出student(学生)类 添加属性:班号char classNO[]:从people类派生出teacher(教师)类, 添加属性:职务char principalsh ...

  7. PP: 混合生产方式(MTO与MTS为例)(转)

    http://blog.sina.com.cn/s/blog_4c01b7650100yf1d.html PP: 混合生产方式(MTO与MTS为例) 一.业务概览某公司生产的同一种产品正常情况下客户无 ...

  8. Win7下如何安装python pygame的whl包

    看了小甲鱼的python教程,对那个python版本的打飞机游戏很感兴趣,尝试运行,居然报错了,提示缺少pygame包: 仔细一看需要安装一个pygame的包,默认安装好python是不包括这个包的, ...

  9. thinkphp 3.2中依靠关联模型来关联三个表

    这里说的是用thinkphp3.2关联模型关联三个表 根据用户表查询出三个表的数据,需要两个model来配合,第一个model是根据user表来查询到班级的信息,然后第二个model是根绝banji中 ...

  10. Scala语法(二)

    (1)类,对象 //定义类(属性.方法),实例化对象 class counter{ *//主构造器 class counter(name:String,mode:Int){ ... } 实例化:val ...