- 編輯:鄧楚盟
- 時(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è)位置,我們先看都有哪些情況
- 如果兩個(gè)都是左括號(hào)或者都是右括號(hào),則前綴和不會(huì)發(fā)生改變,不用考慮
- 如果位置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,那么新的前綴和肯定也滿足條件
- 如果位置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ù)。