首页 > 其他分享 >CSG1140 -- 括号序列

CSG1140 -- 括号序列

时间:2023-03-26 21:45:21浏览次数:51  
标签:匹配 改变 -- tr 括号 int query CSG1140

括号序列

分析:

线段树维护区间()的差值:

  • 首先若两个位置是相同字符,不会改变匹配形式,直接 YES;
  • 若选择)(改变,因为原本是合法的,这样交换过后总是能再次匹配;
  • 若选择()改变,会改变原本的匹配形式,但造成影响的只有[l, r - 1]这一段,如果 () 多至少 2 个,在改变过后就会使得 ) 仍然比 (多 ,因为原本是合法的,这样(就会与后面的)匹配合法;

相当于只有 query 操作

实现:

int l[N], r[N];
int a[N];
struct Node
{
    int l, r;
    int minv;
} tr[N << 2];
void pushup(Node &u, Node &l, Node &r)
{
    u.minv = min(l.minv, r.minv);
}
void pushup(int u)
{
    pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
}
void build(int u, int l, int r)
{
    if (l == r)
        tr[u] = {l, l, a[l]};
    else
    {
        tr[u] = {l, r};
        int mid = l + r >> 1;
        build(Lson), build(Rson);
        pushup(u);
    }
}
int query(int u, int l, int r)
{
    if (tr[u].l >= l && tr[u].r <= r)
        return tr[u].minv;
    else
    {
        int res = INF;
        int mid = tr[u].l + tr[u].r >> 1;
        if (l <= mid)
            res = min(res, query(u << 1, l, r));
        if (r > mid)
            res = min(res, query(u << 1 | 1, l, r));
        return res;
    }
}
void solve()
{
    for (int i = 1; i <= n; i++)
        l[i] = r[i] = 0;

    cin >> s;
    s = " " + s;

    for (int i = 1; i <= n; i++)
    {
        if (s[i] == '(')
        {
            l[i] = l[i - 1] + 1;
            r[i] = r[i - 1];
        }
        else
        {
            l[i] = l[i - 1];
            r[i] = r[i - 1] + 1;
        }
        a[i] = l[i] - r[i];
    }

    build(1, 1, n);

    while (q--)
    {
        int x, y;
        cin >> x >> y;
        if (x > y)
            swap(x, y);
        if (s[x] == '(' && s[y] == ')')
        {
            if (query(1, x, y - 1) >= 2)
                cout << "Yes" << endl;
            else
                cout << "No" << endl;
        }
        else
            cout << "Yes" << endl;
    }
}

标签:匹配,改变,--,tr,括号,int,query,CSG1140
From: https://www.cnblogs.com/Aidan347/p/17259635.html

相关文章

  • 线程(确实还有没理解到位的地方)
    多线程Thread类多条执行路径,主线程和子线程并行交替执行packagexiancheng;publicclassDemo01extendsThread{//创建线程方式一:继承Thread类,重写run方法,调用s......
  • 第五周(家用热水器用户行为分析与时间识别)
    探索分析热水器的水流量状况#%%importpandasaspdimportmatplotlib.pyplotasplt#%%inputfile='../data/original_data.xls'data=pd.read_excel(inputfile)......
  • Spring的@Transactional如何实现的
    @Transactional注解简介@Transactional是spring中声明式事务管理的注解配置方式。@Transactional注解可以帮助我们把事务开启、提交或者回滚的操作,通过aop的方式进行管理......
  • [ABC295Ex] E or m 题解
    状压dp,2hd4me/ng。题意开始你有一个全\(0\)矩阵,你可以随意执行如下操作:选择任意一行,将其从最左端开始的连续一段染成\(1\)。选择任意一列,将其从最上端开始的连......
  • 简单数据结构做题记录
    CF526FPuddingMonsters典题,发现这本质上是一个一维问题,一个区间合法当且仅当\(\max-\min=r-l\),枚举右端点维护左端点的变化量,用两个单调栈维护到\(r\)的最大最......
  • OOP第一次博客总结
    目录1、前言2、设计与分析3、踩坑心得4、改进建议5、总结 题目集1:1、计算年利率2、身体质量指数(BMI)测算3、九九乘法表(双重循环)4、快递运......
  • mybatis的resultMap部分映射字段失败
    出现这种情况,一般是sql语句多表查询时,返回的字段出现重复情况,比如a对象分别有handle_status属性,和b嵌套对象,但是b对象里面也有handle_status属性,两张表进行关联查询,并且要......
  • python3实现阿里云短信发送功能
    #-*-coding:utf-8-*-importuuidimportsysimportjsonimportuuidfromaliyunsdkcore.clientimportAcsClientfromaliyunsdkcore.profileimportregion_pr......
  • 数据分析第十章
    #10-1importpandasaspdimportmatplotlib.pyplotaspltinputfile="D:\数据分析\original_data.xls"data=pd.read_excel(inputfile)lv_non=pd.value_counts(dat......
  • 前端设计模式——路由模式
    路由模式(RouterPattern):将页面的不同状态映射到不同的URL路径上,使得用户可以直接通过URL来访问页面的不同状态。路由模式通常用于实现单页面应用(SPA)的页面导航和状态管理......