题意: 给定n个数,求ans[i].ans[i]表示比i小且二者不存在矛盾的数的数量.
给定m对关系,表示两个数之间有矛盾.
思路: 我直接树状数组维护不就完了,这个矛盾不知道怎么处理。
但是冷静分析,可以在输入m对关系的时候预处理一下,提前存储比x小的且有矛盾的数。
ans[i] = sum(a[i] - 1) - cnt[i].
二分和树状数组都可.
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int n,m,k,T;
int a[N];
int b[N];
int cnt[N]; //表示有多少个数小于a[i]
int main(void)
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;++i)
{
cin>>a[i]; b[i] = a[i];
}
sort(b+1,b+n+1);
while(m--)
{
int x,y; cin>>x>>y;
if(a[x] > a[y]) cnt[x] ++ ; //排序后y在x前边
else if(a[x] < a[y]) cnt[y] ++ ;
}
for(int i=1;i<=n;++i)
{
int idx = lower_bound(b+1,b+n+1,a[i]) - b;
printf("%d ",idx - cnt[i] - 1);
}
return 0;
}