답안 #790160

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
790160 2023-07-22T11:25:00 Z GrindMachine 가로등 (APIO19_street_lamps) C++17
100 / 100
1464 ms 64136 KB
// Om Namah Shivaya

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

template<typename T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
typedef long long int ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL)
#define pb push_back
#define endl '\n'
#define sz(a) a.size()
#define setbits(x) __builtin_popcountll(x)
#define ff first
#define ss second
#define conts continue
#define ceil2(x, y) ((x + y - 1) / (y))
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define yes cout << "Yes" << endl
#define no cout << "No" << endl

#define rep(i, n) for(int i = 0; i < n; ++i)
#define rep1(i, n) for(int i = 1; i <= n; ++i)
#define rev(i, s, e) for(int i = s; i >= e; --i)
#define trav(i, a) for(auto &i : a)

template<typename T>
void amin(T &a, T b) {
    a = min(a, b);
}

template<typename T>
void amax(T &a, T b) {
    a = max(a, b);
}

#ifdef LOCAL
#include "debug.h"
#else
#define debug(x) 42
#endif

/*



*/

const int MOD = 1e9 + 7;
const int N = 3e5 + 5;
const int inf1 = int(1e9) + 5;
const ll inf2 = ll(1e18) + 5;

struct compressed_fenwick {
    vector<int> vals,tr;
    int siz = 0;
    bool prepared = false;

    int lsb(int x){
        return x & -x;
    }

    void prepare(){
        prepared = true;
        sort(all(vals));
        vals.resize(unique(all(vals))-vals.begin());
        siz = sz(vals);
        tr = vector<int>(siz+1);
    }

    void pupd(int i, int v){
        if(!prepared){
            vals.pb(i);
            return;
        }

        i = lower_bound(all(vals),i) - vals.begin();
        i++;

        for(; i <= siz; i += lsb(i)){
            tr[i] += v;
        }        
    }

    int get(int i){
        int res = 0;
        for(; i; i -= lsb(i)){
            res += tr[i];
        }
        return res;
    }

    int suff_sum(int i){
        // suff_sum = tot-pref_sum
        i = lower_bound(all(vals),i)-vals.begin()-1+1;
        return get(siz) - get(i);        
    }
};

template<typename T>
struct fenwick {
    int siz;
    vector<compressed_fenwick> tree;
    bool prepared = false;

    fenwick(int n) {
        siz = n;
        tree = vector<compressed_fenwick>(n + 1);
    }

    int lsb(int x) {
        return x & -x;
    }

    void prepare(){
        prepared = true;
        rep(i,siz+1){
            tree[i].prepare();
        }
    }

    void pupd(int i, int pos, T v) {
        while (i <= siz) {
            tree[i].pupd(pos,v);
            i += lsb(i);
        }
    }

    T sum(int i, int pos) {
        T res = 0;

        while (i) {
            res += tree[i].suff_sum(pos);
            i -= lsb(i);
        }

        return res;
    }

    T query(int l, int r, int pos) {
        if (l > r) return 0;
        T res = sum(r,pos) - sum(l-1,pos);
        return res;
    }
};

void solve(int test_case)
{
    int n,q; cin >> n >> q;
    vector<int> a(n+5);
    rep1(i,n){
        char ch; cin >> ch;
        a[i] = ch-'0';
    }

    set<array<int,3>> active;
    vector<array<int,3>> segs;
    fenwick<int> fenw(n+5);

    auto init_active = [&](){
        int l = -1;
        rep1(i,n){
            if(!a[i]){
                if(l != -1){
                    active.insert({l,i-1,0});
                }

                l = -1;
            }
            else{
                if(l == -1){
                    l = i;
                }
            }
        }

        if(l != -1){
            active.insert({l,n,0});
        }
    };

    auto get_seg = [&](int i){
        auto it = active.upper_bound({i+1,-1,-1});
        if(it == active.begin()) return active.end();
        else{
            it--;
            auto [l,r,t] = *it;
            if(l <= i and r >= i){
                return it;
            }
            else{
                return active.end();
            }
        }
    };

    auto insert_seg = [&](set<array<int,3>>::iterator it, int id){
        auto [l,r,t] = *it;
        segs.pb({l,r,id-t});
        fenw.pupd(l,r,id-t);
    };

    init_active();

    vector<array<int,3>> queries(q+5);
    auto oa = a;

    rep1(id,q){
        string t; cin >> t;
        if(t == "toggle"){
            int i; cin >> i;
            queries[id] = {1,i,-1};

            a[i] ^= 1;

            if(!a[i]){
                // unset
                auto it = get_seg(i);
                assert(it != active.end());
                auto [l,r,t] = *it;
                insert_seg(it,id);
                active.erase(it);

                if(l <= i-1){
                    active.insert({l,i-1,id});
                }
                if(i+1 <= r){
                    active.insert({i+1,r,id});
                }
            }
            else{
                // set
                auto it1 = get_seg(i-1);
                auto it2 = get_seg(i+1);
                
                int l = -1, r = -1;

                if(it1 != active.end()){
                    auto curr = *it1;
                    l = curr[0];                    
                    insert_seg(it1,id);
                    active.erase(it1);
                }

                if(it2 != active.end()){
                    auto curr = *it2;
                    r = curr[1];
                    insert_seg(it2,id);
                    active.erase(it2);
                }

                if(l != -1 and r != -1){
                    active.insert({l,r,id});
                }
                else if(l != -1){
                    active.insert({l,i,id});
                }
                else if(r != -1){
                    active.insert({i,r,id});
                }
                else{
                    active.insert({i,i,id});
                }
            }
        }
        else{
            int l,r; cin >> l >> r;
            r--;
            queries[id] = {2,l,r};
        }
    }

    a = oa;
    active.clear();
    segs.clear();
    init_active();

    fenw.prepare();

    rep1(id,q){
        if(queries[id][0] == 1){
            int i = queries[id][1];
            a[i] ^= 1;

            if(!a[i]){
                // unset
                auto it = get_seg(i);
                assert(it != active.end());
                auto [l,r,t] = *it;
                insert_seg(it,id);
                active.erase(it);

                if(l <= i-1){
                    active.insert({l,i-1,id});
                }
                if(i+1 <= r){
                    active.insert({i+1,r,id});
                }
            }
            else{
                // set
                auto it1 = get_seg(i-1);
                auto it2 = get_seg(i+1);
                
                int l = -1, r = -1;

                if(it1 != active.end()){
                    auto curr = *it1;
                    l = curr[0];                    
                    insert_seg(it1,id);
                    active.erase(it1);
                }

                if(it2 != active.end()){
                    auto curr = *it2;
                    r = curr[1];
                    insert_seg(it2,id);
                    active.erase(it2);
                }

                if(l != -1 and r != -1){
                    active.insert({l,r,id});
                }
                else if(l != -1){
                    active.insert({l,i,id});
                }
                else if(r != -1){
                    active.insert({i,r,id});
                }
                else{
                    active.insert({i,i,id});
                }
            }
        }
        else{
            int l = queries[id][1], r = queries[id][2];
            
            auto it = get_seg(l);
            int ans = 0;

            {
                auto [lx,rx,t] = *it;
                if(lx <= l and rx >= r){
                    ans += id-t;
                }
            }

            ans += fenw.query(1,l,r);

            /*

            for(auto [lx,rx,wx] : segs){
                if(lx <= l and rx >= r){
                    ans += wx;
                }
            }
    
            */

            cout << ans << endl;
        }
    }
}

int main()
{
    fastio;

    int t = 1;
    // cin >> t;

    rep1(i, t) {
        solve(i);
    }

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 0 ms 296 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 167 ms 9596 KB Output is correct
2 Correct 228 ms 9892 KB Output is correct
3 Correct 327 ms 11924 KB Output is correct
4 Correct 966 ms 52764 KB Output is correct
5 Correct 1074 ms 56232 KB Output is correct
6 Correct 1039 ms 55972 KB Output is correct
7 Correct 141 ms 32600 KB Output is correct
8 Correct 185 ms 33956 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 468 KB Output is correct
2 Correct 2 ms 468 KB Output is correct
3 Correct 1 ms 468 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1464 ms 64136 KB Output is correct
6 Correct 1286 ms 60892 KB Output is correct
7 Correct 929 ms 55676 KB Output is correct
8 Correct 134 ms 33996 KB Output is correct
9 Correct 63 ms 3960 KB Output is correct
10 Correct 72 ms 4224 KB Output is correct
11 Correct 74 ms 4328 KB Output is correct
12 Correct 122 ms 32588 KB Output is correct
13 Correct 181 ms 33996 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 468 KB Output is correct
3 Correct 1 ms 468 KB Output is correct
4 Correct 2 ms 468 KB Output is correct
5 Correct 287 ms 37772 KB Output is correct
6 Correct 658 ms 47592 KB Output is correct
7 Correct 947 ms 55584 KB Output is correct
8 Correct 1407 ms 63028 KB Output is correct
9 Correct 239 ms 12884 KB Output is correct
10 Correct 221 ms 15296 KB Output is correct
11 Correct 247 ms 12920 KB Output is correct
12 Correct 230 ms 15324 KB Output is correct
13 Correct 238 ms 12952 KB Output is correct
14 Correct 224 ms 15600 KB Output is correct
15 Correct 125 ms 32620 KB Output is correct
16 Correct 128 ms 33888 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 0 ms 296 KB Output is correct
8 Correct 167 ms 9596 KB Output is correct
9 Correct 228 ms 9892 KB Output is correct
10 Correct 327 ms 11924 KB Output is correct
11 Correct 966 ms 52764 KB Output is correct
12 Correct 1074 ms 56232 KB Output is correct
13 Correct 1039 ms 55972 KB Output is correct
14 Correct 141 ms 32600 KB Output is correct
15 Correct 185 ms 33956 KB Output is correct
16 Correct 2 ms 468 KB Output is correct
17 Correct 2 ms 468 KB Output is correct
18 Correct 1 ms 468 KB Output is correct
19 Correct 1 ms 340 KB Output is correct
20 Correct 1464 ms 64136 KB Output is correct
21 Correct 1286 ms 60892 KB Output is correct
22 Correct 929 ms 55676 KB Output is correct
23 Correct 134 ms 33996 KB Output is correct
24 Correct 63 ms 3960 KB Output is correct
25 Correct 72 ms 4224 KB Output is correct
26 Correct 74 ms 4328 KB Output is correct
27 Correct 122 ms 32588 KB Output is correct
28 Correct 181 ms 33996 KB Output is correct
29 Correct 1 ms 340 KB Output is correct
30 Correct 1 ms 468 KB Output is correct
31 Correct 1 ms 468 KB Output is correct
32 Correct 2 ms 468 KB Output is correct
33 Correct 287 ms 37772 KB Output is correct
34 Correct 658 ms 47592 KB Output is correct
35 Correct 947 ms 55584 KB Output is correct
36 Correct 1407 ms 63028 KB Output is correct
37 Correct 239 ms 12884 KB Output is correct
38 Correct 221 ms 15296 KB Output is correct
39 Correct 247 ms 12920 KB Output is correct
40 Correct 230 ms 15324 KB Output is correct
41 Correct 238 ms 12952 KB Output is correct
42 Correct 224 ms 15600 KB Output is correct
43 Correct 125 ms 32620 KB Output is correct
44 Correct 128 ms 33888 KB Output is correct
45 Correct 74 ms 5884 KB Output is correct
46 Correct 110 ms 5976 KB Output is correct
47 Correct 415 ms 22160 KB Output is correct
48 Correct 942 ms 52440 KB Output is correct
49 Correct 78 ms 4396 KB Output is correct
50 Correct 73 ms 4372 KB Output is correct
51 Correct 73 ms 4492 KB Output is correct
52 Correct 75 ms 4420 KB Output is correct
53 Correct 74 ms 4388 KB Output is correct
54 Correct 74 ms 4388 KB Output is correct