제출 #911574

#제출 시각아이디문제언어결과실행 시간메모리
911574lighton가로등 (APIO19_street_lamps)C++17
100 / 100
1076 ms48552 KiB
#include <bits/stdc++.h>
#define forf(i,a,b) for(int i = a; i<=b; i++)
#define all(v) v.begin(),v.end()
using namespace std;
typedef long long ll;
int N,M,Q;
char S[300001];
struct Interval{
    int s,e,ts,te;
}; vector<Interval> ints;

map<int,int> stkeyf,stkeyb;
map<int,int> enkeyf,enkeyb;
void ins(int s, int e, int t){
    int now = ints.size();
    ints.push_back({s,e, t, -1});
    stkeyf.insert({s, now});
    stkeyb.insert({-s, now});
    enkeyf.insert({e, now});
    enkeyb.insert({-e, now});
}
void ers(int ind ,int t){
    ints[ind].te = t;
    int a = ints[ind].s;
    int b = ints[ind].e;
    stkeyf.erase(stkeyf.lower_bound(a));
    stkeyb.erase(stkeyb.lower_bound(-a));
    enkeyf.erase(enkeyf.lower_bound(b));
    enkeyb.erase(enkeyb.lower_bound(-b));
}

struct Event{
    int t;
    int q;
    int s,e,v;
    bool operator<(const Event &r) const{
        if(t==r.t){
            if(q==r.q) return s<r.s;
            return q>r.q;
        }
        return t<r.t;
    }
}; vector<Event> events;

int isq[300001];
int ans[300001];

struct Seg{
    int arr[300005];
    void update(int f, int x){ for(int i = f; i<=Q+3; i += i&-i) arr[i]+=x;}
    int query(int f){
        int ret = 0;
        for(int i = f; i; i-=i&-i) ret += arr[i];
        return ret;
    }
    int query(int s, int e){ return query(e)-query(s-1);}
} seg;

struct Event2{
    int x,y,q,v,id;
    bool operator<(const Event2 &r) const{
        if(x==r.x){
            if(q==r.q) return id<r.id;
            return q<r.q;
        }
        return x<r.x;
    }
};

void dnc(int s, int e){
    if(s==e) return;
    int m = s+e>>1;
    vector<Event2> events2;
    forf(i,s,m){
        if(events[i].q == 0) events2.push_back({events[i].s,events[i].e,0,events[i].v,i});
    }
    forf(i,m+1,e){
        if(events[i].q == 1) events2.push_back({events[i].s,events[i].e,1,0,events[i].t});
    }
    sort(all(events2));

    for(auto i : events2){
        if(i.q == 0) seg.update(i.y,i.v);
        else ans[i.id] += seg.query(i.y,Q+2);
    }
    for(auto i : events2) if(i.q == 0) seg.update(i.y,-i.v);
    dnc(s,m);
    dnc(m+1,e);
}

int main(){
    scanf("%d %d" , &N,&Q);
    scanf("%s" ,S); S[N] = '0';

    {
        int l = 1;
        forf(i, 1, N) {
            if (S[i - 1] == '0' && S[i] == '1') l = i+1;
            if (S[i - 1] == '1' && S[i] == '0') {
                ins(l,i,1);
            }
        }
    }

    forf(i,2,Q+1){ // t = i
        char s[10]; int a,b;
        scanf("%s" , s);
        if(s[0] == 'q'){
            isq[i] = 1;
            scanf("%d %d" , &a,&b); b--;
            events.push_back({i,1,a,b});
            if(enkeyf.lower_bound(b) != enkeyf.end()) {
                int ind = enkeyf.lower_bound(b)->second;
                if (ints[ind].s <= a && b <= ints[ind].e) ans[i] += (i - ints[ind].ts);
            }
        }
        else{
            scanf("%d" , &a);
            if(S[a-1] == '0'){
                S[a-1] = '1';
                int l = a, r = a;
                if(enkeyb.lower_bound(-a) != enkeyb.end()) {
                    int indl = enkeyb.lower_bound(-a)->second;
                    if (ints[indl].e + 1 == a) {
                        ers(indl, i - 1);
                        l = ints[indl].s;
                    }
                }

                if(stkeyf.lower_bound(a) != stkeyf.end()) {
                    int indr = stkeyf.lower_bound(a)->second;
                    if (ints[indr].s - 1 == a) {
                        ers(indr, i - 1);
                        r = ints[indr].e;
                    }
                }

                ins(l,r,i);
            }
            else{
                S[a-1] = '0';
                int ind = enkeyf.lower_bound(a)->second;
                ers(ind,i-1);
                if(ints[ind].s < a) ins(ints[ind].s , a-1 , i);
                if(ints[ind].e > a) ins(a+1 , ints[ind].e , i);
            }
        }
    }

    for(auto i : ints){
        if(i.te != -1) events.push_back({i.te,0,i.s,i.e,i.te-i.ts+1});
    }
    sort(all(events));
    dnc(0,events.size()-1);

    forf(i,1,Q+1){
        if(isq[i]) printf("%d\n" , ans[i]);
    }
}

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

street_lamps.cpp: In function 'void dnc(int, int)':
street_lamps.cpp:72:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   72 |     int m = s+e>>1;
      |             ~^~
street_lamps.cpp: In function 'int main()':
street_lamps.cpp:92:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   92 |     scanf("%d %d" , &N,&Q);
      |     ~~~~~^~~~~~~~~~~~~~~~~
street_lamps.cpp:93:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   93 |     scanf("%s" ,S); S[N] = '0';
      |     ~~~~~^~~~~~~~~
street_lamps.cpp:107:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  107 |         scanf("%s" , s);
      |         ~~~~~^~~~~~~~~~
street_lamps.cpp:110:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  110 |             scanf("%d %d" , &a,&b); b--;
      |             ~~~~~^~~~~~~~~~~~~~~~~
street_lamps.cpp:118:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  118 |             scanf("%d" , &a);
      |             ~~~~~^~~~~~~~~~~
#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...