제출 #970610

#제출 시각아이디문제언어결과실행 시간메모리
970610PM1Park (BOI16_park)C++17
100 / 100
801 ms42784 KiB
#include <bits/stdc++.h> using namespace std; #define fr first #define sc second #define ll long long const int mxn=2e3+5,mxm=1e5+5,mxk=3e6,mm=1e9; int n,m,comp[mxm],cnt=0,tnc=0,par[mxm],sz[mxm],hh,ww; bool mark[mxm][5],now[7]; pair<int,int>node[mxm],q[mxm]; map<pair<int,int>,int>mp; struct yall{ int u,uu,w; }yal[mxk]; vector<int>yl,qq,ans[mxm]; struct circle{ int x,y,r; }c[mxn]; bool cmp(int x,int y){ return yal[x].w<yal[y].w; } bool cmp1(int x,int y){ return q[x].fr>q[y].fr; } void ez(int x,int y){ tnc++; yal[tnc].u=x; yal[tnc].uu=y; int r1=c[x].r,r2=(y>n)?0:c[y].r; ll xx=abs(node[x].fr-node[y].fr),yy=abs(node[x].sc-node[y].sc),dis=xx*xx+yy*yy; ll L=0,R=1e9; while(R-L>1){ ll mid=(R+L)/2; if(mid*mid>dis)R=mid; else L=mid; } yal[tnc].w=(L-r1-r2)/2; yl.push_back(tnc); } void add(int x,int y,int i,int j){ if(mp[make_pair(x,y)]==0){ mp[make_pair(x,y)]=++cnt; node[cnt]=make_pair(x,y); par[cnt]=cnt; sz[cnt]=1; mark[cnt][j]=1; } ez(i,mp[make_pair(x,y)]); } void make_yal(){ for(int i=1;i<=n;i++){ par[i]=i; sz[i]=1; node[i]=make_pair(c[i].x,c[i].y); add(c[i].x,hh,i,3); add(c[i].x,0,i,1); add(ww,c[i].y,i,2); add(0,c[i].y,i,4); } for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ ez(i,j); } } sort(yl.begin(),yl.end(),cmp); } int getpar(int x){ return (par[x]==x)?x:par[x]=getpar(par[x]); } void dsu(int i){ int x=yal[i].u,y=yal[i].uu; int z=getpar(x),w=getpar(y); if(z==w)return; if(sz[z]<sz[w])swap(z,w); par[w]=z; sz[z]+=sz[w]; for(int j=1;j<=4;j++){ mark[z][j]|=mark[w][j]; } if(mark[z][1]&& mark[z][2]){ now[1]=1; now[4]=1; now[5]=1; } if(mark[z][1]&& mark[z][3]){ now[1]=1; now[2]=1; now[6]=1; now[5]=1; } if(mark[z][1]&& mark[z][4]){ now[1]=1; now[2]=1; now[3]=1; } if(mark[z][2]&& mark[z][3]){ now[2]=1; now[4]=1; now[6]=1; } if(mark[z][2]&& mark[z][4]){ now[2]=1; now[3]=1; now[4]=1; now[5]=1; } if(mark[z][3]&& mark[z][4]){ now[3]=1; now[6]=1; now[5]=1; } } void cal(ll x){ while(qq.size() && q[qq.back()].fr<=x){ int z=qq.back(),zz=q[z].sc; qq.pop_back(); if(zz==1){ ans[z].push_back(1); if(!now[1]) ans[z].push_back(2); if(!now[2]) ans[z].push_back(3); if(!now[3]) ans[z].push_back(4); } if(zz==2){ if(!now[1]) ans[z].push_back(1); ans[z].push_back(2); if(!now[4]) ans[z].push_back(3); if(!now[5]) ans[z].push_back(4); } if(zz==3){ if(!now[2]) ans[z].push_back(1); if(!now[4]) ans[z].push_back(2); ans[z].push_back(3); if(!now[6]) ans[z].push_back(4); } if(zz==4){ if(!now[3]) ans[z].push_back(1); if(!now[5]) ans[z].push_back(2); if(!now[6]) ans[z].push_back(3); ans[z].push_back(4); } } } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m; cin>>ww>>hh; cnt=n; for(int i=1;i<=n;i++){ cin>>c[i].x>>c[i].y>>c[i].r; } make_yal(); for(int i=1;i<=m;i++){ cin>>q[i].fr>>q[i].sc; qq.push_back(i); } sort(qq.begin(),qq.end(),cmp1); for(auto i:yl){ cal(yal[i].w); dsu(i); } cal(1e18); for(int i=1;i<=m;i++){ for(auto j:ans[i])cout<<j; cout<<'\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...