Submission #405051

# Submission time Handle Problem Language Result Execution time Memory
405051 2021-05-15T16:09:06 Z Jarif_Rahman Street Lamps (APIO19_street_lamps) C++17
0 / 100
78 ms 7216 KB
#include <bits/stdc++.h>
#define pb push_back
#define f first
#define sc second
using namespace std;
typedef long long int ll;
typedef string str;
struct segtree{
    int k, n;
    vector<int> mn;
    segtree(int _n){
        n = _n;
        k = 1;
        while(k < n) k*=2;
        k*=2;
        mn.resize(k, 1);
    }
    void toggle(int in){
        in+=k/2;
        mn[in] = !mn[in];
        in/=2;
        while(in > 0){
            mn[in] = min(mn[2*in], mn[2*in+1]);
            in/=2;
        }
    }
    int get(int in){
        return mn[in+k/2];
    }
    int find(int in, int nd, int a, int b){
        if(mn[nd] == 1) return -1;
        if(in > b) return -1;
        if(a == b) return a;
        int md = (a+b)/2;
        int x;
        return (x = find(in, 2*nd, a, md)) == -1 ?  find(in, 2*nd+1, md+1, b) : x;
    }
    int find(int in){
        int x = find(in, 1, 0, k/2-1);
        if(x == -1) x = n;
        x--;
        return x;
    }
    int rfind(int in, int nd, int a, int b){
        if(mn[nd] == 1) return -1;
        if(in < a) return -1;
        if(a == b) return a;
        int md = (a+b)/2;
        int x;
        return (x = find(in, 2*nd+1, md+1, b)) == -1 ?  find(in, 2*nd, a, nd) : x;
    }
    int rfind(int in){
        int x = rfind(in, 1, 0, k/2-1);
        x++;
        return x;
    }
};
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, q; cin >> n >> q;
    segtree seg(n);
    for(int i = 0; i < n; i++){
        char x; cin >> x;
        if(x == '0'){
            seg.toggle(i);
        }
    }
    vector<pair<int, int>> ranges;
    vector<int> value;
    vector<bool> bl;
    for(int i = 0; i < n;){
        if(seg.get(i) == 0){
            i++;
            continue;
        }
        int s = i; i = seg.find(i);
        ranges.pb({s, i});
        value.pb(0);
        bl.pb(0);
        i++;
    }
    vector<int> tg;
    vector<tuple<int, int, int>> query;
    for(int i = 0; i < q; i++){
        str tt; cin >> tt;
        if(tt == "toggle"){
            int in; cin >> in; in--;
            tg.pb(in);
        }
        else{
            int a, b; cin >> a >> b; a--, b-=2;
            query.pb({a, b, query.size()});
        }
    }
    map<pair<int, int>, int> mp;
    for(int i = 0; i < tg.size(); i++){
        int in = tg[i];
        
        if(seg.get(in) == 1){
            int l = seg.rfind(in), r = seg.find(in);
            seg.toggle(in);
            value[mp[{l, r}]] = i-value[mp[{l, r}]];
            bl[mp[{l, r}]] = 1;
            mp[{l, r}] = -1;
            if(in-1 >= 0 && seg.get(in-1) == 1){
                l = seg.rfind(in-1);
                mp[{l, in-1}] = ranges.size();
                ranges.pb({l, in-1});
                value.pb(i);
                bl.pb(0);
            }
            if(in+1 < n && seg.get(in+1) == 1){
                r = seg.rfind(in+1);
                mp[{in+1, r}] = ranges.size();
                value.pb(i);
                bl.pb(0);
            }
        }
        else{
            int l, r;
            if(in-1 >= 0 && seg.get(in-1) == 1){
                l = seg.rfind(in-1);
                int ii = mp[{l, in-1}];
                value[ii] = i-value[ii];
                bl[ii] = 1;
                mp[{l, in-1}] = -1;
            }
            if(in+1 < n && seg.get(in+1) == 1){
                r = seg.rfind(in+1);
                int ii = mp[{in+1, r}];
                value[ii] = i-value[ii];
                bl[ii] = 1;
                mp[{in+1, r}] = -1;
            }
            seg.toggle(in);
            l = seg.rfind(in), r = seg.find(in);
            mp[{l, r}] = ranges.size();
            ranges.pb({l, r});
            value.pb(i);
            bl.pb(0);
        }
    }
    vector<int> ans(query.size());
    for(int qq = 0; qq < query.size(); qq++){
        auto [a, b, in] = query[qq];
        ans[in] = 0;
        for(int i = 0; i < ranges.size(); i++){
            if(a > ranges[i].sc || b < ranges[i].f) continue;
            if(bl[i]) ans[in]+=value[i];
            else ans[in]+=in+tg.size()-value[i];
        }
    }
    for(int x: ans) cout << x << "\n";
}

Compilation message

street_lamps.cpp: In function 'int main()':
street_lamps.cpp:97:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   97 |     for(int i = 0; i < tg.size(); i++){
      |                    ~~^~~~~~~~~~~
street_lamps.cpp:145:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::tuple<int, int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  145 |     for(int qq = 0; qq < query.size(); qq++){
      |                     ~~~^~~~~~~~~~~~~~
street_lamps.cpp:148:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  148 |         for(int i = 0; i < ranges.size(); i++){
      |                        ~~^~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Runtime error 1 ms 332 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 78 ms 7216 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 332 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 332 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 1 ms 332 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -