Submission #1187572

#TimeUsernameProblemLanguageResultExecution timeMemory
1187572ByeWorldDigital Circuit (IOI22_circuit)C++20
0 / 100
213 ms28440 KiB
#include "circuit.h"
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define fi first
#define se second
#define lf ((id<<1))
#define rg ((id<<1)|1)
#define md ((l+r)>>1)
using namespace std;
const int MAXN = 3e5+10;
const ll MOD = 1e9+2022;
ll sum(ll a, ll b){ return (a+b)%MOD;}
void chsum(ll &a, ll b){ a = (a+b)%MOD;}
ll mul(ll a, ll b){ return (a*b)%MOD; }
void chmul(ll &a, ll b){ a = (a*b)%MOD;}
void chmn(auto &a, auto b){ a = min(a, b); }
void chmx(auto &a, auto b){ a = max(a, b); }

int n, m, par[MAXN], a[MAXN];
ll dp[MAXN][3];
vector<int> adj[MAXN];
int tot;

struct node {
	ll zer = 0, one = 0;
} NOL;
struct seg {
	node st[4*MAXN]; int laz[4*MAXN];
	node mrg(node a, node b){
		node ret;
		ret.one = sum(sum( mul(a.one,b.zer), mul(a.zer, b.one)), 
				mul(2, mul(a.one, b.one ) ) ); // nyala
		
		ret.zer = sum(sum( mul(a.one,b.zer), mul(a.zer, b.one)), 
				mul(2, mul(a.zer, b.zer ) ) ); // mati
		return ret;
	}
	void push(int id, int v){
		swap(st[id].one, st[id].zer);
		laz[id] ^= v;
	}
	void bnc(int id){
		if(laz[id]==0) return;
		push(lf,laz[id]); push(rg,laz[id]);
		laz[id] = 0;
	}
	void bd(int id, int l, int r){
		if(l==r){
			if(a[l+n] == 1) st[id].one = 1;
			else st[id].zer = 1;
			return;
		}
		bd(lf,l,md); bd(rg,md+1,r);
		st[id] = mrg(st[lf], st[rg]);
	}
	node upd(int id, int l, int r, int x, int y){
		if(x<=l && r<=y){
			push(id, 1);
			return st[id];
		}
		if(r<x || y<l) return st[id];
		bnc(id);
		return st[id] = mrg(upd(lf,l,md,x,y), upd(rg,md+1,r,x,y));
	}
} A;

void init(int N, int M, std::vector<int> P, std::vector<int> AA) {
	n = N; m = M;
	for(int i=1; i<=n+m; i++){
		par[i] = P[i-1]+1;
		adj[par[i]].pb(i);
	}
	for(int i=1; i<=m; i++){
		a[i+n] = AA[i-1];
	}
	tot = n+m;
	A.bd(1,1,tot);
}

int count_ways(int L, int R) {
	int l = L+1, r = R+1;
	A.upd(1,1,tot, l-n, r-n);
	
	// for(int i=1; i<=3; i++){
	// 	cout << dp[i][0] << ' ' << dp[i][1] << " xx\n";
	// }
	return (int)A.st[1].one;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...