首页 > TAG信息列表 > P3605

P3605 [USACO17JAN]Promotion Counting P(树状数组)

题目描述 题目链接 题目分析 这种题目的一种常见解法就是树状数组(也可以用dfs序+主席树 ) 首先我们先对这棵树进行一遍dfs,用ans[]来记录答案。 当遍历到节点u时,ans[u]=树状数组中加了u的下属后比u强的 - 之前就比u强的 代码如下 #include <iostream> #include <cstdio> #inclu

P3605 [USACO17JAN]Promotion Counting P

Jennie 和常规的求逆序对差不多 在从根节点往下走的时候,我们必须要避免不在他子树内的点的影响 那就先减去他们呗。 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; template<class T> void read(T &now){ no

[线段树合并] Luogu P3605 [USACO17JAN]Promotion Counting晋升者计数

给一棵 N 个点的树,每个点有一个权值,求每个点的子树中有多少个点的权值比它大。 考虑线段树合并,将权值离散化,每个点开一棵权值线段树。 求答案时直接在权值线段树上查询,线段树合并时类似于可并堆。 要注意的是线段树要动态开点,合并时别忘了 up。 内存什么的最好算一下,数组别开小

洛谷P3605 [USACO17JAN]Promotion Counting——线段树合并

  线段树合并裸题,其实这道题就可以看作每一个点的子树中比它的点权大的值的个数。看这道题的值域范围,知道要用动态开点的线段树,然后我们可以将p数组离散化,每一个点都建一棵对应的值域线段树。最后从根节点开始遍历,回溯时将有上司和下属关系的点合并即可。 而关键是合并操作: 其

P3605 [USACO17JAN]Promotion Counting晋升者计数

思路 线段树合并的板子。。 和子节点合并之后在值域线段树上查询即可 代码 #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int MAXN = 1000100; int n,Nodecnt,root[MAXN],u[MAXN<<1],v[MAXN<<1],cnt,fir[MAXN],nxt[MAXN<<1],ans

P3605 [USACO17JAN]Promotion Counting晋升者计数

一道线段树合并的入门题 直接建一堆权值线段树然后合并就可以了 下面是代码 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cctype> #define ll long long #define gc getchar #define maxn 100005 using namespace std; inline ll read(