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