Submission #1264841

#TimeUsernameProblemLanguageResultExecution timeMemory
1264841minggaCrossing (JOI21_crossing)C++20
100 / 100
1150 ms19156 KiB
// Author: caption_mingle
#include "bits/stdc++.h"

using namespace std;

#define ln "\n"
#define pb push_back
#define fi first
#define se second
#define all(x) (x).begin(), (x).end()
#define sz(x) ((int)(x).size())
#define ll long long
const int mod = 1e9 + 7;
const int inf = 2e9;
const int N = 2e5 + 7;
int n, q, id[100];
char d[] = {'J', 'O', 'I'};
string s[3], t, a[10];
bool ans[N];


string combine(string s, string t) {
	string ans = "";
	for(int i = 0; i < n; i++) {
		ans += d[(id[t[i]] * 2 + id[s[i]] * 2) % 3];
	}
	return ans;
}

struct query {
	int l, r;
	char c;
} que[N];

struct SEGTREE {
	struct node {
		int val;
		bool ok;
		node(int v = -1, bool o = 0) {
			val = v;
			ok = o;
		}
		node operator + (const node& o) {
			node ans;
			if(val == o.val) ans.val = val;
			else ans.val = -1;
			ans.ok = ok && o.ok;
			return ans;
		}
	};
	vector<node> st;
	vector<int> lazy, dak;
	SEGTREE(int n, int id) {
		st.resize(n * 4 + 4, node());
		lazy.resize(n * 4 + 4, -1);
		dak.resize(n * 4 + 4, -1);
		build(1, 1, n, id);
	}
	void build(int i, int l, int r, int x) {
		if(l == r) {
			st[i] = node(id[t[l - 1]], a[x][l - 1] == t[l - 1]);
			// cerr << l << ' ' << t[l - 1] << ' ' << a[x][l - 1] << ' ' << st[i].ok << ln;
			dak[i] = id[a[x][l - 1]];
			return;
		}
		int m = (l + r) >> 1;
		build(i * 2, l, m, x);
		build(i * 2 + 1, m + 1, r, x);
		st[i] = st[i * 2] + st[i * 2 + 1];
		if(dak[i * 2] == dak[i * 2 + 1]) dak[i] = dak[i * 2];
		else dak[i] = -1;
		// cerr << i << ' ' << l << ' ' << r << ' ' << dak[i] << ' ' << st[i].ok << ln;
	}
	void push(int i) {
		if(lazy[i] > -1) {
			int x = lazy[i];
			lazy[i] = -1;
			lazy[i * 2] = lazy[i * 2 + 1] = x;
			st[i * 2].val = x;
			if(dak[i * 2] == x) st[i * 2].ok = 1;
			else st[i * 2].ok = 0;
			st[i * 2 + 1].val = x;
			if(dak[i * 2 + 1] == x) st[i * 2 + 1].ok = 1;
			else st[i * 2 + 1].ok = 0;
		}
	}
	void update(int i, int l, int r, int u, int v, int x) {
		if(l > v or r < u) return;
		if(u <= l and r <= v) {
			st[i].val = x;
			lazy[i] = x;
			if(dak[i] == x) st[i].ok = 1;
			else st[i].ok = 0;
			return;
		}
		int m = (l + r) >> 1;
		push(i);
		update(i * 2, l, m, u, v, x);
		update(i * 2 + 1, m + 1, r, u, v, x);
		st[i] = st[i * 2] + st[i * 2 + 1];
		if(dak[i * 2] == dak[i * 2 + 1]) dak[i] = dak[i * 2];
		else dak[i] = -1;
	}
};

signed main() {
	cin.tie(0) -> sync_with_stdio(0);
	#define task ""
	if(fopen(task ".INP", "r")) {
		freopen(task ".INP", "r", stdin);
		freopen(task ".OUT", "w", stdout);
	}
	id['J'] = 0;
	id['O'] = 1;
	id['I'] = 2;
	cin >> n;
	for(int i = 0; i < 3; i++) cin >> s[i];
	cin >> q;
	cin >> t;
	for(int i = 1; i <= q; i++) {
		int l, r;
		char c;
		cin >> l >> r >> c;
		que[i] = {l, r, c};
	}
	int cnt = 0;
	for(int i = 0; i < 3; i++) {
		a[cnt++] = s[i];
		for(int j = i + 1; j < 3; j++) {
			a[cnt++] = combine(s[i], s[j]);
		}
		a[cnt++] = combine(s[i], combine(s[(i + 1)  % 3], s[(i + 2) % 3]));
	}
	for(int i = 0; i < cnt; i++) {
		// cerr << i << ' ' << a[i] << ' ' << t << ln;
		SEGTREE st(n, i);
		if(st.st[1].ok) ans[0] = 1;
		for(int j = 1; j <= q; j++) {
			auto [l, r, c] = que[j];
			st.update(1, 1, n, l, r, id[c]);
			ans[j] |= st.st[1].ok;
		}
	}
	for(int i = 0; i <= q; i++) {
		if(ans[i]) cout << "Yes";
		else cout << "No";
		cout << ln;
	}
    cerr << "\nTime: " << clock() * 1000 / CLOCKS_PER_SEC;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:110:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  110 |                 freopen(task ".INP", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:111:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  111 |                 freopen(task ".OUT", "w", stdout);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...