Submission #917893

#TimeUsernameProblemLanguageResultExecution timeMemory
917893CSQ31New Home (APIO18_new_home)C++17
5 / 100
5064 ms325228 KiB
#include <bits/stdc++.h> using namespace std; #define pb push_back #define fi first #define se second #define sz(a) (int)(a.size()) #define all(a) a.begin(),a.end() #define lb lower_bound #define ub upper_bound #define owo ios_base::sync_with_stdio(0);cin.tie(0); #define debug(...) fprintf(stderr, __VA_ARGS__),fflush(stderr) #define time__(d) for(long blockTime = 0; (blockTime == 0 ? (blockTime=clock()) != 0 : false);\ debug("%s time : %.4fs\n", d, (double)(clock() - blockTime) / CLOCKS_PER_SEC)) typedef long long int ll; typedef long double ld; typedef pair<ll,ll> PII; typedef pair<int,int> pii; typedef vector<vector<int>> vii; typedef vector<vector<ll>> VII; ll gcd(ll a,ll b){if(!b)return a;else return gcd(b,a%b);} const int MAXT = 3e6,MAXN = 3e5+1; int n,q,k; vector<int>ans(MAXN,-1),T; multiset<int,greater<int>>lines[MAXT]; map<int,int>crd; int N; void upd(int v,int l,int r,int pos){ if(l==r){ if(lines[l].empty())T[v] = -1e9; else T[v] = *lines[l].begin(); return; } int tm = (l+r)/2; if(pos<=tm)upd(2*v,l,tm,pos); else upd(2*v+1,tm+1,r,pos); T[v] = max(T[2*v],T[2*v+1]); } int query(int v,int l,int r,int tl,int tr){ if(l>r)return -1e9; if(l==tl && r==tr)return T[v]; int tm = (tl+tr)/2; return max(query(2*v,l,min(r,tm),tl,tm), query(2*v+1,max(l,tm+1),r,tm+1,tr)); } int di(int a,int b){ if(a+b>=0)return (a+b+1)/2; else return (a+b)/2; } void change(int l,int r,bool mode){ int x = di(l,r); int y = r - x; int i = crd[x]; if(mode)lines[i].insert(x+y); else lines[i].erase(lines[i].find(x+y)); //upd(1,0,N,crd[x]); } vector<pii>sweep; vector<int>comp; void solve(){ vector<multiset<int>>store(k+1); //coordinate compress for(int i=1;i<=k;i++){ store[i].insert(-1e8); store[i].insert(2e8); } for(auto z:sweep){ int t = z.fi; int x = z.se; if(t > k){ comp.pb(x); continue; } if(t>0){ if(store[t].find(x) != store[t].end()){ store[t].insert(x); continue; } auto r = store[t].lb(x); auto l = r; l--; comp.pb(di(*l,x)); comp.pb(di(x,*r)); store[t].insert(x); }else{ t*=-1; store[t].erase(store[t].find(x)); if(store[t].find(x) != store[t].end())continue; auto r = store[t].lb(x); auto l = r; l--; comp.pb(di(*l,*r)); } } comp.pb(5e7); sort(all(comp)); comp.resize(unique(all(comp)) - comp.begin()); for(int i=0;i<sz(comp);i++)crd[comp[i]] = i; N = sz(comp)-1; T.assign(4*(N+1),-1e9); for(int i=1;i<=k;i++)change(-1e8,2e8,1); //cout<<"TES"<<'\n'; //for(int x:comp)cout<<x<<" "; //cout<<'\n'; for(auto z : sweep){ int t = z.fi; int x = z.se; if(t > k){ t-=k+1; for(int i=1;i<=k;i++){ int mn = 1e9; for(int x1 : store[i]) mn = min(mn,abs(x-x1)); ans[t] = max(ans[t],mn); } continue; } if(t>0){ if(store[t].find(x) != store[t].end()){ store[t].insert(x); continue; } auto r = store[t].lb(x); auto l = r; l--; change(*l,x,1); change(x,*r,1); change(*l,*r,0); store[t].insert(x); }else{ t*=-1; store[t].erase(store[t].find(x)); if(store[t].find(x) != store[t].end())continue; auto r = store[t].lb(x); auto l = r; l--; change(*l,*r,1); change(x,*r,0); change(*l,x,0); } } for(int i=0;i<N;i++)lines[i].clear(); comp.clear(); crd.clear(); } int main() { owo map<int,vector<pii>>pt; cin>>n>>k>>q; for(int i=0;i<n;i++){ int x,t,a,b; cin>>x>>t>>a>>b; pt[a].pb({t,x}); //add pt[b+1].pb({-t,x}); //remove } for(int i=0;i<q;i++){ int l,y; cin>>l>>y; pt[y].pb({i+k+1,l}); } for(auto z:pt){ for(auto x:z.se){if(x.fi <= k)sweep.pb(x);} for(auto x:z.se){if(x.fi > k)sweep.pb(x);} } solve(); for(pii &x:sweep)x.se = 1e8 - x.se; solve(); for(int i=0;i<q;i++){ if(ans[i]>=1e8)ans[i] = -1; cout<<ans[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...