一个压了很久的题目,确实很难想,看了别人的做法后总算明白了。
首先要明白一点,因为题目说明了不会有矛盾,所以题目给出来的区间是不能相交的,否则是矛盾的。(原因自己想)
然后既然区间只能是包含的,就很明显了,一个数被包含了几次它就要比最高的牛矮多少。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=1e4+9; struct D { int l,r; bool operator <(const struct D & xx) const { if(l==xx.l) return r<xx.r; return l<xx.l; } }qry[maxn]; int dp[maxn]; int main() { int n,m,h,r; scanf("%d %d %d %d",&n,&m,&h,&r); for(int i=1;i<=r;i++) { scanf("%d %d",&qry[i].l,&qry[i].r); if(qry[i].l>qry[i].r) swap(qry[i].l,qry[i].r); } sort(qry+1,qry+1+r); qry[0].l=0; for(int i=1;i<=r;i++) { if(qry[i].l==qry[i-1].l&&qry[i].r==qry[i-1].r) continue; dp[qry[i].l+1]--; dp[qry[i].r]++; } int ret=0; for(int i=1;i<=n;i++) { ret+=dp[i]; printf("%d ",ret+h); } return 0; }