답안 #992157

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
992157 2024-06-04T04:28:05 Z saddd ZIGZAG (INOI20_zigzag) C++17
42 / 100
672 ms 87892 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);
}
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 43608 KB Output is correct
2 Correct 12 ms 43608 KB Output is correct
3 Correct 13 ms 43604 KB Output is correct
4 Correct 12 ms 43356 KB Output is correct
5 Correct 13 ms 43352 KB Output is correct
6 Runtime error 37 ms 87892 KB Execution killed with signal 11
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 658 ms 54476 KB Output is correct
2 Correct 44 ms 45740 KB Output is correct
3 Correct 575 ms 62544 KB Output is correct
4 Correct 672 ms 62548 KB Output is correct
5 Correct 609 ms 62544 KB Output is correct
6 Correct 627 ms 62548 KB Output is correct
7 Correct 649 ms 59520 KB Output is correct
8 Correct 660 ms 62728 KB Output is correct
9 Correct 614 ms 62828 KB Output is correct
10 Correct 495 ms 62696 KB Output is correct
11 Correct 597 ms 62544 KB Output is correct
12 Correct 658 ms 62584 KB Output is correct
13 Correct 334 ms 61524 KB Output is correct
14 Correct 353 ms 61552 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 43608 KB Output is correct
2 Correct 12 ms 43608 KB Output is correct
3 Correct 13 ms 43604 KB Output is correct
4 Correct 12 ms 43356 KB Output is correct
5 Correct 13 ms 43352 KB Output is correct
6 Runtime error 37 ms 87892 KB Execution killed with signal 11
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 43608 KB Output is correct
2 Correct 12 ms 43608 KB Output is correct
3 Correct 13 ms 43604 KB Output is correct
4 Correct 12 ms 43356 KB Output is correct
5 Correct 13 ms 43352 KB Output is correct
6 Runtime error 37 ms 87892 KB Execution killed with signal 11
7 Halted 0 ms 0 KB -