제출 #861062

#제출 시각아이디문제언어결과실행 시간메모리
861062yeediotTwo Antennas (JOI19_antennas)C++17
100 / 100
564 ms63828 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define F first
#define S second
#define all(x) x.begin(),x.end()
#define pii pair<int,int>
#define pb push_back
#define sz(x) (int)(x.size())
#define chmin(x,y) x=min(x,y)
#define chmax(x,y) x=max(x,y)
#define vi vector<int>
#define vp vector<pii>
#define vvi vector<vi>
//Don't open the standings during contests.
const int mxn=2e5+5;
vector<pii>ask(mxn);
vector<int>add2[mxn];
vector<int>remove2[mxn];
vector<int>add[mxn];
vector<int>remov[mxn];
vector<int>h(mxn),a(mxn),b(mxn),ans(mxn);
set<int>nowq;
int mx[4*mxn],mn[4*mxn],val[4*mxn],tag[4*mxn];
void clear(int l,int r,int id){
    if(l==r){
        mx[id]=-8e18;
        mn[id]=-8e18;
        val[id]=-8e18;
        return;
    }
    int mm=l+r>>1;
    clear(l,mm,id*2);
    clear(mm+1,r,id*2+1);
    mx[id]=-8e18;
    mn[id]=-8e18;
    val[id]=-8e18;
}
void upd(int id,int v){
    chmax(mn[id],v);
    val[id]=max(val[id],mn[id]+mx[id]);
}
void push(int id){
    if(mn[id]==-8e18)return;
    upd(id*2,mn[id]);
    upd(id*2+1,mn[id]);
    mn[id]=-8e18;
}
void modify(int l,int r,int id,int p,int v){
    if(l==r){
        mn[id]=-8e18;
        mx[id]=v;
        return;
    }
    push(id);
    int mm=l+r>>1;
    if(p<=mm) modify(l,mm,id*2,p,v);
    else modify(mm+1,r,id*2+1,p,v);
    mx[id]=max(mx[id*2],mx[id*2+1]);
    val[id]=max(val[id*2],val[id*2+1]);
}
void q_modify(int l,int r,int id,int ql,int qr,int v){
    if(ql>qr)return;
    if(ql<=l and r<=qr){
        upd(id,v);
        return;
    }
    push(id);
    int mm=l+r>>1;
    if(qr<=mm){
        q_modify(l,mm,id*2,ql,qr,v);
    }
    else if(ql>mm){
        q_modify(mm+1,r,id*2+1,ql,qr,v);
    }
    else{
        q_modify(l,mm,id*2,ql,mm,v);
        q_modify(mm+1,r,id*2+1,mm+1,qr,v);
    }
    mx[id]=max(mx[id*2],mx[id*2+1]);
    val[id]=max(val[id*2],val[id*2+1]);
}
int query(int l,int r,int id,int ql,int qr){
    if(ql<=l and r<=qr){
        return val[id];
    }
    push(id);
    int mm=l+r>>1;
    if(qr<=mm){
        return query(l,mm,id*2,ql,qr);
    }
    else if(ql>mm){
        return query(mm+1,r,id*2+1,ql,qr);
    }
    else{
        int a=query(l,mm,id*2,ql,mm);
        int b=query(mm+1,r,id*2+1,mm+1,qr);
        return max(a,b);
    }
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int n;
    cin>>n;
    int change=0;
    for(int i=1;i<=n;i++){
        cin>>h[i]>>a[i]>>b[i];
        chmax(change,h[i]);
    }
    int q;
    cin>>q;
    for(int i=1;i<=q;i++){
        ans[i]=-1;
        int l,r;
        cin>>l>>r;
        ask[i]={l,r};
        add2[r].pb(i);
    }
    clear(1,n,1);
    for(int i=1;i<=n;i++){
        for(auto j:add[i]){
            modify(1,n,1,j,h[j]);
        }
        if(i+a[i]<=n)add[i+a[i]].pb(i);
        if(i+b[i]<=n)remov[i+b[i]].pb(i);
        q_modify(1,n,1,max(i-b[i],1LL),i-a[i],-h[i]);
        for(auto j:add2[i]){
            chmax(ans[j],query(1,n,1,ask[j].F,i));
        }
        for(auto j:remov[i])modify(1,n,1,j,-8e18);
    }
    clear(1,n,1);
    for(int i=1;i<=n;i++){
        h[i]=1e9-h[i]+1;
    }
    for(int i=1;i<=n;i++){
        for(auto j:add[i]){
            modify(1,n,1,j,h[j]);
        }
        q_modify(1,n,1,max(i-b[i],1LL),i-a[i],-h[i]);
        for(auto j:add2[i]){
            chmax(ans[j],query(1,n,1,ask[j].F,i));
        }
        for(auto j:remov[i])modify(1,n,1,j,-8e18);
    }
    for(int i=1;i<=q;i++)cout<<ans[i]<<'\n';
}
 /*
 input:
 
  掃描線
  從1掃到N
  如果當前有詢問
  chmax(ans[j],max(h[i]-min(i-a[i]~i-b[i]),max(i-a[i]~i-b[i]-h[i]));
 */

컴파일 시 표준 에러 (stderr) 메시지

antennas.cpp: In function 'void clear(long long int, long long int, long long int)':
antennas.cpp:32:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   32 |     int mm=l+r>>1;
      |            ~^~
antennas.cpp: In function 'void modify(long long int, long long int, long long int, long long int, long long int)':
antennas.cpp:56:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   56 |     int mm=l+r>>1;
      |            ~^~
antennas.cpp: In function 'void q_modify(long long int, long long int, long long int, long long int, long long int, long long int)':
antennas.cpp:69:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   69 |     int mm=l+r>>1;
      |            ~^~
antennas.cpp: In function 'long long int query(long long int, long long int, long long int, long long int, long long int)':
antennas.cpp:88:13: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   88 |     int mm=l+r>>1;
      |            ~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...