求调
  • 板块学术版
  • 楼主chiyanfeng
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/12/26 14:30
  • 上次更新2023/10/24 06:31:50
查看原帖
求调
285806
chiyanfeng楼主2022/12/26 14:30

题目 代码

#include<bits/stdc++.h>
#define sl (id<<1)
#define sr (id<<1|1)
#define fa (id>>1);
using namespace std;
int n, p;
int read() {
    int sum=0, f=1;
    char t=getchar();
    while (t<'0'||t>'9') {
        if (t=='-')
            f=-1;
        t=getchar();
    }
    while (t>='0'&&t<='9') {
        sum= (sum<<3)+ (sum<<1)+t-'0';
        t=getchar();
    }
    return sum*f;
}
struct __tree {
    int l, r, flag, lmax, rmax, maxx;
    __tree operator+ (const __tree&x) {
        __tree temp;
        temp.l=l, temp.r=x.r;
        temp.maxx=max (max (maxx, x.maxx), rmax+x.lmax);
        if (lmax==r-l+1)
            temp.lmax=lmax+x.lmax;
        else
            temp.lmax=lmax;
        if (x.rmax==x.r-x.l+1)
            temp.rmax=x.rmax+rmax;
        else
            temp.rmax=x.rmax;
        temp.flag=0;
        return temp;
    }
} tree[45];
void build (int l, int r, int id) {
    tree[id].l=l, tree[id].r=r, tree[id].lmax=tree[id].rmax=tree[id].maxx=r-l+1, tree[id].flag=0;
    if (l==r)
        return ;
    int mid= (l+r) >>1;
    build (l, mid, sl);
    build (mid+1, r, sr);
}
void update (int l, int r, int color, int id) {
    if (tree[id].l==l&&tree[id].r==r) {
        if (color==2)
            tree[id].lmax=tree[id].rmax=tree[id].maxx=r-l+1;
        else
            tree[id].lmax=tree[id].rmax=tree[id].maxx=0;
        tree[id].flag=color;
        return ;
    }
    if (tree[id].flag) {
        tree[sl].flag=tree[sr].flag=tree[id].flag;
        tree[id].flag=0;
        tree[sl].lmax=tree[sr].lmax=tree[sl].rmax=tree[sr].rmax=tree[sl].maxx=tree[sr].maxx=0;
    }
    int mid= (tree[id].l+tree[id].r) >>1;
    if (r<=mid)
        update (l, r, color, sl);
    else if (l>mid)
        update (l, r, color, sr);
    else
        update (l, mid, color, sl), update (mid+1, r, color, sr);
    tree[id]=tree[sl]+tree[sr];
}
int que_max() {
    return tree[1].maxx;
}
int main() {
    n=read(), p=read();
    build (1, n, 1);
    for (int i=1; i<=p; i++) {
        int op, x, y;
        op=read();
        if (op==3)
            cout<<que_max() <<endl;
        else {
            x=read(), y=read();
            update (x, x+y-1, op, 1);
        }
    }
    return 0;
}
2022/12/26 14:30
加载中...