제출 #1154127

#제출 시각아이디문제언어결과실행 시간메모리
1154127zhasyn디지털 회로 (IOI22_circuit)C++20
18 / 100
3047 ms7044 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;
void init(int nx, int mx, vector<int> p, vector<int> a) {
	n = nx;
	m = mx;
	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];
	}
}
ll dp[N], nw[N];
pll dfs(int v){
	vector <pll> vec;
	for(auto u : q[v]){
		if(u < n) vec.pb(dfs(u));
		else{
			if(in[u]) vec.pb({1, 0});
			else vec.pb({0, 1});
		}
	}
	//cout << v << " Start\n";
	int local = (int)vec.size();
	for(int i = 0; i <= local; i++){
		dp[i] = 0;
		//cout << vec[i].F << " "<< vec[i].S << " given\n";
	}
	dp[0] = 1;
	for(int i = 0; i < local; i++){
		for(int j = 0; j <= local; j++){
			nw[j] = um(dp[j], vec[i].S);
			if(j > 0) nw[j] += um(dp[j - 1], vec[i].F);
		}
		for(int j = 0; j <= local; j++){
			dp[j] = nw[j];
			nw[j] = 0;
			//cout << dp[j] << " ";
		}
		//cout << endl;
	}
	ll s1 = 0, s2 = 0, sm = 0;
	for(int i = local; i >= 1; i--){
		sm += dp[i];
		sm %= mod;
		s1 += sm;
		s1 %= mod;
	}
	sm = 0;
	for(int i = 0; i < local; i++){
		sm += dp[i];
		sm %= mod;
		s2 += sm;
		s2 %= mod;
	}
	//cout << s1 << " "<< s2 << " RES" << endl;
	return {s1, s2};
}
int count_ways(int l, int r) {
  for(int i = l; i <= r; i++){
  	in[i] = 1 - in[i];
  }
  // for(int i = n; i < n + m; i++){
  	// cout << in[i] << " ";
  // }
  // cout << endl;
  pll rs = dfs(0);
  return (int)rs.F;
}

// int main(){
//   	ios::sync_with_stdio(false);
//   	cin.tie(NULL);
//   	int nx, mx;
//   	cin >> nx >> mx;
//   	vector <int> p, a;
//   	for(int i = 0, x; i < nx + mx; i++){
//   		cin >> x;
//   		p.pb(x);
//   	}
//   	for(int i = n, x; i < nx + mx; i++){
//   		cin >> x;
//   		a.pb(x);
//   	}
//   	init(nx, mx, p, a);
//   	cout << count_ways(3, 4) << endl;
//   	cout << count_ways(4, 5) << endl;
//   	cout << count_ways(3, 6) << endl;
//   return 0;
// }
 
#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...