萌新求助fhq,过样例但是WA=0
查看原帖
萌新求助fhq,过样例但是WA=0
468657
lsj2009Isj2OO9楼主2023/9/19 10:27

rt.

求巨佬找错或者给一组 hack/bx

#include<bits/stdc++.h>
//#define int long long
#define ll long long
#define ull unsigned long long
#define PII pair<int,int>
#define INF 0x3f3f3f3f
#define INFLL 0x3f3f3f3f3f3f3f3f
#define rep(k,l,r) for(int k=l;k<=r;++k)
#define per(k,r,l) for(int k=r;k>=l;--k)
#define cl(f,x) memset(f,x,sizeof(f))
using namespace std;
const int N=1e5+5;
mt19937 rd(time(0));
struct node {
    int lson,rson;
    int premax,premin,sufmax,sufmin;
    int val,sum,x,siz;
    int tag_cov,tag_rev,tag_inv;
}; node tree[N];
#define ls(k) tree[k].lson
#define rs(k) tree[k].rson
int p;
int new_node(int x) {
    tree[++p]={0,0,max(x,0),min(x,0),max(x,0),min(x,0),x,x,(int)rd(),1,0,0,0};
    return p;
}
void push_up(int k) {
    tree[k].premax=max(tree[ls(k)].premax,tree[ls(k)].sum+tree[k].val+tree[rs(k)].premax);
    tree[k].premin=min(tree[ls(k)].premin,tree[ls(k)].sum+tree[k].val+tree[rs(k)].premin);
    tree[k].sufmax=max(tree[rs(k)].sufmax,tree[rs(k)].sum+tree[k].val+tree[ls(k)].sufmax);
    tree[k].sufmin=min(tree[rs(k)].sufmin,tree[rs(k)].sum+tree[k].val+tree[ls(k)].sufmin);
    tree[k].sum=tree[ls(k)].sum+tree[k].val+tree[rs(k)].sum;
    tree[k].siz=tree[ls(k)].siz+1+tree[rs(k)].siz;
}
void upd_cov(int k,int val) {
    tree[k].sum=tree[k].siz*val; tree[k].val=val;
    tree[k].premax=tree[k].sufmax=max(0,tree[k].sum);
    tree[k].premin=tree[k].sufmin=min(0,tree[k].sum);
    tree[k].tag_cov=val;
}
void upd_rev(int k) {
    swap(tree[k].premax,tree[k].sufmax);
    swap(tree[k].premin,tree[k].premax);
    tree[k].tag_rev^=1;
}
void upd_inv(int k) {
    int t1=tree[k].premax,t2=tree[k].premin;
    tree[k].premax=-t2; tree[k].premin=-t1;
    int t3=tree[k].sufmax,t4=tree[k].sufmin;
    tree[k].sufmax=-t4; tree[k].sufmin=-t3;
    tree[k].tag_inv^=1; 
    tree[k].tag_cov=-tree[k].tag_cov;
    tree[k].sum=-tree[k].sum; tree[k].val=-tree[k].val;
}
void push_down(int k) {
    if(tree[k].tag_inv) {
        if(ls(k))
            upd_inv(ls(k));
        if(rs(k))
            upd_inv(rs(k));
        tree[k].tag_inv=0;
    }
    if(tree[k].tag_cov) {
        if(ls(k))
            upd_cov(ls(k),tree[k].tag_cov);
        if(rs(k))
            upd_cov(rs(k),tree[k].tag_cov);
        tree[k].tag_cov=0;
    }
    if(tree[k].tag_rev) {
        if(ls(k))
            upd_rev(ls(k));
        if(rs(k))
            upd_rev(rs(k));
        tree[k].tag_rev=0;
    }
}
int merge(int u,int v) {
    if(!u||!v)
        return u|v;
    if(tree[u].x<tree[v].x) {
        push_down(u);
        rs(u)=merge(rs(u),v);
        push_up(u);
        return u;
    } else {
        push_down(v);
        ls(v)=merge(u,ls(v));
        push_up(v);
        return v;
    }
}
void split(int k,int val,int &u,int &v) {
    if(!k) {
        u=v=0;
        return;
    }
	push_down(k);
    if(tree[ls(k)].siz<val)
        u=k,split(rs(k),val-tree[ls(k)].siz-1,rs(u),v);
    else
        v=k,split(ls(k),val,u,ls(v));
    push_up(k);
}
int calc(char ch) {
    return ch=='('? 1:-1;
}
string s;
int build(int l,int r) {
    if(l==r)
        return new_node(calc(s[l-1]));
    int mid=(l+r)>>1;
    return merge(build(l,mid),build(mid+1,r));
}
int root,n,q;
signed main() {
    scanf("%d%d",&n,&q);
    cin>>s;
    root=build(1,n);
    while(q--) {
        cin>>s;
        int l,r;
        scanf("%d%d",&l,&r);
        if(s[0]=='R') {
            char ch; cin>>ch;
            int u=0,v=0,w=0;
            split(root,l-1,u,v);
            split(v,r-l+1,v,w);
            upd_cov(v,calc(ch));
            root=merge(u,merge(v,w));
        } else if(s[0]=='S') {
            int u=0,v=0,w=0;
            split(root,l-1,u,v);
            split(v,r-l+1,v,w);
            upd_rev(v);
            root=merge(u,merge(v,w));
        } else if(s[0]=='I') {
            int u=0,v=0,w=0;
            split(root,l-1,u,v);
            split(v,r-l+1,v,w);
            upd_inv(v);
            root=merge(u,merge(v,w));
        } else {
            int u=0,v=0,w=0;
            split(root,l-1,u,v);
            split(v,r-l+1,v,w);
            printf("%d\n",(-tree[v].premin)/2+(tree[v].sufmax)/2);
            root=merge(u,merge(v,w));
        }
    }
    return 0;
}
2023/9/19 10:27
加载中...