Submission #992167

# Submission time Handle Problem Language Result Execution time Memory
992167 2024-06-04T04:42:06 Z saddd ZIGZAG (INOI20_zigzag) C++17
42 / 100
857 ms 76884 KB
#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(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){
        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){
    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 time Memory Grader output
1 Correct 22 ms 38236 KB Output is correct
2 Correct 23 ms 38236 KB Output is correct
3 Correct 28 ms 38556 KB Output is correct
4 Correct 22 ms 38236 KB Output is correct
5 Correct 22 ms 38236 KB Output is correct
6 Runtime error 45 ms 76884 KB Execution killed with signal 11
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 857 ms 56660 KB Output is correct
2 Correct 46 ms 44884 KB Output is correct
3 Correct 586 ms 58864 KB Output is correct
4 Correct 677 ms 58960 KB Output is correct
5 Correct 589 ms 58712 KB Output is correct
6 Correct 630 ms 58960 KB Output is correct
7 Correct 628 ms 57224 KB Output is correct
8 Correct 666 ms 58896 KB Output is correct
9 Correct 617 ms 58708 KB Output is correct
10 Correct 494 ms 58996 KB Output is correct
11 Correct 595 ms 58936 KB Output is correct
12 Correct 707 ms 58908 KB Output is correct
13 Correct 296 ms 58564 KB Output is correct
14 Correct 285 ms 58416 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 22 ms 38236 KB Output is correct
2 Correct 23 ms 38236 KB Output is correct
3 Correct 28 ms 38556 KB Output is correct
4 Correct 22 ms 38236 KB Output is correct
5 Correct 22 ms 38236 KB Output is correct
6 Runtime error 45 ms 76884 KB Execution killed with signal 11
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 22 ms 38236 KB Output is correct
2 Correct 23 ms 38236 KB Output is correct
3 Correct 28 ms 38556 KB Output is correct
4 Correct 22 ms 38236 KB Output is correct
5 Correct 22 ms 38236 KB Output is correct
6 Runtime error 45 ms 76884 KB Execution killed with signal 11
7 Halted 0 ms 0 KB -