http://www.lightoj.com/volume_showproblem.php?problem=1089
题意很简单,就是给出一些线段和一些点,求每个点被覆盖的次数。做的时候,二分写烂了,一直超时。晕~~~
AC Code1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 #define lson l,m,rt<<1 5 #define rson m+1,r,rt<<1|1 6 #define maxn 50005 7 struct node{ 8 int cnt; 9 }setree[maxn<<2]; 10 struct op{ 11 int l,r; 12 }mes[maxn]; 13 int sorted[maxn],num[maxn]; 14 void build(int l,int r,int rt) 15 { 16 setree[rt].cnt=0; 17 if(l==r) 18 return; 19 int m=(l+r)>>1; 20 build(lson); 21 build(rson); 22 } 23 int binsearch1(int l,int r,int num) 24 { 25 int m=(l+r)>>1; 26 if(sorted[m-1]<num&&num<=sorted[m]) 27 return m; 28 if(num<=sorted[m-1]) 29 return binsearch1(l,m-1,num); 30 else 31 return binsearch1(m+1,r,num); 32 33 34 } 35 int binsearch2(int l,int r,int num) 36 { 37 int m=(l+r)>>1; 38 if(sorted[m]<=num&&num<sorted[m+1]) 39 return m; 40 if(num<sorted[m]) 41 return binsearch2(l,m-1,num); 42 else 43 return binsearch2(m+1,r,num); 44 } 45 int binsearch(int l,int r,int num) 46 { 47 int m=(l+r)>>1; 48 if(num==sorted[m]) 49 return m; 50 if(num<sorted[m]) 51 return binsearch(l,m-1,num); 52 return binsearch(m+1,r,num); 53 } 54 void pushdown(int rt) 55 { 56 if(setree[rt].cnt!=0){ 57 setree[rt<<1].cnt+=setree[rt].cnt; 58 setree[rt<<1|1].cnt+=setree[rt].cnt; 59 setree[rt].cnt=0; 60 } 61 } 62 void update(int l,int r,int rt,int L,int R) 63 { 64 if(L<=l&&r<=R){ 65 setree[rt].cnt++; 66 return; 67 } 68 int m=(l+r)>>1; 69 pushdown(rt); 70 if(L<=m) 71 update(lson,L,R); 72 if(R>m) 73 update(rson,L,R); 74 } 75 int query(int l,int r,int rt,int pos) 76 { 77 if(l==r) 78 return setree[rt].cnt; 79 int m=(l+r)>>1; 80 pushdown(rt); 81 if(pos<=m) 82 return query(lson,pos); 83 else 84 return query(rson,pos); 85 } 86 int main() 87 { 88 int t,cas=1; 89 sorted[0]=-1; 90 scanf("%d",&t); 91 while(t--){ 92 int n,q; 93 scanf("%d%d",&n,&q); 94 for(int i=1;i<=n;i++){ 95 scanf("%d%d",&mes[i].l,&mes[i].r); 96 } 97 for(int i=1;i<=q;i++){ 98 scanf("%d",&num[i]); 99 sorted[i]=num[i]; 100 } 101 sort(sorted+1,sorted+1+q); 102 int k=1; 103 for(int i=2;i<=q;i++) 104 if(sorted[i]!=sorted[i-1]) 105 sorted[++k]=sorted[i]; 106 build(1,k,1); 107 for(int i=1;i<=n;i++){ 108 if(mes[i].r<sorted[1]||mes[i].l>sorted[k]) 109 continue; 110 int l,r; 111 if(mes[i].l<=sorted[1]) 112 l=1; 113 else 114 l=binsearch1(1,k,mes[i].l); 115 if(mes[i].r>=sorted[k]) 116 r=k; 117 else 118 r=binsearch2(1,k,mes[i].r); 119 if(l<=r) 120 update(1,k,1,l,r); 121 } 122 printf("Case %d:\n",cas++); 123 for(int i=1;i<=q;i++){ 124 int pos=binsearch(1,k,num[i]); 125 printf("%d\n",query(1,k,1,pos)); 126 } 127 } 128 return 0; 129 }
来源:https://www.cnblogs.com/kim888168/archive/2013/05/06/3063933.html