Submission #992164

#TimeUsernameProblemLanguageResultExecution timeMemory
992164sadddZIGZAG (INOI20_zigzag)C++17
100 / 100
763 ms63072 KiB
#include<bits/stdc++.h> #include<fstream> using namespace std; //#pragma GCC optimize("O3") #define sz(a) (int)a.size() #define ALL(v) v.begin(), v.end() #define ALLR(v) v.rbegin(), v.rend() #define ll long long #define pb push_back #define forr(i, a, b) for(int i = a; i < b; i++) #define dorr(i, a, b) for(int i = a; i >= b; i--) #define ld long double #define vt vector #include<fstream> #define fi first #define se second #define pll pair<ll, ll> #define pii pair<int, int> #define mpp make_pair const ld PI = 3.14159265359, prec = 1e-9;; //using u128 = __uint128_t; //const int x[4] = {1, 0, -1, 0}; //const int y[4] = {0, -1, 0, 1}; ll mod = 998244353, pr = 69; const int mxn = 3e5 + 5, mxq = 1e5 + 5, sq = 1005, mxv = 5e4 + 1, lg = 60; //const int base = (1 <<18); const ll inf = 2e9 + 5, neg = -69420, inf2 = 1e14; mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); struct ST{ ll sm[4 * mxn + 1]; bool lz[4 * mxn + 1]; void applyy(int nd, int v){ if(v){ sm[nd] = -sm[nd]; lz[nd] ^= 1; } } void push(int nd){ applyy(nd << 1, lz[nd]); applyy(nd << 1 | 1, lz[nd]); lz[nd] = 0; } void upd(int nd, int l, int r, int id, ll v){ if(l == r){ sm[nd] = v; return; } int mid = (l + r) >> 1; push(nd); if(id <= mid)upd(nd << 1, l, mid, id, v); else upd(nd << 1 | 1, mid + 1, r, id, v); sm[nd] = sm[nd << 1] + sm[nd << 1 | 1]; } void upd2(int nd, int l, int r, int ql, int qr){ if(ql > r || qr < l){ return; } if(ql <= l && qr >= r){ applyy(nd, 1); return; } int mid = (l + r) >> 1; push(nd); upd2(nd << 1, l, mid, ql, qr); upd2(nd << 1 | 1, mid + 1, r, ql, qr); sm[nd] = sm[nd << 1] + sm[nd << 1 | 1]; } ll get(int nd, int l, int r, int ql, int qr){ if(ql > r || qr < l)return(0); if(ql <= l && qr >= r)return(sm[nd]); int mid = (l + r) >> 1; push(nd); return(get(nd << 1, l, mid, ql, qr) + get(nd << 1 | 1, mid + 1, r, ql, qr)); } }; ST cool; int n, q; ll a[mxn + 1], d[mxn + 1]; int sign(ll x){ if(x < 0)return(0); if(x > 0)return(1); return(2); } int rev(ll x){ if(x == 0)return(1); if(x == 1)return(0); return(2); } struct Node{ ll cnt = 0, pref = 0, suf = 0; int vall, valr; }; Node st[4 * mxn + 1]; ll sm[4 * mxn + 1]; bool lz[4 * mxn + 1]; void applyy(int nd, int v){ if(v){ st[nd].vall = rev(st[nd].vall); st[nd].valr = rev(st[nd].valr); lz[nd] ^= 1; } } void push(int nd){ applyy(nd << 1, lz[nd]); applyy(nd << 1 | 1, lz[nd]); lz[nd] = 0; } Node comb(Node a, Node b, int l, int mid, int r){ Node res; res.cnt = a.cnt + b.cnt; res.pref = a.pref; res.suf = b.suf; if(a.valr == rev(b.vall) && a.valr != 2){ res.cnt += a.suf * b.pref; if(a.pref == mid - l + 1)res.pref += b.pref; if(b.suf == r - mid)res.suf += a.suf; } res.vall = a.vall; res.valr = b.valr; return(res); } void upd2(int nd, int l, int r, int ql, int qr){ if(l > r)return; if(ql > r || qr < l){ return; } if(ql <= l && qr >= r){ applyy(nd, 1); return; } int mid = (l + r) >> 1; push(nd); upd2(nd << 1, l, mid, ql, qr); upd2(nd << 1 | 1, mid + 1, r, ql, qr); st[nd] = comb(st[nd << 1], st[nd << 1 | 1], l, mid, r); } void upd(int nd, int l, int r, int id){ if(l > r)return; if(l == r){ if(d[l] == 0){ st[nd].cnt = st[nd].pref = st[nd].suf = 0; }else{ st[nd].cnt = st[nd].pref = st[nd].suf = 1; } st[nd].vall = st[nd].valr = sign(d[l]); return; } int mid = (l + r) >> 1; push(nd); if(id <= mid)upd(nd << 1, l, mid, id); else upd(nd << 1 | 1, mid + 1, r, id); st[nd] = comb(st[nd << 1], st[nd << 1 | 1], l, mid, r); } Node get(int nd, int l, int r, int ql, int qr){ assert(l <= r); if(ql <= l && qr >= r)return(st[nd]); int mid = (l + r) >> 1; push(nd); if(qr <= mid)return(get(nd << 1, l, mid, ql, qr)); else if(ql > mid)return(get(nd << 1 | 1, mid + 1, r, ql, qr)); else return(comb(get(nd << 1, l, mid, ql, qr), get(nd << 1 | 1, mid + 1, r, ql, qr), max(l, ql), mid, min(r, qr))); } ll getv(int x){ return(cool.get(1, 0, n - 1, 0, x - 1)); } void solve(){ cin >> n >> q; for(int i = 1; i <= n; i++)cin >> a[i]; for(int i = 0; i < n; i++){ d[i] = a[i + 1] - a[i]; upd(1, 1, n - 1, i); cool.upd(1, 0, n - 1, i, d[i]); } while(q--){ char idq; cin >> idq; if(idq == '*'){ int l, r; cin >> l >> r; d[l - 1] = getv(l) * -1 - getv(l - 1); if(r + 1 <= n){ d[r] = getv(r + 1) - getv(r) * -1; } if(r + 1 <= n){ cool.upd(1, 0, n - 1, r, d[r]); upd(1, 1, n - 1, r); } cool.upd(1, 0, n - 1, l - 1, d[l - 1]); if(l - 1 >= 1)upd(1, 1, n - 1, l - 1); if(l <= r){ upd2(1, 1, n - 1, l, r - 1); cool.upd2(1, 0, n - 1, l, r - 1); } }else if(idq == '+'){ int l, r; ll v; cin >> l >> r >> v; d[l - 1] = (getv(l) + v) - getv(l - 1); if(r + 1 <= n){ d[r] = getv(r + 1) - (getv(r) + v); } if(r + 1 <= n){ cool.upd(1, 0, n - 1, r, d[r]); upd(1, 1, n - 1, r); } cool.upd(1, 0, n - 1, l - 1, d[l - 1]); if(l - 1 >= 1)upd(1, 1, n - 1, l - 1); }else{ int l, r; cin >> l >> r; if(l == r){ cout << 1 << "\n"; continue; } cout << get(1, 1, n - 1, l, r - 1).cnt + r - l + 1 << "\n"; } //for(int i = 1; i <= n; i++)cout << getv(i) << " "; //cout << "\n"; } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); //freopen("TESTROOMS.inp", "r", stdin); //freopen("TESTROOMS.out", "w", stdout); int tt; tt = 1; while(tt--){ solve(); } 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...