답안 #705535

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
705535 2023-03-04T15:27:20 Z danikoynov 디지털 회로 (IOI22_circuit) C++17
7 / 100
3000 ms 8244 KB
#include "circuit.h"

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const ll mod = 1000002022;
const int maxn = 2e5 + 10;

int n, m, p[maxn], a[maxn];
vector < int > children[maxn];
ll dp[maxn][2], temp[maxn];

void update_state(int v)
{
    dp[v][0] = dp[v][1] = 0;

    if (v >= n)
    {
        dp[v][1] = a[v - n];
        dp[v][0] = 1 - dp[v][1];
        return;
    }

    int c = children[v].size();
    for (int i = 0; i <= c; i ++)
        temp[i] = 0;

    temp[0] = 1;
    for (int u : children[v])
    {
        for (int i = c; i >= 0; i --)
        {
            temp[i] = (temp[i] * dp[u][0]) % mod;
            if (i > 0)
                temp[i] = (temp[i] + temp[i - 1] * dp[u][1]) % mod;
        }
    }


    for (int i = 0; i <= c; i ++)
    {
        dp[v][0] = (dp[v][0] + temp[i] * (ll)(c - i)) % mod;
        dp[v][1] = (dp[v][1] + temp[i] * (ll)(i)) % mod;
    }
    ///cout << v << " " << dp[v][0] << " " << dp[v][1] << endl;

}
void solve_state(int v)
{


    for (int u : children[v])
    {
        solve_state(u);
    }

    update_state(v);



}

ll pw[maxn], pref[maxn];
ll con[maxn];
int act = 0, logM = 0;
int tree[4 * maxn], lazy[4 * maxn];

void build_tree(int root, int left, int right)
{
    if (left == right)
    {
        tree[root] = (con[left] * a[left]) % mod;
        return;
    }

    int mid = (left + right) / 2;
    build_tree(root * 2, left, mid);
    build_tree(root * 2 + 1, mid + 1, right);

    tree[root] = (tree[root * 2] + tree[root * 2 + 1]) % mod;
}

ll get_sum(int left, int right)
{
    ll sum = pref[right];
    if (left != 0)
        sum = sum - pref[left - 1];
    if (sum < 0)
        sum += mod;
    return sum;
}

void push_lazy(int root, int left, int right)
{
    if (lazy[root] == 0)
        return;

    tree[root] = (get_sum(left, right) - tree[root] + mod) % mod;
    if (left != right)
    {
        lazy[root * 2] = (lazy[root * 2] + 1) % 2;
        lazy[root * 2 + 1] = (lazy[root * 2 + 1] + 1) % 2;
    }
    lazy[root] = 0;
}

void update_range(int root, int left, int right, int qleft, int qright)
{

    push_lazy(root, left, right);
    if (left > qright || right < qleft)
        return;

    if (left >= qleft && right <= qright)
    {
        lazy[root] = 1;
        push_lazy(root, left, right);
        ///cout << left << " :: " << right << " :: " << tree[root] << endl;
        return;
    }

    int mid = (left + right) / 2;
    update_range(root * 2, left, mid, qleft, qright);
    update_range(root * 2 + 1, mid + 1, right, qleft,  qright);
    ///cout << root << " " << left << " " << right << " " << qleft << " " << qright << endl;
    tree[root] = (tree[root * 2] + tree[root * 2 + 1]) % mod;
    ///cout << tree[root] << endl;
}



void init(int N, int M, std::vector<int> P, std::vector<int> A)
{
    n = N;
    m = M;
    for (int i = 0; i < N + M; i ++)
        p[i] = P[i];


    for (int i = 1; i < N + M; i ++)
    {
        children[p[i]].push_back(i);
    }
    for (int i = 0; i < M; i ++)
    {
        a[i] = 1;
        int v = i + n;
        while(v != -1)
        {
            update_state(v);
            v = p[v];
        }
        solve_state(0);
        con[i] = dp[0][1];
        a[i] = 0;
                 v = i + n;
        while(v != -1)
        {
            update_state(v);
            v = p[v];
        }
    }
    pref[0] = con[0];
    for (int i = 1; i < M; i ++)
        pref[i] = (pref[i - 1] + con[i]) % mod;
    for (int i = 0; i < M; i ++)
        a[i] = A[i];


    build_tree(1, 0, m - 1);
}


int count_ways(int L, int R)
{
    update_range(1, 0, m - 1, L - n, R - n);
    ///for (int i = L - n; i <= R - n; i ++)
       /// a[i] = ((a[i] + 1) & 1);

    /**ll ans = 0;
    for (int i = 0; i < m; i ++)
    {

        ans = (ans + (con[i] * a[i])) % mod;
    }*/


    /**cout << "-----------" << endl;
    for (int i = 0; i < n + m; i ++)
        cout << i << " : " << dp[i][0] << " " << dp[i][1] << endl;*/

    return tree[1];
}
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4944 KB Output is correct
2 Correct 4 ms 4944 KB Output is correct
3 Execution timed out 3075 ms 5076 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4944 KB Output is correct
2 Correct 8 ms 5056 KB Output is correct
3 Correct 19 ms 5088 KB Output is correct
4 Correct 19 ms 5084 KB Output is correct
5 Correct 19 ms 5072 KB Output is correct
6 Correct 46 ms 5100 KB Output is correct
7 Correct 79 ms 5112 KB Output is correct
8 Correct 78 ms 5120 KB Output is correct
9 Correct 79 ms 5136 KB Output is correct
10 Correct 111 ms 5152 KB Output is correct
11 Correct 122 ms 5148 KB Output is correct
12 Correct 46 ms 5116 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4944 KB Output is correct
2 Correct 4 ms 4944 KB Output is correct
3 Execution timed out 3075 ms 5076 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3036 ms 8244 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3036 ms 8244 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4944 KB Output is correct
2 Correct 8 ms 5056 KB Output is correct
3 Correct 19 ms 5088 KB Output is correct
4 Correct 19 ms 5084 KB Output is correct
5 Correct 19 ms 5072 KB Output is correct
6 Correct 46 ms 5100 KB Output is correct
7 Correct 79 ms 5112 KB Output is correct
8 Correct 78 ms 5120 KB Output is correct
9 Correct 79 ms 5136 KB Output is correct
10 Correct 111 ms 5152 KB Output is correct
11 Correct 122 ms 5148 KB Output is correct
12 Correct 46 ms 5116 KB Output is correct
13 Execution timed out 3036 ms 8244 KB Time limit exceeded
14 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4944 KB Output is correct
2 Correct 4 ms 4944 KB Output is correct
3 Execution timed out 3075 ms 5076 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4944 KB Output is correct
2 Correct 4 ms 4944 KB Output is correct
3 Execution timed out 3075 ms 5076 KB Time limit exceeded
4 Halted 0 ms 0 KB -