제출 #1223110

#제출 시각아이디문제언어결과실행 시간메모리
1223110trideserCrossing (JOI21_crossing)C++20
26 / 100
357 ms11216 KiB
#include <bits/stdc++.h>
using namespace std;

struct SegmentTree {
	vector<int> data;
	vector<int> upd;
	int size;
	int depth;
	SegmentTree(int N, vector<int> v) {
		size = 1;
		depth = 0;
		while(size < N) {
			size *= 2;
			depth++;
		}
		data = vector<int>(2 * size, 0);
		upd = vector<int>(2 * size, -1);
		for(int i = 0; i < v.size(); i++) {
			data[size + i] = v[i];
		}
		for(int i = depth - 1; i >= 0; i--) {
			for(int j = 0; j < (1 << i); j++) {
				int node = (1 << i) + j;
				data[node] = data[2 * node] + data[2 * node + 1];
			}
		}
	}

	void propagate(int node, int layer) {
		if(upd[node] == -1)
			return;
		if(layer != depth) {
			upd[2 * node] = upd[node];
			upd[2 * node + 1] = upd[node];
		}
		data[node] = (upd[node] << (depth - layer));
		upd[node] = -1;
	}

	void set(int begin, int end, int val) {
		int a = 0;
		int b = 0;
		for(int i = 0; i < depth; i++) {
			int na, nb;
			int aindex = a + (1 << i);
			int bindex = b + (1 << i);
			propagate(aindex, i);
			propagate(bindex, i);
			if((a << (depth - i)) + (1 << (depth - i - 1)) <= begin) {
				na = 2 * a + 1;
			}
			else {
				if(a != b) {
					propagate(2 * aindex + 1, i + 1);
					upd[2 * aindex + 1] = val;
				}
				na = 2 * a;
			}

			if((b << (depth - i)) + (1 << (depth - i - 1)) - 1 >= end) {
				nb = 2 * b;
			}
			else {
				if(a != b) {
					propagate(2 * bindex, i + 1);
					upd[2 * bindex] = val;
				}
				nb = 2 * b + 1;
			}
			a = na;
			b = nb;
		}
		int aindex = a + (1 << depth);
		int bindex = b + (1 << depth);
		propagate(aindex, depth);
		propagate(bindex, depth);
		upd[aindex] = val;
		upd[bindex] = val;

		aindex /= 2;
		bindex /= 2;
		for(int i = depth - 1; i >= 0; i--) {
			propagate(2 * aindex, i + 1);
			propagate(2 * aindex + 1, i + 1);
			propagate(2 * bindex, i + 1);
			propagate(2 * bindex + 1, i + 1);
			data[aindex] = data[2 * aindex] + data[2 * aindex + 1];
			data[bindex] = data[2 * bindex] + data[2 * bindex + 1];
			aindex /= 2;
			bindex /= 2;
		}
	}

	int get(int begin, int end) {
		int a = 0;
		int b = 0;
		int ret = 0;
		for(int i = 0; i < depth; i++) {
			int na, nb;
			int aindex = a + (1 << i);
			int bindex = b + (1 << i);
			if((a << (depth - i)) + (1 << (depth - i - 1)) <= begin) {
				na = 2 * a + 1;
			}
			else {
				if(a != b) {
					propagate(2 * aindex + 1, i + 1);
					ret += data[2 * aindex + 1];
				}
				na = 2 * a;
			}

			if((b << (depth - i)) + (1 << (depth - i - 1)) - 1 >= end) {
				nb = 2 * b;
			}
			else {
				if(a != b) {
					propagate(2 * bindex, i + 1);
					ret += data[2 * bindex];
				}
				nb = 2 * b + 1;
			}
			a = na;
			b = nb;
		}
		int aindex = a + (1 << depth);
		int bindex = b + (1 << depth);
		propagate(aindex, depth);
		propagate(bindex, depth);
		ret += data[aindex];
		if(aindex != bindex) ret += data[bindex];
		return ret;
	}
	void print() {
		cout << "TREE:\n";
		for(int a : data)
			cout << a << " ";
		cout << "\n";
		for(int a : upd)
			cout<<a<<" ";
		cout << "\n\n";
	}
};

int chti(char ch) {
	if (ch == 'J') return 0;
	if (ch == 'O') return 1;
	if (ch == 'I') return 2;
	return -1;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	int N, Q;
	cin >> N;
	string s, t;
	cin >> s;
	cin >> s;
	cin >> s;
	cin >> Q;
	cin >> t;
	
	vector<vector<int>> vect(3, vector<int>(N));
	vector<int> curc(3, 0);
	for(int i = 0; i < N; i++) {
		curc[chti(s[i])]++;
		for(int j = 0; j < 3; j++)
			vect[j][i] = curc[j];
	}
	
	vector<vector<int>> p(3);
	for(int i = 0; i < 3; i++) {
		p[i] = vector<int>(curc[i] + 3, 0);
	}
	for(int i = 0; i < N; i++) {
		if(s[i] == t[i]) {
			p[chti(s[i])][vect[chti(s[i])][i] - 1] = 1;
		}
	}


/*
	for(vector<int> v : p) {
		for(int a : v)
			cout << a << " ";
		cout << "\n";
	}
	cout << "\n";
*/

	vector<SegmentTree> forest;
	for(int i = 0; i < 3; i++) {
		forest.push_back(SegmentTree(curc[i] + 3, p[i]));
	}

	int sum = 0;
	for(int j = 0; j < 3; j++) {
		sum += forest[j].get(0, curc[j] - 1);
	}
	cout << (sum == N ? "Yes" : "No") << "\n";
	for(int i = 0; i < Q; i++) {
		int a, b;
		char val;
		cin >> a;
		cin >> b;
		cin >> val;
		a--;
		b--;
		int vali = chti(val);

		for(int j = 0; j < 3; j++) {
			int ca = a == 0 ? 0 : vect[j][a - 1];
			int cb = vect[j][b];
			if(cb - ca == 0)
				continue;
			int start = ca;
			int end = cb - 1;
	//		cout << "+" << j << " " << (vali==j?1:0) << " " << ca << " " << cb << " " << a << " " << b << " " << start << " " << end << "\n";
			forest[j].set(start, end, vali == j ? 1 : 0);
		}
		int sum = 0;
		for(int j = 0; j < 3; j++) {
			sum += forest[j].get(0, curc[j] - 1);
	//		cout << j << " " << forest[j].size << " " << curc[j] - 1 << " " << forest[j].get(0, curc[j] - 1) << "\n";
			//forest[j].print();
		}
		cout << (sum == N ? "Yes" : "No") << "\n";
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...