답안 #722684

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
722684 2023-04-12T15:32:04 Z victor_gao 가로등 (APIO19_street_lamps) C++17
0 / 100
3013 ms 212560 KB
//#pragma GCC optimize("Ofast,unroll-loops,O3")
//#pragma GCC optimize("avx,avx2,sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,fma,tune=native")
#include<bits/stdc++.h>
//#include<bits/extc++.h>
//#pragma pack(1)
#define fast ios::sync_with_stdio(0); cin.tie(0);
#define int long long
#define pii pair<int,int>
#define x first
#define y second
#define N 300015
using namespace std;
//using namespace __gnu_pbds;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
//typedef tree<int, null_type,less_equal<int>, rb_tree_tag,tree_order_statistics_node_update> order_multiset;
//typedef tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> order_set;
struct BIT{
    int n;
    vector<int>arr;
    vector<int>have;
    void in(int x){ have.push_back(x); }
    void build(){
        sort(have.begin(),have.end());
        have.resize(unique(have.begin(),have.end())-have.begin());
        n=have.size();
        arr.resize(n+3);
    }
    int idx(int x){ 
        if (have.empty()) return 0;
        return upper_bound(have.begin(),have.end(),x)-have.begin();
    }
    void modify(int p,int c){
        if (p==0) return;
        for (;p<=n;p+=(p&-p))
            arr[p]+=c;
    }
    int query(int p){
        int ans=0;
        for (;p>0;p-=(p&-p))
            ans+=arr[p];
        return ans;
    }
};
struct BBIT{
    int n;
    vector<BIT>arr;
    void init(int _n){
        n=_n;
        arr.resize(n+3);
    }
    void need_use(int a,int b){
        for (;a<=n;a+=(a&-a))
            arr[a].in(b);
    }
    void modify(int a,int b,int c){
        for (;a<=n;a+=(a&-a)){
            int pos=arr[a].idx(b);
            arr[a].modify(arr[a].idx(b),c);
        }
    }
    int query(int a,int b){
        int ans=0;
        for (;a>0;a-=(a&-a))
            ans=(ans+arr[a].query(arr[a].idx(b)));
        return ans;
    }
}bit;
struct Query{
    int op,a,b;
    Query(int i,int j,int k):op(i),a(j),b(k){}
};
int n,q,last_time[N];
bool arr[N];
set<pair<pii,int> >all;
vector<Query>qry;
vector<pair<pii,int> >change[N];
void add_need(int a,int b){
    if (a>b) return;
  //  cout<<"add need "<<a<<" "<<b<<'\n';
    // add (a~b,a~b)
    bit.need_use(a,a); bit.need_use(a,b+1);
    bit.need_use(b+1,a); bit.need_use(b+1,b+1);
}
signed main(){
    fast
    cin>>n>>q;
    bit.init(n);
    int l=1,val=-1;
    for (int i=1;i<=n;i++){
        char c; cin>>c;
        arr[i]=c-'0';
        if (arr[i]==val) continue;
        else {
            if (val==1) all.insert({{l,i-1},0});
            val=arr[i]; l=i;
        }
    }
    all.insert({{l,n},0});
    for (int i=1;i<=q;i++){
        string str;
        int a=0,b=0; cin>>str;
        if (str=="toggle"){
            cin>>a;
            qry.push_back(Query(1,a,a));
        }
        else {
            cin>>a>>b; b--;
            qry.push_back(Query(2,a,b));
            bit.need_use(a,b);
        }
    }
    for (int i=1;i<=q;i++){
        if (qry[i-1].op==1){
            int p=qry[i-1].a;
            if (arr[p]==1){
                auto it=all.upper_bound(pair<pii,int>(pii(p,1e9),1e9)); it--;
                auto [j,t]=(*it);
                change[i].push_back({{j.x,j.y},i-t});
                add_need(j.x,j.y);
                all.erase(it);
                if (j.x<=p-1) all.insert({{j.x,p-1},i});
                if (p+1<=j.y) all.insert({{p+1,j.y},i});
            }
            else {
                auto it=all.upper_bound(pair<pii,int>(pii(p,p),1e9));
                pii now={p,p};
                if (it!=all.end()){
                    if ((*it).x.x==p+1){
                        now.y=(*it).x.y;
                        change[i].push_back({(*it).x,i-(*it).y});
                        add_need((*it).x.x,(*it).x.y);
                        it=all.erase(it);
                    }
                }
                if (it!=all.begin()){
                    it=prev(it);
                    if ((*it).x.y==p-1){
                        now.x=(*it).x.x;
                        change[i].push_back({(*it).x,i-(*it).y});
                        add_need((*it).x.x,(*it).x.y);
                        it=all.erase(it);
                    }
                }
                all.insert({now,i});
            }
            arr[p]^=1;
        }
        else {
            int a=qry[i-1].a,b=qry[i-1].b;
            auto it=all.upper_bound(pair<pii,int>(pii(a,1e9),1e9));
            if (it==all.begin()){
                last_time[i]=i;
                continue;
            }
            it--;
            if ((*it).x.x<=a&&(*it).x.y>=b) last_time[i]=(*it).y;
            else last_time[i]=i;
        }
    }
    for (int i=0;i<=n+1;i++)
        bit.arr[i].build();
    for (int i=1;i<=q;i++){
        if (qry[i-1].op==1){
            for (auto [j,t]:change[i]){
               // cout<<"change "<<j.x<<' '<<j.y<<" "<<t<<'\n';
                bit.modify(j.x,j.x,t);
                bit.modify(j.x,j.y+1,-t);
                bit.modify(j.y+1,j.x,-t);
                bit.modify(j.y+1,j.y+1,t);
            }
        }
        else {
            cout<<bit.query(qry[i-1].a,qry[i-1].b)+i-last_time[i]<<'\n';
        }
    }
}
/*
5 7
11111
query 1 2
query 1 2
query 1 6
query 3 4
toggle 3
query 3 4
query 1 6
*/

Compilation message

street_lamps.cpp: In member function 'void BBIT::modify(long long int, long long int, long long int)':
street_lamps.cpp:57:17: warning: unused variable 'pos' [-Wunused-variable]
   57 |             int pos=arr[a].idx(b);
      |                 ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 7380 KB Output is correct
2 Correct 5 ms 7380 KB Output is correct
3 Correct 4 ms 7380 KB Output is correct
4 Correct 5 ms 7380 KB Output is correct
5 Correct 4 ms 7380 KB Output is correct
6 Incorrect 4 ms 7380 KB Output isn't correct
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 356 ms 45272 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 7764 KB Output is correct
2 Correct 10 ms 7764 KB Output is correct
3 Correct 7 ms 7764 KB Output is correct
4 Correct 5 ms 7508 KB Output is correct
5 Correct 3013 ms 212560 KB Output is correct
6 Correct 2971 ms 205556 KB Output is correct
7 Correct 2504 ms 175248 KB Output is correct
8 Correct 1090 ms 101528 KB Output is correct
9 Incorrect 134 ms 25832 KB Output isn't correct
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 7636 KB Output is correct
2 Correct 6 ms 7596 KB Output is correct
3 Correct 6 ms 7764 KB Output is correct
4 Correct 7 ms 7764 KB Output is correct
5 Correct 1230 ms 105812 KB Output is correct
6 Correct 1660 ms 137980 KB Output is correct
7 Correct 2232 ms 165744 KB Output is correct
8 Correct 2773 ms 195832 KB Output is correct
9 Correct 563 ms 70832 KB Output is correct
10 Incorrect 445 ms 65468 KB Output isn't correct
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 7380 KB Output is correct
2 Correct 5 ms 7380 KB Output is correct
3 Correct 4 ms 7380 KB Output is correct
4 Correct 5 ms 7380 KB Output is correct
5 Correct 4 ms 7380 KB Output is correct
6 Incorrect 4 ms 7380 KB Output isn't correct
7 Halted 0 ms 0 KB -