社区讨论

分块水不过

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mi7cnk8q
此快照首次捕获于
2025/11/20 19:30
4 个月前
此快照最后确认于
2025/11/20 19:30
4 个月前
查看原帖
听取WA声一片。
求改。。
CPP
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
using namespace std;

const int MAXN = 500005;
const int Lim = 1000;

int n,m,block,num;

int belong[MAXN];
bool vis[Lim];
int tag[Lim];

string s;
int a[MAXN];


void build() {
	memset(vis,true,sizeof vis);
	block = sqrt(n);
	num = n / block;
	if(n % block) num++;
	int now = 1, pre = a[1];
	belong[1] = 1;
	tag[1] = a[1];
	for(int i = 2;i <= n;++i) {
		belong[i] = (i - 1) / block + 1;
		tag[belong[i]] = a[i];
		if(now == belong[i])
			if(pre != a[i]) vis[belong[i]] = false;
		now = belong[i];
		pre = a[i];
	}
}

void Reset(int x) {
	for(int i = (x - 1) * block + 1;i <= x * block;++i)
		if(vis[x]) a[i] = tag[x];
}

bool Query(int l,int r) {
	//Reset(belong[l]);
	//Reset(belong[r]);
	int k;
	if(vis[belong[l]]) k = tag[belong[l]];
	else k = a[l];
	for(int i = l;i <= min(belong[l] * block,r);++i) {
		if(vis[belong[l]]) {
			if(k == tag[belong[l]]) break;
			else return false;
		}
		if(!vis[belong[l]])
			if(k != a[i]) return false;
	}
	if(belong[l] != belong[r])
		for(int i = (belong[r] - 1) * block + 1;i <= r;++i) {
			if(vis[belong[r]]) {
				if(k == tag[belong[r]]) break;
				else return false;
			}
			if(!vis[belong[r]])
				if(k != a[i]) return false;
		}
	for(int i = belong[l] + 1;i <= belong[r] - 1;++i) {
		if(!vis[i]) {
			for(int j = (i - 1) * block + 1;j <= i * block;++j)
				if(a[j] != k) return false;
		} else {
			if(k != tag[i]) return false;
		}
	}
	return true;
}

void Update(int l,int r,int k) {
	Reset(belong[l]);
	Reset(belong[r]);
	for(int i = l;i <= min(belong[l] * block,r);++i) vis[belong[l]] = false, a[i] = k;
	if(belong[l] != belong[r])
		for(int i = (belong[r] - 1) * block + 1;i <= r;++i)
			vis[belong[r]] = false, a[i] = k;
	for(int i = belong[l] + 1;i <= belong[r] - 1;++i) {
		vis[i] = true;
		tag[i] = k;
	} 
}

int main() {
	cin >> n;
	cin >> s;
	for(int i = 0;i < s.size();++i)
		a[i + 1] = s[i] - 'A' + 1;
	build(); /*
	for(int i = 1;i <= num;++i) {
		if(vis[i]) cout << i << " " << tag[i] << endl;
		else cout << i << "False" << endl;
	}*/
	cin >> m;
	for(int i = 1;i <= m;++i) {
		char k,opt;
		int l,r;
		cin >> k;
		if(k == 'A') {
			cin >> l >> r >> opt;
			Update(l,r,opt - 'A' + 1);
		}
		if(k == 'B') {
			cin >> l >> r;
			if(a[l - 1] == a[r + 1]) {
				puts("No");
				continue;
			}
			if(Query(l,r)) puts("Yes");
			else puts("No");
		}
	}
	return 0;
}

回复

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

正在加载回复...