首页 > TAG信息列表 > USACO17JAN

P3605 [USACO17JAN]Promotion Counting P 题解

solution 考虑权值线段树合并:首先离散化,然后对于一个节点,我们将它的所有子树合并上来,并统计所有能力指数的个数(权值线段树基本操作),查询时只需查询 \(p_i+1\sim n\) 的和即可 code #include <bits/stdc++.h> #define Tp template<typename Ty> #define Ts template<typename Ty,typ

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

P3605 [USACO17JAN]Promotion Counting P

题意: 大概是给定一个有\(n\)个节点的树,每个节点都有个权值\(p[i]\),需要求出每个节点的逆序对,逆序对当且仅当该点比其子节点的数大,问每个节点有几对逆序对?(\(n\leq10^5,p[i]\leq10^9\)) 题解: 我们遍历每个节点,先减去已经插入树状数组中的逆序对,因为已经插入的不是他的子节点不记录

洛谷 P3609 [USACO17JAN]Hoof, Paper, Scissor蹄子剪刀…

题目链接 dp[i][j][k] 表示 到第i局,总共变化 j次, 最后出 k的最多赢次数 枚举前一局的出的手 t, 考虑与前一局有没有变化即可转移 非常朴素的DP [Code] #include <bits/stdc++.h> using namespace std; int read(){ int x=0,flag=1; char c; for(c=getchar();!isdigit(c

USACO17JAN Hoof, Paper, Scissor

题目传送门 这种\(DP\)能有蓝题?反正我是不信 状态 f[i][j][k] 表示当前是第\(i\)局,已经变了\(j\)次手势,当前的手势是\(k\),之后能赢多少场 转移 用一种类似后缀和的方式,记录下如果当前变为该手势,则之后能赢多少局(其实这步并不必要,但我觉得更好理解一些) 之后疯狂判断就好了 f[i][j]

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

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

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

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

[USACO17JAN]Balanced Photo平衡的照片 (树状数组)

题目链接 Solution 先离散化,然后开一个大小为 \(100000\) 的树状数组记录前面出现过的数。 然后查询 \((h[i],n]\) 即可. 还要前后各做一遍。 Code #include<bits/stdc++.h> #define N 200008 #define ll long long using namespace std; void in(ll &x) { char ch=getchar();

[USACO17JAN] 晋升者计数 dfs序+树状数组

[USACO17JAN] 晋升者计数 dfs序+树状数组 题面 洛谷P3605 题意:一棵有点权的树,找出树中所有\((u,v)\)的对数,其中\(u,v\)满足\(val(u)\le val(v)\)并且\(u\)为\(v\)的祖先。 本来想用dfs序+主席树做,每次查询\(u\)在其子树的大小排名,但是因为不熟写挂了,以后填坑 瞄了一眼题解,发现树状

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(

Luogu3605 [USACO17JAN]Promotion Counting晋升者计数

\(\verb|Luogu3605 [USACO17JAN]Promotion Counting晋升者计数|\) 给一棵 \(n\) 个点的树,点 \(i\) 有一个权值 \(a_i\) 。对于每个 \(i\) ,求 \(\displaystyle\sum_{j\in subtree(i)}{[a_i<a_j]}\) \(n\leq10^5,\ fa_i<i\) 树状数组 树上逆序对?一眼线段树合并、、、空间没毛病、