제출 #419651

#제출 시각아이디문제언어결과실행 시간메모리
419651alishahali1382Crossing (JOI21_crossing)C++14
100 / 100
1857 ms47568 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O2")
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef long double ld;
typedef pair<pii, int> piii;
#define debug(x) {cerr<<#x<<"="<<x<<"\n";}
#define debug2(x, y) {cerr<<"{"<<#x<<", "<<#y<<"}={"<<x<<", "<<y<<"}\n";}
#define debugp(p) {cerr<<#p<<"={"<<p.first<<" "<<p.second<<"}\n";}
#define debugv(abcd) {cerr<<#abcd<<": ";for (auto dcba:abcd) cerr<<dcba<<" ";cerr<<"\n";}
#define pb push_back
#define all(x) x.begin(), x.end()
#define kill(x) return cout<<x<<"\n", 0;
#define SZ(x) ((int)x.size())

const int inf=1000010000;
const int mod=1000000007;
const int MAXN=300010, TED=5;

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

int n, m, q, k, u, v, x, y, t, l, r, ans;
int A[3][MAXN], B[9][MAXN], T0[MAXN];
int Z[27];
char ch;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

struct Solver{
	ll rnd[MAXN], ps[MAXN];
	int Bs[9];
	int seg[MAXN<<2], lazy[MAXN<<2];
	void Start(){
		for (int i=1; i<=n; i++){
			rnd[i]=rng()%mod;
			ps[i]=ps[i-1]+rnd[i];
		}
		for (int j=0; j<9; j++){
			ll sum=0;
			for (int i=1; i<=n; i++) sum+=rnd[i]*B[j][i];
			Bs[j]=sum%mod;
		}
		Build(1, 1, n+1);
	}
	int Build(int id, int tl, int tr){
		lazy[id]=-1;
		if (tr-tl==1) return seg[id]=rnd[tl]*T0[tl]%mod;
		int mid=(tl+tr)>>1;
		return seg[id]=(Build(id<<1, tl, mid)+Build(id<<1 | 1, mid, tr))%mod;
	}
	inline void add_lazy(int id, int tl, int tr, int val){
		// cerr<<"lazy "<<tl<<" "<<tr<<"  "<<val<<"\n";
		lazy[id]=val;
		seg[id]=(ps[tr-1]-ps[tl-1])*val%mod;
	}
	inline void shift(int id, int tl, int tr){
		if (lazy[id]!=-1){
			int mid=(tl+tr)>>1;
			add_lazy(id<<1, tl, mid, lazy[id]);
			add_lazy(id<<1 | 1, mid, tr, lazy[id]);
			lazy[id]=-1;
		}
	}
	void Set(int id, int tl, int tr, int l, int r, int val){
		if (r<=tl || tr<=l) return ;
		if (l<=tl && tr<=r){
			// cerr<<"add_lazy "<<tl<<" "<<tr<<"  "<<val<<"\n";
			add_lazy(id, tl, tr, val);
			return ;
		}
		shift(id, tl, tr);
		int mid=(tl+tr)>>1;
		Set(id<<1, tl, mid, l, r, val);
		Set(id<<1 | 1, mid, tr, l, r, val);
		seg[id]=(seg[id<<1] + seg[id<<1 | 1])%mod;
	}
	bool Solve(){
		for (int i=0; i<9; i++) if (Bs[i]==seg[1]) return 1;
		return 0;
	}
} solver[TED];

bool Solve(){
	for (int i=0; i<TED; i++) if (!solver[i].Solve()) return 0;
	return 1;
}

int main(){
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	Z[1]=Z[3]=Z[9]=1;
	for (int i=0; i<27; i++){
		for (int x=0; x<27; x++) for (int y=0; y<27; y++) if (Z[x] && Z[y]){
			int a=2*((x/1%3)+(y/1%3))%3;
			int b=2*((x/3%3)+(y/3%3))%3;
			int c=2*((x/9%3)+(y/9%3))%3;
			Z[a+3*b+9*c]=1;
		}
	}
	// for (int i=0; i<27; i++) if (Z[i]) cerr<<i%3<<" "<<i/3%3<<" "<<i/9%3<<"\n";
	cin>>n;
	for (int i=0; i<3; i++){
		for (int j=1; j<=n; j++){
			cin>>ch;
			A[i][j]=to_int(ch);
		}
	}
	for (int z=0; z<27; z++) if (Z[z]){
		int a=(z/1%3), b=(z/3%3), c=(z/9%3);
		for (int i=1; i<=n; i++)
			B[t][i]=(A[0][i]*a + A[1][i]*b + A[2][i]*c)%3;
		t++;
	}
	assert(t==9);
	
	cin>>m;
	for (int i=1; i<=n; i++){
		cin>>ch;
		T0[i]=to_int(ch);
	}
	
	for (int i=0; i<TED; i++) solver[i].Start();
	cout<<(Solve()?"Yes":"No")<<"\n";
	while (m--){
		cin>>l>>r>>ch;
		r++;
		for (int i=0; i<TED; i++) solver[i].Set(1, 1, n+1, l, r, to_int(ch));
		cout<<(Solve()?"Yes":"No")<<"\n";
		// debug(solver.seg[1])
	}

	return 0;
}
/*
4
JOJO
JJOI
OJOO
3
IJOJ
1 4 O
2 2 J
2 4 I

3
JOI
JOI
JOI
2
OJI
1 2 O
1 1 J

*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...