链接
https://www.luogu.org/problemnew/show/P2879
大意
给定一条线段,给定一些小线段,这些小线段的左右端点高度相等,中间的点都比它们矮,给定其中一个点的高度,求所有的点的最小的高度
思路
因为小线段中的点一定小于左右端点,那么我们贪心的去想,每个点都比左右端点矮1,用 来记录这个点之前有几个比它高,那么每个点的最小高度就是
那么如何标记谁比它高呢?用到了前缀和的思想,在所有左端点的右边标记-1,但是这样的话就会表示成右边的点都要比它矮了,所有还要在右端点处标记+1,这样才可以保证答案的准确性
代码
#include<cstdio>
#include<map>
using namespace std;
int s[10001],a[10001],n,p,h,m,l,r;
map<pair<int,int>,bool>ma;
signed main()
{
scanf("%d%d%d%d",&n,&p,&h,&m);
for(register int i=1;i<=m;i++)
{
scanf("%d%d",&l,&r);
if(l>r) {l^=r;r=l^r;l^=r;}
if(ma[make_pair(l,r)]) continue;
a[l+1]--;a[r]++;
ma[make_pair(l,r)]=true;
}
for(register int i=1;i<=n;i++)
{
s[i]=s[~-i]+a[i];
printf("%d\n",s[i]+h);
}
}