bzoj 4756: [Usaco2017 Jan]Promotion Counting【dfs+树状数组】
2024-09-27 16:14:40
思路还是挺好玩的
首先简单粗暴的想法是dfs然后用离散化权值树状数组维护,但是这样有个问题就是这个全局的权值树状数组里并不一定都是当前点子树里的
第一反应是改树状数组,但是显然不太现实,但是可以这样想,就是现在统计子树之前把查到的答案减去,然后再查子树最后加上查到的答案,这样相当于去重了
方便起见,离散化的时候按从大到小的顺序,这样就变成了求比当前点小的点
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
const int N=100005;
int n,a[N],g[N],h[N],cnt,c[N],ans[N];
map<int,int>mp;
struct qwe
{
int ne,to;
}e[N<<1];
bool cmp(const int &a,const int &b)
{
return a>b;
}
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void add(int u,int v)
{
cnt++;
e[cnt].ne=h[u];
e[cnt].to=v;
h[u]=cnt;
}
void ins(int x)
{
for(int i=x;i<=n;i+=(i&(-i)))
c[i]++;
}
int ques(int x)
{
int r=0;
for(int i=x;i>=1;i-=(i&(-i)))
r+=c[i];
return r;
}
void dfs(int u)
{
ans[u]-=ques(a[u]);
for(int i=h[u];i;i=e[i].ne)
dfs(e[i].to);
ans[u]+=ques(a[u]);
ins(a[u]);
}
int main()
{
n=read();
for(int i=1;i<=n;i++)
a[i]=g[i]=read();
for(int i=2;i<=n;i++)
{
int x=read();
add(x,i);
}
sort(g+1,g+1+n,cmp);
for(int i=1;i<=n;i++)
mp[g[i]]=i;
for(int i=1;i<=n;i++)
a[i]=mp[a[i]];
dfs(1);
for(int i=1;i<=n;i++)
printf("%d\n",ans[i]);
return 0;
}
最新文章
- C语言 独木舟问题
- sqlserver锁表、解锁、查看销表 (转载)
- springmvc+spring-security+mybatis +redis +solar框架抽取
- 智慧城市的【Auth】登录对象
- [前端_EasyUI]给easyui的datebox设置默认值,获取不到 的解决方法
- 用JQUERY的deferred异步按顺序调用后端API
- Hadoop shuffle与排序
- 蓝桥杯—盾神与条状项链(C++实现)
- [转] MMO即时战斗:地图角色同步管理和防作弊实现
- 将ADS1.2的工程迁移到KEIL上-基于2440
- [js高手之路] html5 canvas系列教程 - 像素操作(反色,黑白,亮度,复古,蒙版,透明)
- ubuntu18.04 &; Windows10 双系统关机缓慢
- 使用K-means进行聚类,用calinski_harabaz_score评价聚类效果
- Python3 与 NetCore 基础语法对比(就当Python和C#基础的普及吧)
- Mac os fatal error: &#39;numpy/arrayobject.h&#39; file not found
- shell中的逻辑判断while
- IPC相关的命令
- Android——Fragment过度动画分析一(转)
- [CTSC2018]假面
- 为什么说git比svn好