提交时间:2026-04-11 13:12:57
运行 ID: 41147
#include<bits/stdc++.h> #define int long long using namespace std; void read(int &x){ x=0;char c=getchar(); for(;!isdigit(c);c=getchar()); for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48); } int n,x[1000005],y[1000005]; bool chk(int S){ bitset<20>vis; vis.reset(); unordered_map<int,vector<int>>vx,vy; for(int i=1;i<=n;i++){ if(S>>i-1&1)vx[x[i]].push_back(y[i]),vy[y[i]].push_back(x[i]); } for(auto[x,y]:vx){ if(y.size()>2)return 0; int y1,y2; if(y.size()==1)y1=y2=y[0]; else y1=min(y[0],y[1]),y2=max(y[0],y[1]); for(int i=1;i<=n;i++)if(::x[i]==x&&::y[i]<=y2&&::y[i]>=y1)vis[i]=1; } for(auto[x,y]:vy){ if(y.size()>2)return 0; int y1,y2; if(y.size()==1)y1=y2=y[0]; else y1=min(y[0],y[1]),y2=max(y[0],y[1]); for(int i=1;i<=n;i++)if(::y[i]==x&&::x[i]<=y2&&::x[i]>=y1)vis[i]=1; } for(int i=1;i<=n;i++)if(!vis[i])return 0; return 1; } void slv(){ read(n); for(int i=1;i<=n;i++)read(x[i]),read(y[i]); if(n<=16){ for(int S=0;S<(1<<n);S++){ if(chk(S)){ bitset<20>b(S); for(int i=0;i<n;i++)cout<<b[i]; return; } } } int mx=0,my=0; for(int i=1;i<=n;i++)mx=max(mx,x[i]),my=max(my,y[i]); bitset<1000005>ans; if(mx*my==n){ vector<vector<int>>id(mx+1,vector<int>(my+1)); for(int i=1;i<=n;i++)id[x[i]][y[i]]=i; for(int i=0;1+i<=mx-i&&1+i<=my-i;i++){ ans[id[1+i][1+i]]=ans[id[1+i][my-i]]=ans[id[mx-i][1+i]]=ans[id[mx-i][my-i]]=1; } for(int i=1;i<=n;i++)cout<<ans[i]; return; } unordered_map<int,vector<pair<int,int>>>vx; map<int,set<tuple<int,int,int>>>vy; for(int i=1;i<=n;i++){ vx[x[i]].push_back({y[i],i}); } for(auto&[x,y]:vx){ sort(y.begin(),y.end()); ans[y[0].second]=ans[y.back().second]=1; vy[y[0].first].insert({x,y[0].second,0}),vy[y.back().first].insert({x,y.back().second,1}); } auto push_up=[&](int x,int y){ auto id=lower_bound(vx[x].begin(),vx[x].end(),make_pair(y,0ll)); ans[id->second]=0; vy[y].erase({x,id->second,1}); id++; if(id==vx[x].end())return; ans[id->second]=1; vy[id->first].insert({x,id->second,1}); }; auto push_down=[&](int x,int y){ auto id=lower_bound(vx[x].begin(),vx[x].end(),make_pair(y,0ll)); ans[id->second]=0; vy[y].erase({x,id->second,0}); id++; if(id==vx[x].end())return; ans[id->second]=1; vy[id->first].insert({x,id->second,0}); }; for(auto&[x,y]:vy){ while(y.size()>2){ auto it=++y.begin(); auto[a,b,c]=*it; if(c)push_down(a,x); else push_up(a,x); } } for(int i=1;i<=n;i++)cout<<ans[i]; } signed main(){ slv(); return 0; }