前言

巨佬说:要有线段树,结果蒟蒻打了一棵树状数组...

想想啊,奶牛都开公司当老板了,我还在这里码代码,太失败了。

话说奶牛开个公司老板不应该是FarmerJohn吗?

题解

刚看到这道题的时候竟然没有想到深搜,然后仔细一想,发现果然要用深搜。

但是这个树形结构怎么维护是一个问题?难道打个欧拉序...

其实做法非常简单,首先按照套路我们把牛的能力值离散化(由于没有相同的值,所以这个离散化非常简单)。

然后重点来了,建立一个维护某一能力值牛的个数的树状数组

我们深搜到一个点的时候,我们不希望计算的部分是比它大的祖先,而希望计算的部分是比它大的儿子。

于是我们在搜到这个点的时候将它的答案减去当前树状数组里能力值比它大的牛的个数(减去祖先部分),然后我们搜索它的所有儿子。

搜索完成后,我们将它的答案加上当前树状数组里比它大的牛的个数(加上儿子和祖先部分)。所以一加一减只剩下儿子的部分。

然后输出我们的答案数组,就AC了。

代码

#include <cstdio>
#include <algorithm>
#define ll long long using namespace std; ll read(){
ll x = 0; int zf = 1; char ch = ' ';
while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
if (ch == '-') zf = -1, ch = getchar();
while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); return x * zf;
} struct Edge{
int to, next;
} edges[200005]; int head[100005], edge_num = 0; void addEdge(int from, int to){
edges[++edge_num] = (Edge){to, head[from]};
head[from] = edge_num;
} int n; namespace FenTree{
#define lowbit(x) (x&-x)
int BIT[100005];
int query(int i){
int res = 0;
for ( ; i; i -= lowbit(i)) res += BIT[i]; return res;
}
void add(int i){
for ( ; i <= n; i += lowbit(i)) ++BIT[i];
}
#undef lowbit
}; using namespace FenTree; int p[100005], dy[100005];
int ans[100005]; bool Comp(const int &a, const int &b){return p[a] > p[b];}; void DFS(int u, int fa){
ans[u] -= query(p[u]);
for (int c_e = head[u]; c_e; c_e = edges[c_e].next)
if (edges[c_e].to != fa) DFS(edges[c_e].to, u);
ans[u] += query(p[u]); add(p[u]);
} int main(){
n = read();
for (int i = 1; i <= n; ++i) p[i] = read(), dy[i] = i;
sort(dy + 1, dy + n + 1, Comp);
for (int i = 1; i <= n; ++i) p[dy[i]] = i;
for (int i = 2; i <= n; ++i){int x = read(); addEdge(i, x), addEdge(x, i);}
DFS(1, 1);
for (int i = 1; i <= n; ++i) printf("%d\n", ans[i]);
return 0;
}

[USACO17JAN]Promotion Counting 题解的更多相关文章

  1. 线段树合并 || 树状数组 || 离散化 || BZOJ 4756: [Usaco2017 Jan]Promotion Counting || Luogu P3605 [USACO17JAN]Promotion Counting晋升者计数

    题面:P3605 [USACO17JAN]Promotion Counting晋升者计数 题解:这是一道万能题,树状数组 || 主席树 || 线段树合并 || 莫队套分块 || 线段树 都可以写..记 ...

  2. Luogu3605 [USACO17JAN]Promotion Counting晋升者计数

    Luogu3605 [USACO17JAN]Promotion Counting晋升者计数 给一棵 \(n\) 个点的树,点 \(i\) 有一个权值 \(a_i\) .对于每个 \(i\) ,求 \( ...

  3. 树状数组 P3605 [USACO17JAN]Promotion Counting晋升者计数

    P3605 [USACO17JAN]Promotion Counting晋升者计数 题目描述 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训--牛是可怕的管理者! 为了方便,把奶牛从 ...

  4. 洛谷P3605 [USACO17JAN] Promotion Counting 晋升者计数 [线段树合并]

    题目传送门 Promotion Counting 题目描述 The cows have once again tried to form a startup company, failing to r ...

  5. 题解 P3605 [USACO17JAN]Promotion Counting P

    分块\(yyds\) ----关于线段树合并的题我用分块过掉这件事 题目传送门 先说正解 正解当然是线段树合并等一类做法了 至于解析...出门右转题解区第一篇 (就是他让我看不懂,然后用分块打的\(Q ...

  6. 题解 P3605 【[USACO17JAN]Promotion Counting晋升者计数】

    这道题开10倍左右一直MLE+RE,然后尝试着开了20倍就A了...窒息 对于这道题目,我们考虑使用线段树合并来做. 所谓线段树合并,就是把结构相同的线段树上的节点的信息合在一起,合并的方式比较类似左 ...

  7. [USACO17JAN]Promotion Counting晋升者计数

    题目描述 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训--牛是可怕的管理者! 为了方便,把奶牛从 1 \cdots N(1 \leq N \leq 100, 000)1⋯N(1≤N ...

  8. luogu P3605 [USACO17JAN]Promotion Counting晋升者计数

    题目链接 luogu 思路 可以说是线段树合并的练手题目吧 也没啥说的,就是dfs,然后合并... 看代码吧 错误 和写主席树错的差不多 都是变量写错.... 代码 #include <bits ...

  9. P3605 [USACO17JAN]Promotion Counting晋升者计数

    思路 线段树合并的板子.. 和子节点合并之后在值域线段树上查询即可 代码 #include <cstdio> #include <algorithm> #include < ...

随机推荐

  1. Pager

    jQuery var Pager = function (ops) { this._ops = { count: ops.count || 0, selectedIndex: ops.selected ...

  2. cocos2dx基础篇(12) 编辑框之一CCTextFieldTTF

    前面我们讲了精灵贴图.标签.菜单.按钮.感觉似乎少了点什么?UI控件里是不是应该还有一个很重要的控件--编辑框.在手机网游中,启动游戏,过了开场动画后,基本上显示的第一个界面应该就是游戏的登录界面了吧 ...

  3. Vue-cli项目与element导航菜单控件的结合使用以及遇到的问题

    1.基本使用 第一种常用写法:导航菜单与 router-view 的配合使用 将所用的导航菜单数据编写成一个数组的形式,提高维护性: 在utils工具文件夹中建立utils.js文件: import ...

  4. vue 格式化时间的插件库

    格式化时间的插件库 点击进入 moment.js网址 ,在这里可以找到需要引入的script标签 点击进入 moment.js的文档 在文档中可以找到对应的格式和例子 此文来源于: https://w ...

  5. 多线程16-SpinWait

        );             isCompleted = ));             isCompleted = );             isCompleted = true;    ...

  6. [转帖]K8s集群安装--最新版 Kubernetes 1.14.1

    K8s集群安装--最新版 Kubernetes 1.14.1 http://www.cnblogs.com/jieky/p/10679998.html 原作者写的比较简单 大略流程和跳转的多一些 改天 ...

  7. IF条件控制

    条件控制 定义 Python 条件语句是通过一条或多条语句的执行结果(True 或者 False)来决定执行的代码块. 如下图所示 IF语句 if condition_1: statement_blo ...

  8. Square HDU 1518 搜索

    Square HDU 1518 搜索 题意 原题链接 给你一定若干个木棒,让你使用它们组成一个四边形,要求这些木棒必须全部使用. 解题思路 木棒有多种组合方式,使用搜索来进行寻找,这里需要进行优化,不 ...

  9. html5酷炫效果链接收集

    HTML5 3D图片相册图片轮播动画   http://www.html5tricks.com/demo/html5-3d-gallery-animation/index.html 36种漂亮的CSS ...

  10. Spring的底层实现机制

    Spring的底层实现机制是通过Demo4j+java反射机制实现的. 使用demo4j来解析xml,使用反射机制实例化bean.