Light OJ 1089 Points in Segments (II)

醉酒当歌 提交于 2019-12-26 18:19:43

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 }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!