제출 #1154144

#제출 시각아이디문제언어결과실행 시간메모리
1154144zhasyn디지털 회로 (IOI22_circuit)C++20
0 / 100
182 ms8064 KiB
#include "circuit.h"
#include <bits/stdc++.h>
#define pb push_back
#define pf push_front
using namespace std;
#define F first
#define S second
typedef long long ll;
#define pii pair <int, int>
#define pll pair <ll, ll>
typedef long double ld;
const ll N = 2 * 1e5 + 100, M = 4096 + 10, len = 21, inf = 1e18;
const ll mod = 1000002022;
ll um(ll a, ll b){
	return (1LL * a * b) % mod;
}
ll subr(ll a, ll b){
	return ((1LL * a - b) % mod + mod) % mod;
}
vector <int> q[N];
int in[N], n, m, sz;
struct seg{
	vector <pll> tree;
	vector <bool> have;
	void init(){
		sz = 1;
		while(sz < n) sz *= 2;
		tree.assign(2 * sz - 1, {0LL, 0LL});
		have.assign(2 * sz - 1, false);
	}
	pll gt(pll a, pll b){
		if(a.F == 0 && a.S == 0) return b;
		if(b.F == 0 && b.S == 0) return a;
		pll k;
		k.F = a.F * b.F * 2 + a.F * b.S + a.S * b.F;
		k.S = a.S * b.S * 2 + a.F * b.S + a.S * b.F;
		return k;
	}
	void upd(ll i, pll v, ll x = 0, ll lx = 0, ll rx = sz){
		while(rx - lx == 1){
			tree[x] = v;
			return;
		}
		ll mid = (rx + lx) / 2;
		if(i < mid) upd(i, v, 2 * x + 1, lx, mid);
		else upd(i, v, 2 * x + 2, mid, rx);
		tree[x] = gt(tree[2 * x + 1], tree[2 * x + 2]);
	}
	void push(ll x, ll lx, ll rx){
		if(rx - lx == 1) return;
		have[2 * x + 1] = (have[2 * x + 1] ^ have[x]);
		have[2 * x + 2] = (have[2 * x + 2] ^ have[x]);
		have[x] = 0;
	}
	pll get(ll l, ll r, ll x = 0, ll lx = 0, ll rx = sz){
		if(l >= rx || lx >= r) return {0LL, 0LL};
		if(l <= lx && rx <= r){
			have[x] = (have[x] ^ 1);
			if(have[x]) return {tree[x].S, tree[x].F};
			return tree[x];
		}
		push(x, lx, rx);
		ll mid = (lx + rx) / 2;
		pll s1 = get(l, r, 2 * x + 1, lx, mid);
		pll s2 = get(l, r, 2 * x + 2, mid, rx);
		return gt(s1, s2);
	}
} obj;
void init(int nx, int mx, vector<int> p, vector<int> a) {
	n = nx;
	m = mx;
	obj.init();
	for(int i = 1; i < n + m; i++){
		q[p[i]].pb(i);
	}
	for(int i = n; i < n + m; i++){
		in[i] = a[i - n];
		if(in[i]) obj.upd(i - n, {1, 0});
		else obj.upd(i - n, {0, 1});
	}
	
}
int count_ways(int l, int r) {
  pll rs = obj.get(l, r);
  return (int)rs.F;
}

 
#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...