【數(shù)字_ID】CSU-1809-Parenthesis(線段樹+前綴和)

  • 編輯:鄧楚盟
  • 時(shí)間:2018年5月22日

1. 寫在題前

  • scanf大法好,cin我真是T到不要不要的
  • 本來智商就很一般
  • 自己技術(shù)也是真的菜
  • 菜還不努力,我太墮落了
  • 好了負(fù)能量發(fā)泄完了

2. 題意

  • 給你一串左右括號(hào),然后對(duì)原來的串進(jìn)行操作,操作方式是將兩個(gè)位置的括號(hào)交換位置,問你這時(shí)候括號(hào)還匹配嗎,注意每次操作都是對(duì)原串

3. 關(guān)于括號(hào)匹配

  • 紫色數(shù)據(jù)結(jié)構(gòu)那本書,在學(xué)棧的時(shí)候,有一道例題就是括號(hào)匹配,不過那道題只是讓你熟悉棧的用法,真正做這種題當(dāng)然不是這么搞
  • 括號(hào)匹配在實(shí)際題目中大多使用前綴和來判斷的,左括號(hào)是1,右括號(hào)是-1,如果最終括號(hào)匹配,那么每個(gè)位置的前綴和都是大于等于0的,且所有的總和為0

4. 關(guān)于這道題

  • 這道題是交換兩個(gè)位置的括號(hào),部分前綴和在操作后會(huì)改變。對(duì)于交換(u,v)兩個(gè)位置,我們先看都有哪些情況
    1. 如果兩個(gè)都是左括號(hào)或者都是右括號(hào),則前綴和不會(huì)發(fā)生改變,不用考慮
    2. 如果位置u是右括號(hào),位置v是左括號(hào),對(duì)于1到u-1的前綴和,不會(huì)改變,對(duì)于u到v-1,每個(gè)位置的前綴和都會(huì)+2(因?yàn)橹澳硞€(gè)位置的數(shù)由-1變?yōu)?),對(duì)于v及v之后的前綴和,不變(因?yàn)橹皇墙粨Q位置,沒有新增或減少任何數(shù)),所以在這種情況下,如果原來的每個(gè)位置前綴和都大于0,那么新的前綴和肯定也滿足條件
    3. 如果位置u是左括號(hào),位置v是右括號(hào),那么交換位置后,u到v-1的前綴和每個(gè)都會(huì)減2(由1到-1),所以,如果這個(gè)操作后這段前綴和仍然大于0——也就是說在操作前(u,v-1)這一段的每個(gè)值都大于等于2,即最小值>=2——那么就還是滿足括號(hào)匹配條件的
  • 好,經(jīng)過分析,如果交換前(u,v-1)這一段的前綴和的最小值>=2,則仍然滿足匹配,很明顯我們可以用線段樹對(duì)前綴和數(shù)組維護(hù)區(qū)間最小值,那么這道題也就解了
  • 另外,原始的串題目中說是滿足條件的了,所以我們只需要關(guān)心操作的左右區(qū)間的最小值即可

5. 代碼

#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<iostream>

using namespace std;


#define LSon(x) ((x)<<1)
#define RSon(x) ((x)<<1|1)


const int maxn = 200020;
const int root = 1;
int n,k;


int pre[maxn];
char cc[maxn];
int node[maxn<<2];

void update(int pos)
{
    node[pos] = min(node[LSon(pos)],node[RSon(pos)]);
}

void build(int l,int r,int pos)
{
    node[pos]= 0;
    if(l == r)
    {
        //cout<<l<<endl;
        node[pos] = pre[l];
        return;
    }
    int m = l+r>>1;
    build(l,m,LSon(pos));
    build(m+1,r,RSon(pos));
    update(pos);
}


int query(int l,int r,int x,int y,int pos)
{
    if(x<=l&&r<=y)
    {
    //cout<<"**"<<node[pos]<<"**"<<pos<<"**"<<endl;
        return node[pos];
    }
    int res = 0x3f3f3f3f;
    
    int m = l+r>>1;
    if(x<=m)res=min(res,query(l,m,x,y,LSon(pos)));
    if(y>m)res=min(res,query(m+1,r,x,y,RSon(pos)));
    return res;
}

int main()
{
    while(~scanf("%d%d",&n,&k))
    {
        memset(pre,0,sizeof(pre));
        memset(node,0x3f3f3f3f,sizeof(node));
        getchar();
        scanf("%s",cc+1);
        for(int i = 1;i<=n;i++)
        {

            if(cc[i] == '(')pre[i] = pre[i-1]+1;
            else pre[i] = pre[i-1] - 1;
        }

        build(1,n,root);
        //for(int i = 1;i<=2*n-1;i++)printf("%d",node[i]);
        for(int i = 0;i<k;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            if(a>b)
            {
                int ccc = a;
                a = b;
                b = ccc;
            }
            
            if(cc[a] == '('&&cc[b] == ')')
            {

                int d = query(1,n,a,b-1,root);
                if(d>=2)printf("Yes\n");
                else printf("No\n");
            }
            else printf("Yes\n");
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,525評(píng)論 19 139
  • 這個(gè)不錯(cuò)分享給大家,從扣上看到的,就轉(zhuǎn)過來了 《電腦專業(yè)英語》 file [fail] n. 文件;v. 保存文...
    麥子先生R閱讀 7,097評(píng)論 5 24
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,701評(píng)論 0 5
  • 如果上市公司董秘技能水平都不及保薦代表人,或者獨(dú)立第三方服務(wù)機(jī)構(gòu)(律所、會(huì)計(jì)師事務(wù)所,評(píng)估機(jī)構(gòu)等),那么上市公司的...
    桃子torri閱讀 1,038評(píng)論 2 6
  • 吵雜忙碌了幾個(gè)星期,身體終于有些疲憊了。伴隨著這幾天奇怪的陰雨天氣,總是讓人有種昏昏欲睡的感覺,大概南方的...
    言JT閱讀 296評(píng)論 0 1

友情鏈接更多精彩內(nèi)容