Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 14711 Accepted Submission(s):
7354
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define M 100006 5 using namespace std; 6 struct node 7 { 8 int l,r; 9 int n; 10 } ss[M*4]; 11 12 void build(int l,int r,int k) 13 { 14 ss[k].l=l; 15 ss[k].r=r; 16 ss[k].n=0; 17 if(l==r) return; 18 int mid=(l+r)/2; 19 build(l,mid,k*2); 20 build(mid+1,r,k*2+1); 21 } 22 23 void add(int l,int r,int k) 24 { 25 if(ss[k].l==l&&ss[k].r==r) 26 { 27 ss[k].n++; 28 return; 29 } 30 int mid=(ss[k].l+ss[k].r)/2; 31 if(r<=mid) add(l,r,2*k); 32 else if(l>mid) add(l,r,2*k+1); 33 else 34 { 35 add(l,mid,2*k); 36 add(mid+1,r,2*k+1); 37 } 38 } 39 40 int ans; 41 void search(int d,int k) 42 { 43 ans+=ss[k].n; 44 if(ss[k].l==ss[k].r&&ss[k].l==d) return; 45 int mid=(ss[k].l+ss[k].r)/2; 46 if(d<=mid) search(d,2*k); 47 else search(d,2*k+1); 48 } 49 50 int main() 51 { 52 int T,i,j,a,b; 53 while(~scanf("%d",&T)&&T) 54 { 55 build(1,T,1); 56 for(i=0; i<T; i++) 57 { 58 scanf("%d%d",&a,&b); 59 add(a,b,1); 60 } 61 for(i=1; i<T; i++) 62 { 63 ans=0; 64 search(i,1); 65 printf("%d ",ans); 66 } 67 ans=0; 68 search(T,1); 69 printf("%d\n",ans); 70 } 71 return 0; 72 }
2.非线段树
#include <iostream> #include <cstdio> #include <cstring> #define M 100005 using namespace std; int vis[100005]; int main() { int i,j,n,m,T; while(~scanf("%d",&T)&&T) { memset(vis,0,sizeof(vis)); for(i=0; i<T; i++) { scanf("%d%d",&n,&m); vis[n]++; vis[++m]--; } int s=0; for(i=1; i<=T; i++) { if(i!=1) printf(" "); s+=vis[i]; printf("%d",s); } printf("\n"); } return 0; }
原文:http://www.cnblogs.com/pshw/p/5284895.html