[USACO17JAN]Promotion Counting 题解
前言
巨佬说:要有线段树,结果蒟蒻打了一棵树状数组...
想想啊,奶牛都开公司当老板了,我还在这里码代码,太失败了。
话说奶牛开个公司老板不应该是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 题解的更多相关文章
- 线段树合并 || 树状数组 || 离散化 || BZOJ 4756: [Usaco2017 Jan]Promotion Counting || Luogu P3605 [USACO17JAN]Promotion Counting晋升者计数
题面:P3605 [USACO17JAN]Promotion Counting晋升者计数 题解:这是一道万能题,树状数组 || 主席树 || 线段树合并 || 莫队套分块 || 线段树 都可以写..记 ...
- Luogu3605 [USACO17JAN]Promotion Counting晋升者计数
Luogu3605 [USACO17JAN]Promotion Counting晋升者计数 给一棵 \(n\) 个点的树,点 \(i\) 有一个权值 \(a_i\) .对于每个 \(i\) ,求 \( ...
- 树状数组 P3605 [USACO17JAN]Promotion Counting晋升者计数
P3605 [USACO17JAN]Promotion Counting晋升者计数 题目描述 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训--牛是可怕的管理者! 为了方便,把奶牛从 ...
- 洛谷P3605 [USACO17JAN] Promotion Counting 晋升者计数 [线段树合并]
题目传送门 Promotion Counting 题目描述 The cows have once again tried to form a startup company, failing to r ...
- 题解 P3605 [USACO17JAN]Promotion Counting P
分块\(yyds\) ----关于线段树合并的题我用分块过掉这件事 题目传送门 先说正解 正解当然是线段树合并等一类做法了 至于解析...出门右转题解区第一篇 (就是他让我看不懂,然后用分块打的\(Q ...
- 题解 P3605 【[USACO17JAN]Promotion Counting晋升者计数】
这道题开10倍左右一直MLE+RE,然后尝试着开了20倍就A了...窒息 对于这道题目,我们考虑使用线段树合并来做. 所谓线段树合并,就是把结构相同的线段树上的节点的信息合在一起,合并的方式比较类似左 ...
- [USACO17JAN]Promotion Counting晋升者计数
题目描述 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训--牛是可怕的管理者! 为了方便,把奶牛从 1 \cdots N(1 \leq N \leq 100, 000)1⋯N(1≤N ...
- luogu P3605 [USACO17JAN]Promotion Counting晋升者计数
题目链接 luogu 思路 可以说是线段树合并的练手题目吧 也没啥说的,就是dfs,然后合并... 看代码吧 错误 和写主席树错的差不多 都是变量写错.... 代码 #include <bits ...
- P3605 [USACO17JAN]Promotion Counting晋升者计数
思路 线段树合并的板子.. 和子节点合并之后在值域线段树上查询即可 代码 #include <cstdio> #include <algorithm> #include < ...
随机推荐
- pycharm运行测试用例遇到错误:ZeroDivisionError: float division by zero的原因
运行测试用例报错:ZeroDivisionError: float division by zero 一般是因为测试用例模块命名没有以test开头,导致unittest找不到用例,用例总数为0,导致除 ...
- [转帖]APT34攻击全本分析
APT34攻击全本分析 https://zhuanlan.kanxue.com/article-8401.htm 高手太多 我等菜鸟目不暇接.. 一.事件综述 2019年4月18日,黑客/黑客组织使用 ...
- 由于;引发的Oracle的BadSqlExecption
一.在使用单引号进行各种转换合并的时候发生的异常: 1:首先单引号的表示符为 ' 在Oracle中如果SQL语句带上了分号是会报错的, 在SQL传入进行执行的时候会报BadSQLExecption,这 ...
- 通过metaclass实现精简的ORM框架
摘抄于<python-3-廖雪峰> 使用ORM框架 class User(Model): #定义类的属性到列的映射: id = IntegerFiled('id') name = Stri ...
- python 元组及操作
# 元组是'不可变'的 list 使用小括号 创建后不允许修改 # 创建# t = ('a','b','c',1,2,3)# print(t)# print(type(t))# # 3# print( ...
- 洛谷 - P3803 -【模板】多项式乘法(FFT) - NTT
https://www.luogu.org/problemnew/show/P3803 看别人偏偏就是要用NTT去过.实验证明大概是这样用.求0~n的多项式和0~m的多项式的乘积.注意MAXN取值.A ...
- LNMP环境搭建哈哈
经过一番折腾,终于将LNMP环境搭建完成了.本文介绍的LNMP环境是在windows的Oracle VM VirtualBox中的Centos虚拟机上搭建的,各个软件的版本为:Centos7 + Ng ...
- MFC- 网络编程
一.MFC网络编程 a)CAsyncSocket用于异步非阻塞类,用UDP通信: b)CAsyncSocket的子类(派生类):Csocket同步阻塞类,用于TCP通信: c)通信前,必须调用AfxS ...
- MFC- socket 编程
一.CAsyncSocket类 CAsyncSocket属于异步非阻塞类. CAsyncSocket类采用了windows socket中的WSAAsyncSelect模型.CAsyncSocket ...
- htm、html、shtml区别。(web服务器配置ssi)
转载源:http://www.divcss5.com/html/h59.shtml 首先htm.html.shtml都是静态网页的后缀,三者也可以说都是只是扩展名不同,其他一样,都是静态的网页.Htm ...