Submission #204493

#TimeUsernameProblemLanguageResultExecution timeMemory
204493gs18115절취선 (JOI14_ho_t5)C++14
100 / 100
362 ms24576 KiB
#include<iostream> #include<vector> #include<algorithm> #define ep emplace #define eb emplace_back #define fi first #define se second #define all(x) (x).begin(),(x).end() using namespace std; typedef long long ll; typedef pair<int,int>pi; typedef pair<ll,ll>pl; const int inf=1e9+7; const ll INF=1e18+7; struct dsu { int pa[100020]; dsu(){} inline void init() { fill(pa,pa+100020,-1); return; } inline int par(int x) { if(pa[x]==-1) return x; return pa[x]=par(pa[x]); } inline void uni(int x,int y) { x=par(x); y=par(y); if(x==y) return; pa[x]=y; return; } }uf; struct seg { int mx[800020]; bool mg[800020]; seg(){} inline void init() { fill(mx,mx+800020,-1); fill(mg,mg+800020,0); return; } inline void prop(int n) { if(mg[n]) { mg[n*2]=mg[n*2+1]=1; if(mx[n*2]!=-1&&mx[n*2+1]!=-1) uf.uni(mx[n*2],mx[n*2+1]); } mg[n]=0; return; } inline void set(int n,int s,int e,int x,int p) { if(s==e) { mx[n]=p; return; } prop(n); int m=(s+e)/2; if(x>m) set(n*2+1,m+1,e,x,p); else set(n*2,s,m,x,p); mx[n]=max(mx[n*2],mx[n*2+1]); return; } inline void mrg(int n,int s,int e,int S,int E,int p) { if(s>E||S>e||mx[n]==-1) return; if(S<=s&&e<=E) { uf.uni(mx[n],p); mg[n]=1; return; } int m=(s+e)/2; mrg(n*2,s,m,S,E,p); mrg(n*2+1,m+1,e,S,E,p); return; } }st; struct fen { int t[200020]; fen(){} inline void init() { fill(t,t+200020,0); return; } inline void fi(int x,int p) { for(x++;x<200020;x+=x&-x) t[x]+=p; return; } inline int fs(int x) { int s=0; for(x++;x>0;x=x&(x-1)) s+=t[x]; return s; } }ft; vector<int>vx,vy; inline ll cpm(const vector<pair<pi,pi> >&v) { int vxs=(int)vx.size(); vector<vector<pi> >in(vxs),out(vxs); vector<vector<pair<pi,int> > >mrg(vxs); ll s=0; for(int i=0;i<(int)v.size();i++) { auto&t=v[i]; if(t.fi.fi==t.se.fi) mrg[t.fi.fi].eb(pi(t.fi.se,t.se.se),i); else { in[t.fi.fi].eb(t.fi.se,i); out[t.se.fi].eb(t.fi.se,i); } } int m=(int)vy.size(); uf.init(); st.init(); ft.init(); for(int i=0;i<(int)vx.size();i++) { for(auto&t:in[i]) st.set(1,0,m-1,t.fi,t.se),ft.fi(t.fi,1); for(auto&t:mrg[i]) st.mrg(1,0,m-1,t.fi.fi,t.fi.se,t.se),s+=ft.fs(t.fi.se)-ft.fs(t.fi.fi-1); for(auto&t:out[i]) st.set(1,0,m-1,t.fi,-1),ft.fi(t.fi,-1); } int cc=0; for(int i=0;i<(int)v.size();i++) if(uf.pa[i]==-1) cc++; return s+cc; } inline int sz(const vector<pair<pi,pi> >&v){return(int)v.size();} int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int h,w,n; cin>>w>>h>>n; vx.eb(0),vx.eb(w); vy.eb(0),vy.eb(h); vector<pair<pi,pi> >edge; edge.eb(pi(0,0),pi(w,0)); edge.eb(pi(0,0),pi(0,h)); edge.eb(pi(w,0),pi(w,h)); edge.eb(pi(0,h),pi(w,h)); for(int i=0;i<n;i++) { int x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2; edge.eb(pi(x1,y1),pi(x2,y2)); vx.eb(x1),vx.eb(x2); vy.eb(y1),vy.eb(y2); } sort(all(vx)),vx.erase(unique(all(vx)),vx.end()); sort(all(vy)),vy.erase(unique(all(vy)),vy.end()); for(auto&t:edge) { t.fi.fi=lower_bound(all(vx),t.fi.fi)-vx.begin(); t.fi.se=lower_bound(all(vy),t.fi.se)-vy.begin(); t.se.fi=lower_bound(all(vx),t.se.fi)-vx.begin(); t.se.se=lower_bound(all(vy),t.se.se)-vy.begin(); } cout<<cpm(edge)-sz(edge)<<endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...