萌新刚学ODT,抱灵求助
查看原帖
萌新刚学ODT,抱灵求助
639563
封禁用户楼主2024/1/1 22:00

rt,只A了一个Hack

#include <bits/stdc++.h>
using namespace std;

struct node {
	int l, r;
	char tp;
	node(int _l, int _r, char _tp) {
		l = _l, r = _r, tp = _tp;
	}
};

bool operator <(node a, node b) {
	if (a.l != b.l) {
		return a.l < b.l;
	}
	if (a.r != b.r) {
		return a.r < b.r;
	}
	return a.tp < b.tp;
}
set<node> tree;

auto find(int x) {
	auto it = --tree.upper_bound(node(x, 1919810, 'X'));
	return it;
}

void split(int x) {
	auto p = find(x);
	int l = p->l, r = p->r;
	char tp = p->tp;
	tree.erase(p);
	tree.insert(node(l, x - 1, tp));
	tree.insert(node(x, r, tp));
}

void assign(int l, int r, char tp) {
	split(l), split(r + 1);
	auto lp = find(l), rp = ++find(r);
	tree.erase(lp, rp);
	tree.insert(node(l, r, tp));
}

char get(int l, int r) {
	auto lp = find(l), rp = find(r);
//	cerr << "get " << l << "," << r << ":" << endl;
//	cerr << lp->l << " " << lp->r << " " << lp->tp << endl;
//	cerr << rp->l << " " << rp->r << " " << rp->tp << endl;
	if (lp == rp) {
		return lp->tp;
	} else {
		return '?';
	}
}

char s[500005];

int main() {
	int n;
	scanf("%d", &n);
	scanf("%s", s);
	int lst = 0;
	for (int i = 1; i < n + 1; i++) {
		if (s[i] != s[lst]) {
			tree.insert(node(lst, i - 1, s[lst]));
			lst = i;
		}
	}
	int q;
	scanf("%d", &q);
	while (q--) {
		char op[5];
		scanf("%s", op);
		if (op[0] == 'A') {
			int l, r;
			char tp[5];
			scanf("%d %d %s", &l, &r, tp);
			l--, r--;
			assign(l, r, tp[0]);
		} else {
			int l, r;
			scanf("%d %d", &l, &r);
			l--, r--;
//			for (node x : tree) {
//				cerr << x.l << " " << x.r << " " << x.tp << endl;
//			}
			if (get(l, r) != '?' && (l == 0 || r == n - 1 || get(l - 1, l - 1) != get(r + 1, r + 1))) {
				puts("Yes");
			} else {
				puts("No");
			}
		}
	}
}
2024/1/1 22:00
加载中...