首页 > 其他分享 >ABC341

ABC341

时间:2024-02-18 15:11:57浏览次数:25  
标签:count set 两个 int st ABC341 op

E

link

这个题目中所说的好的其实就是像\(010101\)这样一个\(0\),一个\(1\)的字符串。
那么不好的就是两个\(0\)或两个\(1\)在一起,所以判断一个区间好不好只需要判断一个区间内有没有两个\(0\)或两个\(1\)在一起,那么我们可以把两个\(0\)或两个\(1\)在一起的位置存下来。
先考虑查询操作。
我们只需要判断\(l\)到\(r\)之间有没有两个\(0\)或两个\(1\)在一起,如果所存的位置是升序的,可以直接用二分来做,于是想到了\(set\)。
再考虑修改。
其实修改就是开头和结尾会改变,那么如果原来的开头是好的(\(set\)里没有),那么会变成坏的,反之亦然。结尾也一样。

点击查看代码
#include<bits/stdc++.h>

#define int long long

using namespace std;

int n,q;
char s[500005];
set<int> st;

signed main(){
	
	cin >> n >> q;
	cin >> s+1;
	
	for(int i = 2;i <= n;++ i)
		if(s[i] == s[i-1]) st.insert(i);
	
	while(q--){
		
		int op,l,r;
		cin >> op >> l >> r;
		
		if(op == 1){
			if(l > 1){
				if(st.count(l)){
					st.erase(l);
				}
				else st.insert(l);
			}
			if(r < n){
				if(st.count(r+1)){
					st.erase(r+1);
				}
				else st.insert(r+1);
			}
		}
		
		if(op == 2){
			auto it = st.upper_bound(l);
			if(it == st.end()||*it > r){
				cout << "Yes\n";
			}
			else cout << "No\n";
		}
		
	}
	
	return 0;
	
}

标签:count,set,两个,int,st,ABC341,op
From: https://www.cnblogs.com/wmmdbk/p/18019271

相关文章

  • ABC341E 题解
    看到01串的反转考虑维护异或差分序列\(s_i=a_i\oplusa_{i-1}\)。这样区间反转就变成了单点修改。然后考虑怎么查询:若一个区间\([l,r]\)是好区间,那么对于\(i\in[l+1,r]\)一定存在\(s_i=1\)。所以我们可以查询区间和来判断是否为好区间。使用线段树维护区间和即可,单......
  • ABC341G 题解
    blog。妈的,被trick干爆了。\(\textbf{Trick}\):将所有\(N_i=(i,\sum\limits_{j=1}^ia_j)\)视作一点,则区间\([l,r]\)的平均值为\((N_{l-1},N_r)\)的斜率。\(\textbf{Prove}\):由\(\text{slope}=\dfrac{y_2-y_1}{x_2-x_1}\)易证。根据这个trick,\(k\)的答案即为\(k......
  • ABC341
    T1:Print341模拟代码实现n=int(input())print('1'+'01'*n)T2:ForeignExchange模拟代码实现n=int(input())a=list(map(int,input().split()))foriinrange(n-1):s,t=map(int,input().split())x=a[i]//sa[i+1]+=t*xp......