社区讨论

珂朵莉树九十分求条

P4979矿洞:坍塌参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhpi7u3n
此快照首次捕获于
2025/11/08 07:46
4 个月前
此快照最后确认于
2025/11/08 07:46
4 个月前
查看原帖
WAWA55
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
template<typename TY>
inline void read(TY &s){
	ll x = 0,f = 1;
    char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	s = x * f;
}
int n,k;
struct node{
	int l,r;
	mutable int val;
	bool operator<(const node &d)const{
		return l < d.l;
	}
};
set<node> se;
auto split(int x){
	auto it = se.lower_bound({x,0,0});
	if(it != se.end() && it->l == x) return it;
	it--;
	int l = it->l,r = it->r,val = it->val;
	se.erase(it);
	se.insert({l,x-1,val});
	return se.insert({x,r,val}).first;
}
inline void assign(int l,int r,int v){
	auto itl = prev(se.upper_bound({l,0,0})),itr = prev(se.upper_bound({r,0,0}));
	if(itr->val == v){
		r = itr->r,itr = next(itr);
	} 
	else{
		itr = split(r+1); 
	}
	if(itl->val == v){
		l = itl->l;
	}
	else itl = split(l);
	se.erase(itl,itr);
	se.insert({l,r,v});
}
inline bool query(int l,int r){
	auto itl = prev(se.upper_bound({l,0,0})),itr = prev(se.upper_bound({r,0,0}));
	if(itl != itr) return false;
	if(l == 1 || r == n) return true;
	auto it_l = prev(se.upper_bound({l-1,0,0})),it_r = prev(se.upper_bound({r+1,0,0}));
//	cerr << l - 1 << " " << r + 1 << " " << it_l->val << " what? " << it_r->val << "\n";
	if(it_l->val == it_r->val) return false;
	return true;
}
int main(){
	read(n);
	string s;
	cin >> s;
	int l = 1, r = 1,v = (s[0]-'A') + 1;
	for(int i=1;i<s.size();i++){
		if((s[i] - 'A') + 1 == v) r++;
		else{
//			cerr << s[i] << " ";
//			cerr << l << " " << r << " " << v << "?\n";
			se.insert({l,r,v});
			r++; l = r; v = (s[i]-'A') + 1;
		}
	} 
	se.insert({l,r,v});
	se.insert({n+1,n+1,0});
	se.insert({0,0,0});
//	cerr << l << " " << r << " " << v << "?\n";
	int q;
	read(q);
	char opt,ch;
	while(q--){
		cin >> opt; read(l); read(r);
		if(opt == 'A'){
			cin >> ch;
			v = (ch - 'A') + 1;
			assign(l,r,v);
		}
		else{
			if(query(l,r)) cout << "Yes\n";
			else cout << "No\n";	 
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...