http://www.lightoj.com/volume_showproblem.php?problem=1089
题意很简单,就是给出一些线段和一些点,求每个点被覆盖的次数。做的时候,二分写烂了,一直超时。晕~~~
AC Code
1 #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
