제출 #554772

#제출 시각아이디문제언어결과실행 시간메모리
554772Koosha_mvRoad Construction (JOI21_road_construction)C++14
59 / 100
10033 ms73908 KiB
#include <bits/stdc++.h> using namespace std; #define dbgv(v) cout<<#v<<" = "; f(i,0,v.size()) cout<<v[i]<<" "; cout<<endl #define dbga(a,x,y) cout<<#a<<" = "; f(i,x,y) cout<<a[i]<<" "; cout<<endl #define erorp(x) cout<<#x<<"={"<<x.F<<" , "<<x.S<<"}"<<endl #define eror(x) cout<<#x<<'='<<(x)<<endl #define f_(i,a,b) for(int i=a;i>=b;i--) #define f(i,a,b) for(int i=a;i<b;i++) #define nb(x) __builtin_popcount(x) #define all(v) v.begin(),v.end() #define bit(n,k) (((n)>>(k))&1) #define Add(x,y) x=(x+y)%mod #define maxm(a,b) a=max(a,b) #define minm(a,b) a=min(a,b) #define lst(x) x[x.size()-1] #define sz(x) int(x.size()) #define mp make_pair #define ll long long #define pb push_back #define S second #define F first #define int ll typedef pair<int,int> pii; const int N=1e6+99,inf=1e10; const pii pinf={-10*inf,-1}; int n,k,a[N],b[N],pos[N]; pii seg[N]; vector<int> ans; vector<pii> vec; map<int,vector<int>> mark; void add(int x){ seg[x+n]={vec[x].F+vec[x].S,x}; for(x+=n;x>1;x>>=1){ seg[x>>1]=max(seg[x],seg[x^1]); } } void del(int x){ seg[x+n]=pinf; for(x+=n;x>1;x>>=1){ seg[x>>1]=max(seg[x],seg[x^1]); } } pii get(int l,int r){ pii res=pinf; for(l+=n,r+=n;l<r;l>>=1,r>>=1){ if(l&1) maxm(res,seg[l++]); if(r&1) maxm(res,seg[--r]); } return res; } bool check(int val,int type=0){ fill(seg,seg+N,pinf); ans.clear(); int cnt=0; for(auto p : mark){ vector<int> v=p.S; for(auto x : v) add(x); for(auto x : v){ int p=upper_bound(all(vec),mp(vec[x].F,-inf))-vec.begin(); vector<int> op; for(pii e=get(0,p);vec[x].F+vec[x].S-e.F<=val;e=get(0,p)){ cnt++; op.pb(e.S); del(e.S); if(type==1) ans.pb(vec[x].F+vec[x].S-e.F); if(cnt>=k) return 0; } for(auto id : op) add(id); } } return 1; } vector<int> solve(){ f(i,0,n) vec.pb({a[i],b[i]}); sort(all(vec)); f(i,0,n) pos[i]=lower_bound(all(vec),mp(a[i],b[i]))-vec.begin(); f(i,0,n) mark[b[i]].pb(pos[i]); int l=0,r=inf; while(l+1<r){ int mid=(l+r)>>1; if(check(mid)) l=mid; else r=mid; } check(l,1); vec.clear(); mark.clear(); while(ans.size()<k) ans.pb(r); return ans; } int32_t main(){ ios:: sync_with_stdio(0), cin.tie(0), cout.tie(0); map<pair<int,int>,int> cnt; cin>>n>>k; f(i,0,n){ cin>>a[i]>>b[i]; if(++cnt[mp(a[i],b[i])]>1) assert(0); } vector<int> A,B; A=solve(); f(i,0,n) a[i]=-a[i],swap(a[i],b[i]); B=solve(); for(auto x : B) A.pb(x); sort(all(A)); f(i,0,k) cout<<A[i]<<" "; } /* 3 2 0 1 0 0 2 0 3 2 -1 0 0 0 0 2 */

컴파일 시 표준 에러 (stderr) 메시지

road_construction.cpp: In function 'std::vector<long long int> solve()':
road_construction.cpp:92:18: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
   92 |  while(ans.size()<k) ans.pb(r);
      |        ~~~~~~~~~~^~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...