题意:(N(N<=10000))头牛站成一排,已知最高的牛的编号num以及身高H,还知道m对牛的关系(如a,b表示第a头牛与第b头牛之间的牛都比a,b两头牛要矮),求每头牛的最高身高.
分析:对于已知的一对牛a,b,我们让第a+1到b-1头牛的身高全部减1即可,但每次这样操作显然会超时,所以考虑用一个数组d来记录,对于每一对关系,令d[a+1]-1,d[b]+1即可.最后的答案就是d数组的前缀和加上H.
注意一个细节,有可能会有重复的关系,所以搞一个map来记录一下.
//#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
inline int read() {
int x=0,o=1;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')o=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*o;
}
const int N=1000005;
int d[N],sum[N];
map<pair<int,int>,bool>Map;
int main(){
int n=read(),num=read(),H=read(),m=read();
for(int i=1;i<=m;++i){
int a=read(),b=read();
if(a>b)swap(a,b);
if(Map[make_pair(a,b)])continue;
Map[make_pair(a,b)]=true;
d[a+1]--;d[b]++;
}
for(int i=1;i<=n;++i){
sum[i]=sum[i-1]+d[i];
printf("%d
",sum[i]+H);
}
return 0;
}