Submission #74853

#TimeUsernameProblemLanguageResultExecution timeMemory
74853cubecube1000도로 건설 사업 (JOI13_construction)C++14
40 / 100
1926 ms263168 KiB
#include<bits/stdc++.h> #define x first #define y second using namespace std; typedef unsigned long long ll; typedef pair<int,int> pii; typedef pair<ll, ll> pll; const ll MAX=1<<19; const ll INFLL=0x3f3f3f3f3f3f3f; struct vill{ ll x,y,idx; }; vill v[MAX]; struct edge{ ll x,y,d; bool operator<(const edge &a)const{ return d<a.d; } }; struct area{ll x1,y1,x2,y2;}; area h[MAX]; vector<ll> ixcp,iycp,ex[2*MAX],ey[2*MAX],val,val2; vector<edge> mst; vector<pll> conn[MAX]; multiset<ll> pos; ll chk[2*MAX],n,m,c,par[MAX],cum; ll x_getidx(ll x){return lower_bound(ixcp.begin(),ixcp.end(),x)-ixcp.begin();} ll y_getidx(ll y){return lower_bound(iycp.begin(),iycp.end(),y)-iycp.begin();} ll fnd(ll x){ if(par[x]!=x) return par[x]=fnd(par[x]); return x; } void uni(ll x,ll y){ x=fnd(x), y=fnd(y); par[x]=y; } bool cmpx(vill a,vill b){ if(a.x!=b.x) return a.x<b.x; return a.y<b.y; } bool cmpy(vill a,vill b){ if(a.y!=b.y) return a.y<b.y; return a.x<b.x; } bool cmpidx(vill a,vill b){ return a.idx<b.idx; } ll exist(ll x,ll y){ set<ll>::iterator it=pos.lower_bound(x); if(it==pos.end()) return false; if(*it<=y) return true; return false; } int main(){ scanf("%lld%lld%lld",&n,&m,&c); for(ll i=0;i<n;i++){scanf("%lld%lld",&v[i].x,&v[i].y),v[i].idx=i;} for(ll i=0;i<m;i++){scanf("%lld%lld%lld%lld",&h[i].x1,&h[i].y1,&h[i].x2,&h[i].y2),h[i].x2++,h[i].y2++;} for(ll i=0;i<m;i++) { ixcp.push_back(h[i].x1); ixcp.push_back(h[i].x2); iycp.push_back(h[i].y1), iycp.push_back(h[i].y2); } sort(ixcp.begin(),ixcp.end()); sort(iycp.begin(),iycp.end()); for(ll i=0;i<m;i++){ ex[x_getidx(h[i].x1)].push_back(i), ey[y_getidx(h[i].y1)].push_back(i); ex[x_getidx(h[i].x2)].push_back(i), ey[y_getidx(h[i].y2)].push_back(i); } sort(v,v+n,cmpx); for(ll i=1,pt=0;i<n;i++){ if(v[i-1].x==v[i].x){ for(;ixcp[pt]<=v[i].x&&pt<ixcp.size();pt++){ for(ll j=0;j<ex[pt].size();j++) { if(chk[ex[pt][j]]) pos.erase(h[ex[pt][j]].y1),pos.erase(h[ex[pt][j]].y2-1); else pos.insert(h[ex[pt][j]].y1),pos.insert(h[ex[pt][j]].y2-1); chk[ex[pt][j]]^=1; } } if(!exist(v[i-1].y,v[i].y)){ ll dist=v[i].y-v[i-1].y; conn[v[i].idx].push_back(make_pair(v[i-1].idx,dist)); conn[v[i-1].idx].push_back(make_pair(v[i].idx,dist)); } } } pos.clear(); for(ll i=0;i<ixcp.size();i++) chk[i]=0; sort(v,v+n,cmpy); for(ll i=1,pt=0;i<n;i++){ if(v[i-1].y==v[i].y){ for(;iycp[pt]<=v[i].y&&pt<iycp.size();pt++){ for(ll j=0;j<ey[pt].size();j++) { if(chk[ey[pt][j]]) pos.erase(h[ey[pt][j]].x1),pos.erase(h[ey[pt][j]].x2-1); else pos.insert(h[ey[pt][j]].x1),pos.insert(h[ey[pt][j]].x2-1); chk[ey[pt][j]]^=1; } } if(!exist(v[i-1].x,v[i].x)){ ll dist=v[i].x-v[i-1].x; conn[v[i].idx].push_back(make_pair(v[i-1].idx,dist)); conn[v[i-1].idx].push_back(make_pair(v[i].idx,dist)); } } } for(ll i=0;i<n;i++){ for(ll j=0;j<conn[i].size();j++) { if(i<conn[i][j].x) mst.push_back({i,conn[i][j].x,conn[i][j].y}); //printf("%lld%lld%lld\n",i,conn[i][j].x,conn[i][j].y); } } for(ll i=0;i<n;i++) par[i]=i; sort(mst.begin(),mst.end()); val.push_back(0),val2.push_back(0); for(ll i=0;i<mst.size();i++){ if(fnd(mst[i].x)!=fnd(mst[i].y)) cum+=mst[i].d, val.push_back(cum), val2.push_back(mst[i].d), uni(mst[i].x,mst[i].y); } //for(ll i=0;i<val.size();i++) printf("%lld%lld\n",n-i,val[i]); vector<ll>::iterator it; for(ll i=0;i<c;i++){ ll t1,t2; scanf("%lld%lld",&t1,&t2); if(n-val.size()>=t2){ printf("-1\n"); } else{ it=lower_bound(val2.begin(),val2.end(),t1); ll idx=max((ll)(it-val2.begin()-1),n-t2); printf("%lld\n",val[idx]+t1*(n-idx)); } } }

Compilation message (stderr)

construction.cpp: In function 'int main()':
construction.cpp:55:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%lld%lld%lld",&n,&m,&c);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
construction.cpp:56:58: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for(ll i=0;i<n;i++){scanf("%lld%lld",&v[i].x,&v[i].y),v[i].idx=i;}
                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
construction.cpp:57:96: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for(ll i=0;i<m;i++){scanf("%lld%lld%lld%lld",&h[i].x1,&h[i].y1,&h[i].x2,&h[i].y2),h[i].x2++,h[i].y2++;}
                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~
construction.cpp:121:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%lld%lld",&t1,&t2);
         ~~~~~^~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...