求助一道题:环路运输(线段树写法不知道为什么0分 8wa 2tle)
  • 板块学术版
  • 楼主yangjunhan1
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/11/28 22:29
  • 上次更新2023/11/29 13:09:41
查看原帖
求助一道题:环路运输(线段树写法不知道为什么0分 8wa 2tle)
856459
yangjunhan1楼主2023/11/28 22:29
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int mx[N<<3],lz[N<<3],a[N<<1],n,ans;
void build(int rt,int l,int r){
    if(l==r){
        mx[rt]=a[l];
        return ;
    }
    int mid=(l+r)>>1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
    mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);
}
void lzdn(int rt){
    lz[rt<<1]+=lz[rt];
    lz[rt<<1|1]+=lz[rt];
    mx[rt<<1]-=lz[rt];
    mx[rt<<1|1]-=lz[rt];
    lz[rt]=0;
}
void qjj(int rt,int l,int r,int fl,int fr,int v){
    if(fl<=l && r<=fr){
        lz[rt]+=v;
        mx[rt]-=v;
        return ;
    }
    if(lz[rt])  lzdn(rt);
    int mid=(l+r)>>1;
    if(fl<=mid) qjj(rt<<1,l,mid,fl,fr,v);
    if(mid<fr)  qjj(rt<<1|1,mid+1,r,fl,fr,v);
    mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);
}
int qmx(int rt,int l,int r,int fl,int fr){
    if(fl<=l && r<=fr)  return mx[rt];
    int mid=(l+r)>>1,res=0;
    if(lz[rt])  lzdn(rt);
    if(fl<=mid) res=max(res,qmx(rt<<1,l,mid,fl,fr));
    if(mid<fr)  res=max(res,qmx(rt<<1|1,mid+1,r,fl,fr));
    return res;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        a[i+n]=a[i];
    }
    build(1,1,n+n);
    for(int i=n/2+1;i<=n/2+1+n;i++){
        int l=i-n/2,r=i+n/2-1;
        qjj(1,1,n+n,l,i-1,-1);
        qjj(1,1,n+n,i,i,1);
        qjj(1,1,n+n,i+1,r,-1);
        ans=max(ans,max(qmx(1,1,n+n,l,i-1),qmx(1,1,n+n,i+1,r))+a[i]);
    }
    cout<<ans;
    return 0;
}
2023/11/28 22:29
加载中...