题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1635
解:其实它每给出一组关系x~y,都代表着x~y间的牛的最理想身高减小了1,所以我们只需用差分来维护相邻牛的关系就行,比如,f[x+1]--,f[y]++;
这里还有一个条件,就是h[y]>=h[x]但是你会发现着个条件一定是满足的,因为如果我们已经提出了x~y,就不可能有一组x1~y1,x<=x1<=y,因为x~y之间没有比它们高的牛,这也代表着,y不会再被包括在一组关系里,不会被减小。
程序:
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<cstdlib> using namespace std; struct ding{ int a,b; }p[20000]; int ans[20000],f[20000],n,x,h,m; bool cmp(const ding&c,const ding&d) {return (c.a==d.a?c.b<d.b:c.a<d.a);} int main() { scanf("%d%d%d%d",&n,&x,&h,&m); for (int i=1;i<=m;i++) scanf("%d%d",&p[i].a,&p[i].b); sort(p+1,p+1+m,cmp); for (int i=1;i<=m;i++) if (!((p[i].a==p[i-1].a)&&(p[i].b==p[i-1].b))) { f[min(p[i].a,p[i].b)+1]--; f[max(p[i].b,p[i].a)]++; } ans[x]=h; for (int i=x+1;i<=n;i++) ans[i]=ans[i-1]+f[i]; for (int i=x-1;i>=1;i--) ans[i]=ans[i+1]-f[i+1]; for (int i=1;i<=n;i++) printf("%d\n",ans[i]); return 0; }