社区讨论

9pts线段树求调

P1997faebdc 的烦恼参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mlyv2974
此快照首次捕获于
2026/02/23 15:34
2 周前
此快照最后确认于
2026/02/25 14:42
2 周前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
int n;
int root;
struct kl{
    int l,r;
}b[N];
int c[N];
int a[N];
struct node{
    int l,r;
    long long sum,add,q;
    int size;
    node(){
        l=r=sum=add=size=q=0;
    }
    void init(int p){
        l=r=p;
        sum=a[p];
    }
}tree[N<<2];
node operator+(const node& l,const node &r){
    node res;
    res.l=l.l;
    res.r=r.r;
    res.sum=l.sum+r.sum;
    return res;
}
inline void bui(int rt){
    tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}
inline void color(int l,int r,int rt,int v){
    tree[rt].add+=v;
    tree[rt].sum+=(r-l+1)*v;
}
inline void push_col(int l,int r,int rt){
    if (tree[rt].add!=0){
        int mid=(l+r)>>1;
        color(l,mid,rt<<1,tree[rt].add);
        color(mid+1,r,rt<<1|1,tree[rt].add);
        tree[rt].add=0;
    }
}
inline void change(int l,int r,int rt,int nowl,int nowr,long long v){
    if (nowl<=l&&r<=nowr){
        color(l,r,rt,v);
    }
    push_col(l,r,rt);
    int mid=(l+r)>>1;
    if (nowl<=mid) change(l,mid,rt<<1,nowl,nowr,v);
    if (mid<nowr) change(mid+1,r,rt<<1|1,nowl,nowr,v);
    bui(rt);
}
inline node query(int l,int r,int rt,int nowl,int nowr){
    if (nowl<=l&&r<=nowr){
        return tree[rt];
    }
    push_col(l,r,rt);
    int mid=(l+r)>>1;
    if (nowl<=mid){
        if (mid<nowr) return query(l,mid,rt<<1,nowl,nowr)+query(mid+1,r,rt<<1|1,nowl,nowr);
        else return query(l,mid,rt<<1,nowl,nowr);
    }else return query(mid+1,r,rt<<1|1,nowl,nowr);
}
inline void build(int l,int r,int rt){
    if (l==r){
        tree[rt].init(r);
        tree[rt].size=b[l].r-b[l].l+1;
        return;
    }
    int mid=(l+r)>>1;
    build(l,mid,rt<<1);
    build(mid+1,r,rt<<1|1);
    bui(rt);
    return;
}
int q;
int main(){
    scanf("%d%d",&n,&q);
    for (int i=1;i<=n;++i){
        scanf("%d",&a[i]);
    }
    int m=1;
    b[1].l=1;
    c[1]=1;
    for (int i=2;i<=n;++i){
        if (a[i]!=a[i-1]){
            b[m].r=i-1;
            b[++m].l=i;
        }
        c[i]=m;
    }
    b[m].r=n;
    build(1,m,1);
    while (q--){
        int x,y;
        scanf("%d%d",&x,&y);
        int l=c[x],r=c[y];
        int anssum=max(b[l].r-x+1,y-b[r].l+1);
        if (l==r){
            anssum=y-x+1;
        }
        if (l+1<=r){
            anssum=max(anssum,query(1,m,1,l+1,r-1).size);
        }
        cout<<anssum<<"\n";
    }
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...