求助,明明和题解写的几乎一样了
  • 板块P10513 括号
  • 楼主wuyan1943
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/5/29 20:34
  • 上次更新2024/5/29 23:21:38
查看原帖
求助,明明和题解写的几乎一样了
980560
wuyan1943楼主2024/5/29 20:34

完全不知道错在哪里了,希望大佬能指点一下,只要是涉及到修改查询就全错,但是明明样例也过了

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n, q;
constexpr int N = 5e5 + 10;
struct info {
    int Lcnt, Rcnt, match;
};
struct node{
    info preinfo, reveinfo;
}tree[N<<2];
bool tag[N<<2];
char buff[N];
void lazy(int i)
{
    tag[i] = 1;
    swap(tree[i].preinfo, tree[i].reveinfo);
}
void push_down(int i)
{
    if(!tag[i])
        return;
    lazy(i << 1);
    lazy(i << 1 | 1);
    tag[i] = 0;
}
info merge(info & a1 ,info &a2)
{
    int new_match = min(a1.Lcnt, a2.Rcnt);
    return info{a1.Lcnt + a2.Lcnt - new_match, a1.Rcnt + a2.Rcnt - new_match, a1.match + new_match + a2.match};
}
info query(int jl,int jr,int l,int r,int i)
{
        if(jl<=l&&jr>=r) {
            return tree[i].preinfo;
        }
        push_down(i);
        int mid = l + r >> 1;
        if(jr<=mid)
            return query(jl, jr, l, mid, i << 1);
            else if(jl>mid)
                return query(jl, jr, mid + 1, r, i << 1 | 1);
            info ans1 = query(jl, jr, l, mid, i << 1);
            info ans2 = query(jl, jr, mid + 1, r, i << 1 | 1);
            return merge(ans1, ans2);
}
void push_up(info &pa,info &lson,info &rson)
{
    pa = merge(lson, rson);
}
void update(int jl,int jr,int l,int r,int i)
{
    if(jl<=l&&jr>=r)
    {
        lazy(i);
        return;
    }
    push_down(i);
    int mid = l + r >> 1;
    if(jl<=mid)
        update(jl, jr, l, mid, i << 1);
        if(jr>mid)
            update(jl, jr, mid + 1, r,i << 1 | 1);
        push_up(tree[i].preinfo, tree[i << 1].preinfo, tree[i << 1 | 1].preinfo);
        push_up(tree[i].reveinfo, tree[i << 1].reveinfo, tree[i << 1 | 1].reveinfo);
}
void build(int l,int r,int i)
{
    if(l==r)
    {
        if(buff[l]=='(')
        {
            tree[i] = {1, 0, 0, 0, 1, 0};

        }
        else {
            tree[i] = {0, 1, 0, 1, 0, 0};
        }
        return;
    }
    int mid = l + r >> 1;
    build(l, mid, i << 1);
    build(mid + 1, r, i << 1 | 1);
    push_up(tree[i].preinfo, tree[i << 1].preinfo, tree[i << 1 | 1].preinfo);
    push_up(tree[i].reveinfo, tree[i << 1].reveinfo, tree[i << 1 | 1].reveinfo);
}
int main()
{
   
    scanf("%d\n", &n);
    scanf("%s", buff + 1);
    scanf("%d", &q);
    build(1, n, 1);
    int op, L, R;
    for (int i = 0; i < q;++i)
    {
        scanf("%d %d %d", &op, &L, &R);
        if(op==2)
        {       
             printf("%d\n", query(L,R,1,n,1).match);
        }
        else {
            update(L, R, 1, n, 1);
        }
    }
    return 0;
}
2024/5/29 20:34
加载中...