Submission #698755

#TimeUsernameProblemLanguageResultExecution timeMemory
698755vjudge1New Home (APIO18_new_home)C++17
0 / 100
4077 ms789588 KiB
#include<bits/stdc++.h> #define maxn 350000 #define maxl 700000 #define bl 400 using namespace std; int n,k,q; int x[maxn]; int a[maxn]; int b[maxn]; int t[maxn]; int l[maxn]; int y[maxn]; int ap[maxn]; bool fn[maxn]; int ans[maxn]; vector<pair<pair<int,int>,int> > v; vector<pair<int,int> > c; vector<int> cs; bool cur[maxn]; int segp[4*maxl]; int segm[4*maxl]; int lc[4*maxl]; int rc[4*maxl]; int ord[bl]; multiset<int> ns[bl]; int cnt=1; void clear_seg() { cnt=1; segp[0]=-1e8; segm[0]=0; lc[0]=rc[0]=0; } inline void create_children(int id,int l,int r) { if(lc[id]==0) { segp[cnt]=-1e8; segm[cnt]=0; lc[cnt]=rc[cnt]=0; lc[id]=cnt++; } if(rc[id]==0) { segp[cnt]=-1e8; segm[cnt]=0; lc[cnt]=rc[cnt]=0; rc[id]=cnt++; } } void update(int id,int l,int r,int p,int q,int a,int b) { int m=(l+r)/2; create_children(id,l,r); if(p<=l && r<=q) { if(b==1) segp[id]=max(segp[id],a+l-1); else segm[id]=max(segm[id],a+1-l); } if(q<l || r<p) { return; } update(lc[id],l,m,p,q,a,b); update(rc[id],m+1,r,p,q,a,b); } int dif(int id,int l,int r,int x) { if(id==0 && !(l==1 && r==1e8)) return 0; int cur=max(segp[id]+x-l,segm[id]+l-x); int m=(l+r)/2; if(x<=m) return max(cur,dif(lc[id],l,m,x)); else return max(cur,dif(rc[id],m+1,r,x)); } int main() { scanf("%d %d %d",&n,&k,&q); for(int i=1;i<=n;i++) { scanf("%d %d %d %d",&x[i],&t[i],&a[i],&b[i]); v.push_back({{a[i],0},i}); v.push_back({{b[i],2},i}); } for(int i=1;i<=q;i++) { scanf("%d %d",&l[i],&y[i]); v.push_back({{y[i],1},n+i}); } sort(v.begin(),v.end()); /*for(int i=0;i<v.size();i++) { cout<<v[i].first.first<<" "<<v[i].first.second<<" "<<v[i].second<<endl; }*/ for(int i=0;i<v.size();i+=bl) { int cnt=0; for(int j=i;j<v.size() && j<i+bl;j++) { int ind=v[j].second; if(ind<=n) { if(ap[t[ind]]==0) { cur[t[ind]]=true; ord[t[ind]]=cnt; cs.push_back(cnt); cnt++; } ap[t[ind]]++; } } for(int j=i-1;j>=0;j--) { int ind=v[j].second; if(ind<=n) { if(v[j].first.second==2) fn[ind]=true; else { if(!fn[ind] && ap[t[ind]]==0) { c.push_back({t[ind],x[ind]}); } } } } for(int j=i-1;j>=0;j--) { int ind=v[j].second; if(ind<=n) { if(v[j].first.second==2) fn[ind]=true; else { if(!fn[ind] && ap[t[ind]]==0) { if(ap[t[ind]]==0) cnt++; ap[t[ind]]++; } } } } if(cnt==k) { sort(c.begin(),c.end()); clear_seg(); for(int i=0;i<c.size();i++) { if(i==0 || c[i-1].first!=c[i].first) { update(0,1,1e8,1,c[i].second,c[i].second-1,-1); } else { update(0,1,1e8,c[i-1].second,c[i].second,c[i].second-1,-1); } if(i+1==c.size() || c[i+1].first!=c[i].first) { update(0,1,1e8,c[i].second,1e8,1-c[i].second,1); } else { update(0,1,1e8,c[i].second,c[i+1].second,1-c[i].second,1); } } for(int j=i-1;j>=0;j--) { int ind=v[j].second; if(ind<=n) { if(v[j].first.second==2) fn[ind]=true; else { if(!fn[ind] && cur[t[ind]]) { ns[ord[t[ind]]].insert(x[ind]); } } } } for(int j=i;j<v.size() && j<i+bl;j++) { int ind=v[j].second; if(ind<=n) { //cout<<j<<" "<<ind<<" "<<ord[t[ind]]<<" "<<v[j].first.second<<endl; if(v[j].first.second==2) ns[ord[t[ind]]].erase(ns[ord[t[ind]]].find(x[ind])); else ns[ord[t[ind]]].insert(x[ind]); } else { ind-=n; //cout<<j<<" "<<ind<<" "<<ind<<" "<<cs.size()<<endl; for(auto tip:cs) { //cout<<"\t"<<tip<<" "<<ns[tip].size()<<endl; if(ns[tip].size()==0) ans[ind]=-1; } if(ans[ind]!=-1) { if(cnt==cs.size()) ans[ind]=0; else ans[ind]=dif(0,1,1e8,l[ind]); for(auto tip:cs) { set<int>::iterator it=ns[tip].lower_bound(l[ind]); if(it!=ns[tip].end()) ans[ind]=max(ans[ind],(*it)-l[ind]); if(it!=ns[tip].begin()) { it--; ans[ind]=max(ans[ind],l[ind]-(*it)); } } } } } } else { for(int j=i;j<v.size() && j<i+bl;j++) { int ind=v[j].second; if(ind>n) { ans[ind-n]=-1; } } } c.clear(); for(int j=0;j<v.size() && j<i+bl;j++) { int ind=v[j].second; if(ind<=n) { cur[t[ind]]=false; ns[ord[t[ind]]].clear(); ord[t[ind]]=0; ap[t[ind]]=0; } } cs.clear(); } for(int j=1;j<=q;j++) printf("%d\n",ans[j]); return 0; }

Compilation message (stderr)

new_home.cpp: In function 'int main()':
new_home.cpp:82:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<int, int>, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |     for(int i=0;i<v.size();i+=bl) {
      |                 ~^~~~~~~~~
new_home.cpp:84:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<int, int>, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   84 |         for(int j=i;j<v.size() && j<i+bl;j++) {
      |                     ~^~~~~~~~~
new_home.cpp:122:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  122 |             for(int i=0;i<c.size();i++) {
      |                         ~^~~~~~~~~
new_home.cpp:129:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  129 |                 if(i+1==c.size() || c[i+1].first!=c[i].first) {
      |                    ~~~^~~~~~~~~~
new_home.cpp:149:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<int, int>, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  149 |             for(int j=i;j<v.size() && j<i+bl;j++) {
      |                         ~^~~~~~~~~
new_home.cpp:164:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  164 |                         if(cnt==cs.size()) ans[ind]=0;
      |                            ~~~^~~~~~~~~~~
new_home.cpp:180:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<int, int>, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  180 |             for(int j=i;j<v.size() && j<i+bl;j++) {
      |                         ~^~~~~~~~~
new_home.cpp:188:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<int, int>, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  188 |         for(int j=0;j<v.size() && j<i+bl;j++) {
      |                     ~^~~~~~~~~
new_home.cpp:68:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |     scanf("%d %d %d",&n,&k,&q);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~
new_home.cpp:70:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   70 |         scanf("%d %d %d %d",&x[i],&t[i],&a[i],&b[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:75:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   75 |         scanf("%d %d",&l[i],&y[i]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~
#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...