Submission #623063

#TimeUsernameProblemLanguageResultExecution timeMemory
623063CSQ31Road Construction (JOI21_road_construction)C++17
5 / 100
9056 ms2097152 KiB
#include <bits/stdc++.h> using namespace std; typedef long long int ll; //consider the case where we only need k smallest from two different set of points //if can do this in some reasonable time then apply zs bit trick //+log factor //need <= log^3 maybe? //ok two set need log^2(?) #define all(a) a.begin(),a.end() #define pb push_back #define owo ios_base::sync_with_stdio(0);cin.tie(0); const int MAXN = 2000000; vector<ll>glo; multiset<int>fen[MAXN]; multiset<int>::iterator it[MAXN]; vector<int>touch; void upd(int i,int n,int v){ for(;i<=n;i+=i&(-i))fen[i].insert(v); } void query(int i){ while(i>0){ touch.pb(i); i-=i&(-i); } } #define fi first #define se second typedef pair<int,int> pii; int main() { owo int n,k; cin>>n>>k; vector<array<int,2>>p(n); vector<int>cy(n); for(int i=0;i<n;i++)cin>>p[i][0]>>p[i][1]; sort(all(p)); vector<int>crd; for(int i=0;i<n;i++)crd.push_back(p[i][1]); sort(all(crd)); crd.resize(unique(all(crd)) - crd.begin()); for(int i=0;i<n;i++)cy[i] = lower_bound(all(crd),p[i][1]) - crd.begin()+1; int m = crd.size(); //y(i) >= y(j) case //we use x(i)+y(i) - x(j) - y(j) for(int i=0;i<n;i++){ touch.clear(); query(cy[i]); priority_queue<pii,vector<pii>,greater<pii>>pq; int s = touch.size(); for(int i=0;i<s;i++){ if(fen[touch[i]].empty())continue; it[i] = fen[touch[i]].begin(); pq.push({*it[i],i}); } for(int cnt=0;cnt<k;cnt++){ if(pq.empty())break; pii v = pq.top(); pq.pop(); ll c = p[i][0] + p[i][1]; c-=v.fi; glo.push_back(c); it[v.se]++; if(it[v.se] == fen[touch[v.se]].end())continue; pq.push({*it[v.se],v.se}); } upd(cy[i],m,p[i][0]+p[i][1]); } //y(i) < y(j) case //we use x(i) - y(i) - (x(j)-y(j)) for(int i=1;i<=m;i++)fen[i].clear(); //i need to do the opposite directly for(int i=0;i<n;i++){ touch.clear(); cy[i] = m-cy[i]+1; query(cy[i]-1); priority_queue<pii,vector<pii>,greater<pii>>pq; int s = touch.size(); for(int i=0;i<s;i++){ if(fen[touch[i]].empty())continue; it[i] = fen[touch[i]].begin(); pq.push({*it[i],i}); } for(int cnt=0;cnt<k;cnt++){ if(pq.empty())break; pii v = pq.top(); pq.pop(); ll c = p[i][0] - p[i][1]; c-=v.fi; glo.push_back(c); it[v.se]++; if(it[v.se] == fen[touch[v.se]].end())continue; pq.push({*it[v.se],v.se}); } upd(cy[i],m,p[i][0]-p[i][1]); } sort(all(glo)); //for(int x:glo)cout<<x<<" "; //cout<<'\n'; for(int i=0;i<k;i++)cout<<glo[i]<<'\n'; }
#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...