中文的题目,题意就不说了
用线段树做了,不过有不用线段树的方法,不过我解释不来
贴代码吧
#include<iostream> #define MAXN 100010 using namespace std; int p[MAXN<<2]; void insert(int k,int s,int t,int l,int r) { if(l<=s && t<=r) { p[k]++; return ; } int kl=k<<1,kr=kl+1,mid=(s+t)>>1; if(l<=mid) insert(kl,s,mid,l,r); if(r>mid) insert(kr,mid+1,t,l,r); } void query(int k,int s,int t,int sum) { if(s==t) { if(s==1) printf("%d",sum+p[k]); else printf(" %d",sum+p[k]); return ; } int kl=k<<1,kr=kl+1,mid=(s+t)>>1; query(kl,s,mid,sum+p[k]); query(kr,mid+1,t,sum+p[k]); } int main() { int a,b,n; while(scanf("%d",&n)==1 && n) { for(int i=1;i<=n*4;i++) p[i]=0; for(int i=1;i<=n;i++) { scanf("%d %d",&a,&b); insert(1,1,n,a,b); } query(1,1,n,0); puts(""); } return 0; } --------------------------------------------------------------------------------------- #include <stdio.h> #include <string.h> #define MAXN 100010 int n,section[MAXN]; int main() { int i,j,k; while(scanf("%d",&n),n) { memset(section,0,sizeof(section)); for(k=0;k<n;k++) { scanf("%d %d",&i,&j); section[i]++; section[j+1]--; } int cnt=section[1]; printf("%d",cnt); for(i=2;i<=n;i++) { cnt += section[i]; printf(" %d",cnt); } printf("\n"); } return 0; }