제출 #1288343

#제출 시각아이디문제언어결과실행 시간메모리
1288343simona1230Two Antennas (JOI19_antennas)C++20
0 / 100
779 ms589824 KiB
#include <bits/stdc++.h> using namespace std; struct ant { long long h,a,b; ant() {} ant(long long _h,long long _a,long long _b) { h=_h; a=_a; b=_b; } }; long long n; ant t[200001]; long long q; pair<long long,long long> p[200001]; void read() { cin>>n; for(long long i=1; i<=n; i++) { long long x,y,z; cin>>x>>y>>z; t[i]= {x,y,z}; } cin>>q; for(long long i=1; i<=q; i++) { cin>>p[i].first>>p[i].second; } } struct itv { long long first,second,i; itv() {} itv(long long f,long long s,long long id) { first=f; second=s; i=id; } }; multiset<long long> s[800001]; vector<itv> v; long long len; bool cmp(itv p1,itv p2) { long long b1=p1.first/len; long long b2=p2.first/len; if(b1==b2)return p1.second<p2.second; return b1<b2; } long long lf,rt; void updadd(long long i,long long l,long long r,long long ql,long long qr,long long h) { if(ql>qr)return; s[i].insert(h); if(l==r)return; long long m=(l+r)/2; updadd(i*2,l,m,ql,min(qr,m),h); updadd(i*2+1,m+1,r,max(m+1,ql),qr,h); } void updrem(long long i,long long l,long long r,long long ql,long long qr,long long h) { if(ql>qr)return; s[i].erase(s[i].find(h)); if(l==r)return; long long m=(l+r)/2; updrem(i*2,l,m,ql,min(qr,m),h); updrem(i*2+1,m+1,r,max(m+1,ql),qr,h); } void add(long long i) { long long l=max(1LL*1,i-t[i].b); long long r=i-t[i].a; if(r<0)return; updadd(1,1,n,l,r,t[i].h); } void rem(long long i) { long long l=max(1LL*1,i-t[i].b); long long r=i-t[i].a; if(r<0)return; updrem(1,1,n,l,r,t[i].h); } long long query(long long i,long long l,long long r,long long id,long long h) { long long ans=-1; if(s[i].size()) { auto it=s[i].begin(); ans=abs(h-*it); it=s[i].end(); it--; ans=max(ans,abs(h-*it)); } if(l==r)return ans; long long m=(l+r)/2; if(id<=m)return max(ans,query(i*2,l,m,id,h)); else return max(ans,query(i*2+1,m+1,r,id,h)); } void fixl(long long l) { while(lf<l) { rem(lf); lf++; } while(l<lf) { lf--; add(lf); } } void fixr(long long r) { while(r<rt) { rem(rt); rt--; } while(rt<r) { rt++; add(rt); } } void solve() { len=(sqrt(n)); for(long long i=1; i<=n; i++) { if(i+t[i].a<=n) { v.push_back({i+t[i].a,min(n,i+t[i].b),i}); } } long long ans=-1; if(v.size()==0) { cout<<-1<<endl; exit(0); } sort(v.begin(),v.end(),cmp); lf=v[0].first,rt=v[0].second; for(long long i=lf; i<=rt; i++) add(i); ans=query(1,1,n,v[0].i,t[v[0].i].h); for(long long i=1;i<v.size();i++) { long long l=v[i].first; long long r=v[i].second; long long id=v[i].i; if(rt<l) { fixr(r); fixl(l); } else { fixl(l); fixr(r); } ans=max(ans,query(1,1,n,id,t[id].h)); } cout<<ans<<endl; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); read(); solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...