제출 #268302

#제출 시각아이디문제언어결과실행 시간메모리
268302evpipis가로등 (APIO19_street_lamps)C++11
100 / 100
3796 ms408720 KiB
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef pair<int, int> ii;

const int len = 3e5+5;
set<ii> mys;
int light[len]; // n_len

struct seg_tree{
    struct node{
        int sum, num;
        node *lef, *rig;

        node(int s = 0, int n = 0, node *l = NULL, node *r = NULL){
            sum = s;
            num = n;
            lef = l;
            rig = r;
        }
    };

    typedef node *pnode;
    pnode null, root;
    int mx;

    seg_tree(int m = 0){
        mx = m;
        null = new node();
        null->lef = null->rig = null;
        root = null;
    }

    pnode update(pnode t, int l, int r, int i, int s, int n){
        if (t == null)
            t = new node(0, 0, null, null);
        t->sum += s;
        t->num += n;

        if (l == r)
            return t;

        int mid = (l+r)/2;
        if (i <= mid)
            t->lef = update(t->lef, l, mid, i, s, n);
        else
            t->rig = update(t->rig, mid+1, r, i, s, n);
        return t;
    }

    void upd(int y, int sum, int num){
        root = update(root, 1, mx, y, sum, num);
    }

    ii query(pnode t, int l, int r, int i, int j){
        if (r < i || j < l)
            return mp(0, 0);
        if (i <= l && r <= j)
            return mp(t->sum, t->num);

        int mid = (l+r)/2;
        ii lef = query(t->lef, l, mid, i, j);
        ii rig = query(t->rig, mid+1, r, i, j);
        return mp(lef.fi+rig.fi, lef.se+rig.se);
    }

    ii ask(int y){
        return query(root, 1, mx, y, mx);
    }
};

struct bit{
    seg_tree tree[len];
    int mx;

    bit(int r = 0, int c = 0){
        mx = r;

        for (int i = 1; i <= r; i++)
            tree[i] = seg_tree(c);
    }

    void upd(int x, int y, int sum, int num){
        while (x <= mx)
            tree[x].upd(y, sum, num), x += x&(-x);
    }

    int ask(int x, int y, int tim){
        int sum = 0, num = 0;
        while (x > 0){
            sum += tree[x].ask(y).fi;
            num += tree[x].ask(y).se;
            x -= x&(-x);
        }

        return sum + num*tim;
    }
};

bit data;

ii rig(int i){
    auto it = mys.lower_bound(mp(i, 0));
    if (it == mys.end())
        return mp(-1, -1);
    return *it;
}

ii lef(int i){
    auto it = mys.lower_bound(mp(i+1, 0));
    if (it == mys.begin())
        return mp(-1, -1);
    return *(--it);
}

void print(){
    printf("current intervals:");
    for (auto it: mys)
        printf(" (%d, %d)", it.fi, it.se);
    printf("\n");
}

void toggle(int i, int t = 0){
    light[i] ^= 1;

    if (light[i] == 1){
        ii cur = mp(i, i), l = lef(i-1), r = rig(i+1);
        if (l.se+1 == cur.fi){
            // remove l and update data and extend cur
            mys.erase(l);
            data.upd(l.fi, l.se, +t, -1);
            cur.fi = l.fi;
        }
        if (cur.se == r.fi-1){
            // remove r and update data and extend cur
            mys.erase(r);
            data.upd(r.fi, r.se, +t, -1);
            cur.se = r.se;
        }
        // insert cur and update data
        mys.insert(cur);
        data.upd(cur.fi, cur.se, -t, +1);
    }
    else{
        ii cur = lef(i), l = mp(cur.fi, i-1), r = mp(i+1, cur.se);
        // remove cur and update data
        mys.erase(cur);
        data.upd(cur.fi, cur.se, +t, -1);
        if (l.fi <= l.se){
            // insert l and update data
            mys.insert(l);
            data.upd(l.fi, l.se, -t, +1);
        }
        if (r.fi <= r.se){
            // insert r and update data
            mys.insert(r);
            data.upd(r.fi, r.se, -t, +1);
        }
    }

    //print();
}

int main(){
    int n, q;
    scanf("%d %d ", &n, &q);

    data = bit(n, n);

    for (int i = 1; i <= n; i++){
        char temp;
        scanf("%c", &temp);
        if (temp == '1')
            toggle(i);
    }

    for (int i = 1; i <= q; i++){
        char str[15];
        scanf("%s", str);
        if (str[0] == 'q'){
            int a, b;
            scanf("%d %d", &a, &b);
            b--;

            printf("%d\n", data.ask(a, b, i));
            //printf("asked for interval (%d, %d)\n", a, b);
        }
        else{
            int pos;
            scanf("%d", &pos);
            toggle(pos, i);
        }

        //printf("%d) ", i);
        //print();
    }
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

street_lamps.cpp: In function 'int main()':
street_lamps.cpp:170:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  170 |     scanf("%d %d ", &n, &q);
      |     ~~~~~^~~~~~~~~~~~~~~~~~
street_lamps.cpp:176:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  176 |         scanf("%c", &temp);
      |         ~~~~~^~~~~~~~~~~~~
street_lamps.cpp:183:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  183 |         scanf("%s", str);
      |         ~~~~~^~~~~~~~~~~
street_lamps.cpp:186:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  186 |             scanf("%d %d", &a, &b);
      |             ~~~~~^~~~~~~~~~~~~~~~~
street_lamps.cpp:194:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  194 |             scanf("%d", &pos);
      |             ~~~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...