Submission #1135036

#TimeUsernameProblemLanguageResultExecution timeMemory
1135036Lemser디지털 회로 (IOI22_circuit)C++20
16 / 100
328 ms15404 KiB
#include "circuit.h"
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using ull = unsigned long long;
using lld = long double;
using ii = pair<int,int>;
using pll = pair<ll, ll>;

using vi = vector<int>;
using vll = vector<ll>;
using vii = vector<ii>;
using vpll = vector<pll>;
using vlld = vector<lld>;

// #define endl '\n'
#define all(x) x.begin(),x.end()
#define lsb(x) x&(-x)
#define gcd(a,b) __gcd(a,b)
#define sz(x) (int)x.size()
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define fls cout.flush()

#define fore(i,l,r) for(auto i=l;i<r;i++)
#define fo(i,n) fore(i,0,n)
#define forex(i,r,l) for(auto i=r; i>=l;i--)
#define ffo(i,n) forex(i,n-1,0)

bool cmin(ll &a, ll b) { if(b<a){a=b;return 1;}return 0; }
bool cmax(ll &a, ll b) { if(b>a){a=b;return 1;}return 0; }
void valid(ll in) { cout<<((in)?"Yes\n":"No\n"); }
ll lcm(ll a, ll b) { return (a/gcd(a,b))*b; }
ll gauss(ll n) { return (n*(n+1))/2; }

const int mod = 1e9 + 2022;
struct SegTree {

  struct Node {
    ll a, b;

    Node ( ) {  }
    Node (ll a, ll b): a(a), b(b) {  }

    Node operator+ (const Node &o) {
      Node r(0, 0);
      // r.a = 1, dp[1], tener un 1 aqui
      // parametro 1
      (r.b += b*o.b) %= mod;
      (r.a += (a + b) * (o.a + o.b)) %= mod;
      (r.a -= (b*o.b)%mod - mod) %= mod;
      // parametro 2
      (r.a += a*o.a) %= mod;
      (r.b += (a + b) * (o.a + o.b)) %= mod;
      (r.b -= (a*o.a)%mod - mod) %= mod;
      return r;
    }
  };

  Node IDEM = {0, 0};
  vector<Node> st;
  vll lz;
  ll n;

  SegTree ( ) {  }
  SegTree (ll n): st(4*n+4, IDEM), lz(4*n+4, 0), n(n) {  }

  void prop (ll id, ll l, ll r) {
    if (lz[id] == 0) return;
    swap(st[id].a, st[id].b);
    if (l < r) {
      lz[id*2+1] ^= 1;
      lz[id*2+2] ^= 1;
    }
    lz[id] = 0;
  }

  void update (ll l, ll r) { update(0, 0, n - 1, l, r); }
  void update (ll id, ll l, ll r, ll i, ll j) {
    prop(id, l, r);
    if (r < i || j < l) return;
    if (i <= l && r <= j) {
      lz[id] ^= 1;
      prop(id, l, r);
      return;
    }
    ll m = (l+r)/2;
    update(id*2+1, l, m, i, j);
    update(id*2+2, m+1, r, i, j);
    st[id] = st[id*2+1] + st[id*2+2];
  }
  
  void build (ll id, ll l, ll r, vll &a) {
    if (l == r) {
      if (a[l] == 0) {
        st[id].b = 1;
        st[id].a = 0;
      } else {
        st[id].b = 0;
        st[id].a = 1;
      }
      return;
    }
    ll m = (l+r)/2;
    build(id*2+1, l, m, a);
    build(id*2+2, m+1, r, a);
    st[id] = st[id*2+1] + st[id*2+2];
  }
};

const int N = 2e5 + 7;
vector<vll> graph;
ll p[N], a[N], n, m, dp[N][2];
SegTree st;

/*
dp[u][0] = #acomodos de parametros de los del subarbol de u para que u
sea 0
dp[u][1] = lo mismo para que u sea 1
*/

void init(int N, int M, std::vector<int> P, std::vector<int> A) {
  n = N;
  m = M; 
  graph = vector<vll>(N+M);
  fore (i, 1, N+M) graph[P[i]].pb(i);
  fo (i, N+M) p[i] = P[i];
  fore (i, N, N+M) a[i] = A[i-N];
  st = SegTree(M);
  vll dx;
  fore (i, n, n+m) dx.pb(a[i]);
  st.build(0, 0, m-1, dx);
}

int count_ways(int l, int r) {
  l -= n, r -= n;
  st.update(l, r);
  return st.st[0].a;
}
#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...