Submission #835765

# Submission time Handle Problem Language Result Execution time Memory
835765 2023-08-23T19:23:38 Z APROHACK Digital Circuit (IOI22_circuit) C++17
Compilation error
0 ms 0 KB
#include "circuit.h"
#include <bits/stdc++.h>
#define ll long long
#define ff first
#define ss second
#define pb push_back
using namespace std;
int n, m;
vector<int>child[200001];
bool state[200001];
ll encen[200001][2]; // encendido y apagado
const ll MOD = 1000002022;
ll past[2002][2002];
void generate(int node);
int parent[200002];
bool casito = true;
ll aporte[200002];
ll prefix[200002];
ll T[200002];
ll ans = 0;

ll aporteTodos;
ll cuenta1 = 0;
#define isCase4 false 
void precalc(int node){
	T[node] = 1;
	if(node >= n)return ;
	for(int i = 0 ; i < child[node].size() ; i ++){
		precalc(child[node][i]);
		T[node]  = T[node] * T[child[node][i]] % MOD;
	}	
	T[node] = T[node] * (ll)child[node].size() % MOD;
}
void calcPrefix(int node, ll acum){
	if(node >= n){
		aporte[node] = acum;	
		//cout << "aporte de " << node << ": " << acum << endl;
		aporteTodos = acum;
		return ;
	}
	int hijo1 = child[node][0];
	int hijo2 = child[node][1];
	calcPrefix(hijo1, (acum * T[hijo2]) % MOD);
	calcPrefix(hijo2, (acum * T[hijo1]) % MOD);
}


//
void init(int N, int M, std::vector<int> P, std::vector<int> A) {
	n = N;
	m = M;
	if( m != n+1 )casito = false;
	for(int i = 0 ; i < n+m ; i ++){
		if(P[i] != -1){
			child[P[i]].pb(i);
			if(P[i] != (i-1)/2)casito = false;
		}
		parent[i] = P[i];
	}
	int temp = m;
	while(temp != 1){
		if(temp % 2 == 1)casito = false;
		temp /= 2;
	}
	//assert(casito);
	for(int i = N ; i <= N+M ; i ++){
		state[i] = A[i-N];
		if(state[i])cuenta1 ++ ;
	}
	memset(past, -1, sizeof past);
	generate(0);
	ans = encen[0][0];
	if(isCase4  or (  casito and (n > 1000 or m > 1000) ) ){
		precalc(0);
		calcPrefix(0, 1);
		prefix[0] = 0;
		for(int i = 1 ; i < N+M ; i ++){
			prefix[i] = (prefix[i-1] + aporte[i]) % MOD;	
		}
	}

	
}

ll mem[2002][2002];
ll currentIt = -1 ;
void newDp(){
	currentIt++;
}
ll dp(int parent, ll i, int k){
	if(k < 0)return 0;
	if(i == child[parent].size() and k > 0)return 0;
	else if(i == child[parent].size()) return 1;
	if(past[i][k] == currentIt)return mem[i][k];
	past[i][k] = currentIt;
	return mem[i][k] = ((dp(parent, i+1, k-1) * encen[child[parent][i]][0] % MOD) + ((dp(parent, i+1, k) * encen[child[parent][i]][1])%MOD))%MOD;
}

void generate(int node){
	if(node >= n){
		if(state[node]){
			encen[node][0] = 1;
			encen[node][1] = 0;
		}else{
			encen[node][0] = 0;
			encen[node][1] = 1;

		}
		return ;
	}
	for(int i = 0 ; i < child[node].size() ; i ++){
		generate(child[node][i]);
	}
	newDp();
	ll enc = 0, inv = 0;
	for(ll i = 1 ; i <= child[node].size() ; i ++){
		enc += dp(node, 0, i) * i % MOD;
		enc %= MOD;
	}
	ll allWays = 1;
	for(int i = 0 ; i < child[node].size() ; i ++){
		allWays *= (encen[child[node][i]][0] + encen[child[node][i]][1])%MOD;
		allWays %= MOD;
	}
	allWays *= (ll)child[node].size();
	allWays %= MOD;
	encen[node][0] = enc;
	encen[node][1] = ((allWays - enc) + MOD) % MOD;
	//cout << "for node " << node << " there are " << encen[node][0] << ", " << encen[node][1] << "\n";
}
	

int count_ways(int L, int R) {
	for(int i = L ; i <= R ; i ++){
		state[i] = !state[i];
	}
	if(isCase4  or ( L == R and casito and (n > 1000 or m > 1000) ) ){
		if(state[L])cuenta1 ++ ;
		else cuenta1 --;
		return (cuenta1 * aporteTodos)%mod;
	}
	else generate(0);
	return encen[0][0];
}


Compilation message

circuit.cpp: In function 'void precalc(int)':
circuit.cpp:28:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |  for(int i = 0 ; i < child[node].size() ; i ++){
      |                  ~~^~~~~~~~~~~~~~~~~~~~
circuit.cpp: In function 'long long int dp(int, long long int, int)':
circuit.cpp:92:7: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   92 |  if(i == child[parent].size() and k > 0)return 0;
      |     ~~^~~~~~~~~~~~~~~~~~~~~~~
circuit.cpp:93:12: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   93 |  else if(i == child[parent].size()) return 1;
      |          ~~^~~~~~~~~~~~~~~~~~~~~~~
circuit.cpp: In function 'void generate(int)':
circuit.cpp:111:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  111 |  for(int i = 0 ; i < child[node].size() ; i ++){
      |                  ~~^~~~~~~~~~~~~~~~~~~~
circuit.cpp:116:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  116 |  for(ll i = 1 ; i <= child[node].size() ; i ++){
      |                 ~~^~~~~~~~~~~~~~~~~~~~~
circuit.cpp:121:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  121 |  for(int i = 0 ; i < child[node].size() ; i ++){
      |                  ~~^~~~~~~~~~~~~~~~~~~~
circuit.cpp:115:14: warning: unused variable 'inv' [-Wunused-variable]
  115 |  ll enc = 0, inv = 0;
      |              ^~~
circuit.cpp: In function 'int count_ways(int, int)':
circuit.cpp:140:34: error: 'mod' was not declared in this scope; did you mean 'modf'?
  140 |   return (cuenta1 * aporteTodos)%mod;
      |                                  ^~~
      |                                  modf