제출 #1288355

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