P3605 [USACO17JAN]Promotion Counting P dfs序
传送门
文章目录
- 题意:
- 思路:
题意:
思路:
这个题可以用各种姿势a掉,树启和线段树合并都可以,比较无脑。下面给一个解决这种问题比较巧妙的做法。
考虑暴力怎么写,我们先将每个点的权值离散化一下,每到一个点就把树状数组清空,让后在树状数组中加上这个子树的值,用树状数组查询pj>pip_j>p_ipj>pi的数量。
我们优化以上算法,还是先离散化,也是用到了树状数组。
考虑对于一个点,当dfsdfsdfs遍历这个点会遍历两次 ,第一次是从父亲节点到这个点,第二次是从他的子节点回溯回来。我们在回溯的时候加上这个节点的权值,那么当回溯到这个点的时候,树状数组中存的值包含了以这个点为根的子树的全部权值,当然里面可能还有别的点的值(即"垃圾"值),如果我们按照之前一遍一清空的话复杂度是O(n2)O(n^2)O(n2)的,我们就是要优化这里。现在想想,如果能把树状数组中那些”垃圾“值减去不就行了吗?我们如何才能知道那些值呢?我们惊奇的发现第一次到这个点的时候树状数组中存的不就是这个值嘛?所以我们定义一个ansansans,第一次到这个点的时候减去sum(se)−sum(a[u])sum(se)-sum(a[u])sum(se)−sum(a[u]),回溯的时候加上sum(se)−sum(a[u])sum(se)-sum(a[u])sum(se)−sum(a[u])即可,这个时候即为答案啦。
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
#define lowbit(x) ((x)&(-x))
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,M=N*2,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,se;
int a[N];
vector<int>v;
int tr[N];
int e[M],ne[M],h[N],idx;
int ans[N];void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}void addd(int x,int c)
{for(int i=x;i<=se;i+=lowbit(i)) tr[i]+=c;
}int sum(int x)
{int ans=0;for(int i=x;i;i-=lowbit(i)) ans+=tr[i];return ans;
}int find(int x)
{return lower_bound(v.begin(),v.end(),x)-v.begin();
}void dfs(int u)
{ans[u]-=sum(se)-sum(a[u]);for(int i=h[u];~i;i=ne[i]) { int ver=e[i]; dfs(ver); }ans[u]+=sum(se)-sum(a[u]);addd(a[u],1);
}int main()
{// ios::sync_with_stdio(false);
// cin.tie(0);scanf("%d",&n);memset(h,-1,sizeof(h)); idx=0;for(int i=1;i<=n;i++) scanf("%d",&a[i]),v.pb(a[i]);sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end());se=v.size();for(int i=1;i<=n;i++) a[i]=find(a[i])+1;for(int i=2;i<=n;i++){int x; scanf("%d",&x);add(x,i);}dfs(1);for(int i=1;i<=n;i++) printf("%d\n",ans[i]);return 0;
}
/**/
P3605 [USACO17JAN]Promotion Counting P dfs序相关推荐
- P3605 [USACO17JAN]Promotion Counting P(树状数组)
解析 做法很多的一道题 sol1 先求出dfs序,离线下来,然后按权值大小的顺序统计答案并插到对应的dfs序中 sol2 离散化后,dfs过程中动态维护树状数组,利用前后差值求出答案 sol3 树上d ...
- P3605 [USACO17JAN]Promotion Counting晋升者计数
思路 线段树合并的板子.. 和子节点合并之后在值域线段树上查询即可 代码 #include <cstdio> #include <algorithm> #include < ...
- [USACO17JAN]Promotion Counting 题解
前言 巨佬说:要有线段树,结果蒟蒻打了一棵树状数组... 想想啊,奶牛都开公司当老板了,我还在这里码代码,太失败了. 话说奶牛开个公司老板不应该是FarmerJohn吗? 题解 刚看到这道题的时候竟然 ...
- 【BZOJ2434】[NOI2011]阿狸的打字机 AC自动机+DFS序+树状数组
[BZOJ2434][NOI2011]阿狸的打字机 Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P ...
- A and B and Lecture Rooms CodeForces - 519E LCA+dfs序
看到这个题的第一个思路就是就是统计以每一个点为根的所有节点个数,然后具体就分情况讨论一下即可. 因为刚刚学习了dfs序,这个题就用了dfs序来通过进出时间戳来相减表示其为根的子节点个数. 分情况 我们 ...
- POJ - 2763 Housewife Wind LCA+dfs序+线段树
q次询问求两个点之间的距离,并且可以随时修改某条边的长度,最短距离可以用lca来求,但是树上维护每一个点到root的距离必须要用dfs序来记录时间戳,在dfs的时候顺便记录每一条边(u,v)对应的v节 ...
- New Year Tree(dfs序+线段树+二进制)
题意: 给出一棵 n个节点的树,根节点为 1.每个节点上有一种颜色 ci.m次操作.操作有两种: 1 u c:将以 u为根的子树上的所有节点的颜色改为c. 2 u:询问以 u为根的子树上的所有节点的颜 ...
- [codeforces] 383C Propagating tree(dfs序+线段树)
题意: 给你一棵n个结点的树, 以1为根.每个结点有点权.有m次操作: 1.x结点权值 +val,x的儿子权值 −val,x的孙子们 +val,以此类推. 2.询问x的点权: 题解: 我们首先跑一边d ...
- 求和(dfs序+线段树)
题意: 已知有n个节点,有n−1条边,形成一个树的结构. 给定一个根节点k,每个节点都有一个权值,节点i的权值为vi. 给m个操作,操作有两种类型: 1 a x :表示将节点a的权值加上x 2 a ...
最新文章
- 菜鸟学习.Net的感想!
- 图解 | 你管这破玩意儿叫网络?
- freeRtos学习笔(2)任务管理
- AutoLayouterLib第一版基本完成
- Linux 下的/usr/bin /usr/sbin /usr/local/bin /usr/local/sbin区别
- bootstrap-模态框
- JavaScript学习笔记之BOM篇,认识几种常见的浏览器对象
- Windows 10系统 装Ubuntu,亲测有效
- 绝对定位元素、浮动元素会生成一个块级框
- shopex 小知识
- pdf转的html 360看不了,360浏览器看不了pdf
- 【怎么用系列】我将收藏的微信公众号文章全部清空了——个人“去微信化”活动
- 信用卡账单采集解析系统设计
- 详解薄膜缺陷检测系统原理及功能
- 【pygame游戏】用Python实现一个蔡徐坤大战篮球的小游戏,可还行?【附源码】
- 新型能力的识别与确定
- Mac 远程登陆阿里云服务器
- Thinkphp5实战之留言板
- CodeSoft模板问题--字体扭曲条码无法扫描
- SQL Server聚集索引和非聚集索引
热门文章
- vue 日期格式化返回指定个数月份_vue过滤器实现日期格式化的案例分析
- 怎么做图片文字二维码一起_怎么做?才能让文字编排更出彩
- 如何优雅地向导师/老板表示:“上周工作没什么进展”?
- 听说你趁我不在家,欺负我老婆?
- 如果这个世界都不按套路出牌将会变成怎么样。。。 | 今日最佳
- 从生物神经网络到人工神经网络
- sql两个列值以下划线拼接得到一个新的列_面试必备sql知识点——MySQL基础
- python的缩进机制是其缺点之一_Python 的缩进是不是反人类的设计?
- socket python json_python实现的基于TCP的JSON数据通信
- html2canvas改成同步,html2canvas转为图片异步转同步问题(记录)