[bzoj4140] 共点圆加强版

  就是2961的强制在线版...

  那就二进制分组了..不过我没有每次重新建,而是直接把两组的凸包合并起来..这样修改部分就只有一个log了。。。不过每次询问还是要两个log的

  空间有点卡。。

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<cmath>
  6 #include<cstdlib>
  7 #include<queue>
  8 #define ll long long
  9 #define ui unsigned int
 10 #define d double
 11 using namespace std;
 12 const int maxn=500023;const d eps=1e-7;
 13 struct zsp{d x,y;}p[maxn];int np;
 14 struct zstb{int l,r;}stb[maxn],xtb[maxn];int _num;
 15 int st[maxn],TOP,prest[maxn];d tbk[maxn];
 16 int _st[maxn],_sz[maxn],_top;
 17 int i,j,k,n,m; d NX,NY;
 18  
 19   
 20 int ra,fh;char rx;
 21 inline int read(){
 22     rx=getchar(),ra=0,fh=1;
 23     while(rx!='-'&&(rx<'0'||rx>'9'))rx=getchar();
 24     if(rx=='-')fh=-1,rx=getchar();
 25     while(rx>='0'&&rx<='9')ra=ra*10+rx-48,rx=getchar();return ra*fh;
 26 }
 27  
 28 inline d max(d a,d b){return a>b?a:b;}
 29 inline d min(d a,d b){return a<b?a:b;}
 30 inline d getk(int a,int b){return (p[b].y-p[a].y)/(p[b].x-p[a].x);}
 31 inline bool istb(int a,int b,int c,bool isstb){
 32     if(isstb)return (p[c].x-p[b].x)*(p[b].y-p[a].y) > (p[b].x-p[a].x)*(p[c].y-p[b].y);
 33     else return (p[b].x-p[a].x)*(p[c].y-p[b].y) > (p[c].x-p[b].x)*(p[b].y-p[a].y);
 34 }
 35  
 36 inline bool check(int a/*,int b*/){//µãbÔÚÔ²aÄÚ
 37 //  printf("  check:%d\n",a);
 38     return p[a].x*p[a].x+p[a].y*p[a].y +eps > (p[a].x-NX)*(p[a].x-NX)+(p[a].y-NY)*(p[a].y-NY);
 39 }
 40  
 41  
 42 inline void mergetb(int x,int y){
 43     int i,l1=stb[x].l,l2=stb[y].l,r1=stb[x].r,r2=stb[y].r,sz=r1-l1+1+r2-l2+1,now;
 44     _sz[x]+=_sz[y];
 45     memcpy(prest+l1,st+l1,(_sz[x]*2)<<2);
 46 //  printf("buildtb:");for(i=l;i<=r;i++)if(!p[dl[i]].ask)printf("    (%.2lf,%.2lf)",p[dl[i]].x,p[dl[i]].y);puts("");
 47      
 48     TOP=l1-1,stb[x].l=TOP+1;
 49     for(i=sz;i;i--){
 50         now=((l2>r2)||(l1<=r1&&p[prest[l1]].x<=p[prest[l2]].x))?prest[l1++]:prest[l2++];
 51         if(TOP>=stb[x].l&&p[st[TOP]].x==p[now].x)
 52             if(p[now].y>p[st[TOP]].y)TOP--;else continue;
 53         while(TOP>stb[x].l&&!istb(st[TOP-1],st[TOP],now,1))TOP--;
 54         st[++TOP]=now;
 55     }stb[x].r=TOP;
 56     for(i=stb[x].l;i<TOP;i++)tbk[i]=getk(st[i],st[i+1]);
 57      
 58     l1=xtb[x].l,l2=xtb[y].l,r1=xtb[x].r,r2=xtb[y].r,sz=r1-l1+1+r2-l2+1;
 59     xtb[x].l=TOP+1;
 60     for(i=sz;i;i--){
 61         now=((l2>r2)||(l1<=r1&&p[prest[l1]].x<=p[prest[l2]].x))?prest[l1++]:prest[l2++];
 62         if(TOP>=xtb[x].l&&p[st[TOP]].x==p[now].x)
 63             if(p[now].y<p[st[TOP]].y)TOP--;else continue;
 64         while(TOP>xtb[x].l&&!istb(st[TOP-1],st[TOP],now,0))TOP--;
 65         st[++TOP]=now;
 66     }xtb[x].r=TOP;
 67     for(i=xtb[x].l;i<TOP;i++)tbk[i]=getk(st[i],st[i+1]);
 68 }
 69  
 70 inline bool _check(int id){
 71     d nk=-NX/NY;int l,r,mid;
 72     if(NY<0){
 73         l=stb[id].l,r=stb[id].r-1;
 74         if(l>r||nk>=tbk[l])return check(st[l]);
 75         if(nk<=tbk[r])return check(st[r+1]);
 76         while(l<r)if(tbk[mid=l+r+1>>1]>=nk)l=mid;else r=mid-1;
 77         return check(st[l+1]);
 78     }else{
 79         l=xtb[id].l,r=xtb[id].r-1;
 80         if(l>r||nk<=tbk[l])return check(st[l]);
 81         if(nk>=tbk[r])return check(st[r+1]);
 82         while(l<r)if(tbk[mid=l+r+1>>1]<=nk)l=mid;else r=mid-1;
 83         return check(st[l+1]);
 84     }
 85     return puts("GG"),1;
 86 }
 87  
 88 int main(){
 89     n=read();bool flag=0;d mxx=-1e9,mnx=1e9;int la=0;
 90     while(n--){
 91         if(!read()){
 92             flag=1;
 93             st[++TOP]=++np,scanf("%lf%lf",&p[np].x,&p[np].y),p[np].x+=la,p[np].y+=la,
 94             mxx=max(mxx,p[np].x),mnx=min(mnx,p[np].x),
 95             _num++,stb[_num].l=stb[_num].r=xtb[_num].l=xtb[_num].r=TOP,_sz[_num]=1,
 96             _st[++_top]=_num;
 97             while(_sz[_st[_top-1]]==_sz[_st[_top]])
 98                 mergetb(_st[_top-1],_st[_top]),_top--;
 99         }else{
100             scanf("%lf%lf",&NX,&NY),NX+=la,NY+=la;
101             if(!flag){puts("No");continue;}
102             if(!NY){
103                 if(!NX)puts((la++,"Yes"));
104                 else if(NX>0)puts((mnx*2+eps<=NX)?"No":(la++,"Yes"));
105                 else puts((mxx*2>=eps+NX)?"No":(la++,"Yes"));
106                 continue;
107             }
108             for(i=1;i<=_top;i++)if(!_check(_st[i]))break;
109             puts(i>_top?(la++,"Yes"):"No");
110         }
111     }
112 //  for(i=1;i<=_top;i++){
113 //      printf("sz:%d\n",_sz[_st[i]]);
114 //      printf("stb:  ");for(j=stb[_st[i]].l;j<=stb[_st[i]].r;j++)printf("  (%.2lf,%.2lf)",p[st[j]].x,p[st[j]].y);puts("");
115 //      printf("xtb:  ");for(j=xtb[_st[i]].l;j<=xtb[_st[i]].r;j++)printf("  (%.2lf,%.2lf)",p[st[j]].x,p[st[j]].y);puts("");
116 //  }
117 }
View Code

 

posted @ 2016-12-11 17:33  czllgzmzl  阅读(382)  评论(0编辑  收藏  举报