제출 #1288374

#제출 시각아이디문제언어결과실행 시간메모리
1288374simona1230Two Antennas (JOI19_antennas)C++20
0 / 100
1660 ms83152 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; if(ql<=l&&r<=qr) { s[i].insert(h); 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(ql<=l&&r<=qr) { s[i].erase(s[i].find(h)); 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); } } int ans=-1; void solve(int l,int r) { if(l==r)return; int m=(l+r)/2; for(int i=m+1;i<=r;i++) add(i); for(int i=l;i<=m;i++) ans=max(ans,query(1,1,n,i,t[i].h)); for(int i=m+1;i<=r;i++) rem(i); solve(l,m); solve(m+1,r); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); read(); solve(1,n); cout<<ans<<endl; 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...