博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[USACO17JAN]Promotion Counting 题解
阅读量:5317 次
发布时间:2019-06-14

本文共 1898 字,大约阅读时间需要 6 分钟。

前言

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

想想啊,奶牛都开公司当老板了,我还在这里码代码,太失败了。
话说奶牛开个公司老板不应该是FarmerJohn吗

题解

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

但是这个树形结构怎么维护是一个问题?难道打个欧拉序...
其实做法非常简单,首先按照套路我们把牛的能力值离散化(由于没有相同的值,所以这个离散化非常简单)。
然后重点来了,建立一个维护某一能力值牛的个数的。
我们深搜到一个点的时候,我们不希望计算的部分是比它大的祖先,而希望计算的部分是比它大的儿子。
于是我们在搜到这个点的时候将它的答案减去当前里能力值比它大的牛的个数(减去祖先部分),然后我们搜索它的所有儿子。
搜索完成后,我们将它的答案加上当前里比它大的牛的个数(加上儿子和祖先部分)。所以一加一减只剩下儿子的部分。
然后输出我们的答案数组,就AC了。

代码

#include 
#include
#define ll long longusing 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;}

转载于:https://www.cnblogs.com/linzhengmin/p/11129275.html

你可能感兴趣的文章
freebsd 实现 tab 命令 补全 命令 提示
查看>>
struts1和struts2的区别
查看>>
函数之匿名函数
查看>>
shell习题第16题:查用户
查看>>
实验4 [bx]和loop的使用
查看>>
Redis常用命令
查看>>
2018.11.06 bzoj1040: [ZJOI2008]骑士(树形dp)
查看>>
2019.02.15 bzoj5210: 最大连通子块和(链分治+ddp)
查看>>
redis cluster 集群资料
查看>>
微软职位内部推荐-Sr. SE - Office incubation
查看>>
微软职位内部推荐-SOFTWARE ENGINEER II
查看>>
centos系统python2.7更新到3.5
查看>>
【Quartz】常用方法的使用方式(三)
查看>>
MVVM模式下关闭窗口的实现
查看>>
C#区域截图——调用API截图
查看>>
c#与java中byte字节的区别及转换方法
查看>>
A WebBrowser Toy
查看>>
用MyXls生成Excel报表(C#)
查看>>
了解WP的传感器
查看>>
阅读笔记 火球——UML大战需求分析 2
查看>>