第三屆中國計量大學ACM程序設計競賽個人賽(同步賽)——L題

題目鏈接添加鏈接描述
典型線段樹,單點修改,區間維護。

#include<bits/stdc++.h>

using namespace std;

const int maxn = 1e6+1;
char str[maxn];
int sum[4*maxn], mi[4*maxn];

void modify(int o, int x, int l, int r, int lr) {
	if (l == r) {
		sum[o] = mi[o] = x;
		return ;
	}
	int mid = l + r >> 1;
	if (mid >= lr) modify(o<<1,x,l,mid,lr);
	else modify(o<<1|1,x,mid+1,r,lr);
	sum[o] = sum[o<<1] + sum[o<<1|1];
	mi[o] = min(mi[o<<1], sum[o<<1] + mi[o<<1|1]); 
}

int main() {
	int n, m;
	cin >> n >> m;
	for(int i = 1; i <= n; ++ i) {
		cin >> str[i];
		if (str[i] == '(') modify(1,1,1,n,i);
		else modify(1,-1,1,n,i);
	}
	while(m--) {
		int d;
		cin >> d;
		if (str[d] == '(') str[d] = ')', modify(1,-1,1,n,d);
		else str[d] = '(', modify(1,1,1,n,d);
		// cout << sum[1] << " " << mi[1] << endl;
		if (sum[1] == 0 && mi[1] >= 0) cout << "Yes" << endl;
		else cout << "No" << endl;
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章