답안 #673516

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
673516 2022-12-20T19:51:11 Z Victor Radio (COCI22_radio) C++17
40 / 110
1500 ms 286900 KB
// #pragma GCC target ("avx,avx2,fma")
// #pragma GCC optimize ("Ofast,inline") // O1 - O2 - O3 - Os - Ofast
// #pragma GCC optimize ("unroll-loops")
#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b) for (int i = (a); i < (b); ++i)
#define per(i, a, b) for (int i = (b) - 1; i >= (a); --i)
#define trav(a, x) for (auto &a : x)

#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()
#define pb push_back
#define debug(x) cout<<#x<<" = "<<x<<endl

#define umap unordered_map
#define uset unordered_set

typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<vi> vvi;

typedef long long ll;
typedef pair<ll,ll> pll;
typedef vector<ll> vll;
typedef vector<pll> vpll;

const int INF = 1'000'000'007;


struct Node {
    int lo,hi,val=INF;
    Node *l,*r;
    Node(int L,int R) : lo(L),hi(R) {
        if(hi-lo!=1) {
            int mid=(lo+hi)/2;
            l=new Node(lo,mid);
            r=new Node(mid,hi);
        }
    }

    int query(int L,int R) {
        if(hi<=L||R<=lo) return INF;
        if(L<=lo&&hi<=R) return val;
        return min(l->query(L,R),r->query(L,R));
    }

    void update(int pos,int x) {
        if(pos<lo||hi<=pos) return;
        if(hi-lo==1) {
            val=x;
            return;
        }

        l->update(pos,x);
        r->update(pos,x);
        val=min(l->val,r->val);
    }
};

const int MAXN = 1'000'000;
int n,q;
umap<int,set<int>> active_factors;
vi factors[MAXN+1];
set<int> neighbors[MAXN+1];
bitset<MAXN+1> active;

int main() {
    cin.tie(0)->sync_with_stdio(0);
    cin.exceptions(cin.failbit);

    rep(i,2,MAXN+1) if(factors[i].empty()) for(int j=i;j<=MAXN;j+=i) factors[j].pb(i);
    rep(i,1,MAXN+1) neighbors[i].insert(INF);
    
    cin>>n>>q;
    Node segtree(0,n);

    int cnt=0;
    while(q--) {
        string op;
        cin>>op;
        if(op=="S") {
            int x;
            cin>>x;
            if(active[x]) {
                trav(factor,factors[x]) {
                    active_factors[factor].erase(x);
                    auto it=active_factors[factor].lower_bound(x);
                    int lnum=-1,rnum=-1;

                    if(it!=active_factors[factor].end()) rnum=*it;
                
                    if(it!=active_factors[factor].begin()) {
                        --it;
                        lnum=*it;
                        ++it;
                    }

                    bool change=0;
                    if(lnum!=-1) {
                        if(*neighbors[lnum].begin()==x) change=1;
                        neighbors[lnum].erase(x);
                    }
                    
                    //if(rnum!=-1) neighbors[x].insert(rnum);

                    if(lnum!=-1&&rnum!=-1) {
                        neighbors[lnum].insert(rnum);
                        if(*neighbors[lnum].begin()==rnum) change=1;
                    }

                    if(change) segtree.update(lnum,*neighbors[lnum].begin());
                }

                segtree.update(x,INF);
                neighbors[x].clear();
                neighbors[x].insert(INF);

            } else {
                trav(factor,factors[x]) {
                    active_factors[factor].insert(x);
                    auto it=active_factors[factor].find(x);
                    int lnum=-1,rnum=-1;

                    if(it!=active_factors[factor].begin()) {
                        --it;
                        lnum=*it;
                        ++it;
                    }

                    ++it;
                    if(it!=active_factors[factor].end()) rnum=*it;
                    --it;

                    bool change=0;
                    if(lnum!=-1&&rnum!=-1) {
                        if(*neighbors[lnum].begin()==rnum) change=1;
                        neighbors[lnum].erase(rnum);
                    }

                    if(lnum!=-1) {
                        neighbors[lnum].insert(x);
                        if(*neighbors[lnum].begin()==x||change) change=1;
                    }

                    if(rnum!=-1) neighbors[x].insert(rnum);

                    if(change) segtree.update(lnum,*neighbors[lnum].begin());
                }
                segtree.update(x,*neighbors[x].begin());
            }
            
            active[x]=!active[x];

        } else {
            ++cnt;
            int lo,hi;
            cin>>lo>>hi;

            ++hi;
            /*
            if(cnt==20) {
                cout<<"active:"<<endl;
                rep(i,0,n+1) if(active[i]) cout<<i<<' ';
                cout<<endl;
                cout<<"lo = "<<lo<<" hi = "<<hi-1<<endl;
                cout<<segtree.query(lo,hi)<<endl;
            }*/
            if(segtree.query(lo,hi)<hi) cout<<"DA"<<'\n';
            else cout<<"NE"<<'\n';
        }
    }
    //cout<<endl;
    //_Exit(0);
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 395 ms 149704 KB Output is correct
2 Correct 403 ms 149660 KB Output is correct
3 Correct 423 ms 149812 KB Output is correct
4 Correct 419 ms 149756 KB Output is correct
5 Correct 392 ms 149704 KB Output is correct
6 Correct 410 ms 149772 KB Output is correct
7 Correct 394 ms 149776 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 970 ms 172028 KB Output is correct
2 Correct 1308 ms 228072 KB Output is correct
3 Correct 1493 ms 281724 KB Output is correct
4 Correct 478 ms 159920 KB Output is correct
5 Correct 545 ms 199976 KB Output is correct
6 Correct 738 ms 250096 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 395 ms 149704 KB Output is correct
2 Correct 403 ms 149660 KB Output is correct
3 Correct 423 ms 149812 KB Output is correct
4 Correct 419 ms 149756 KB Output is correct
5 Correct 392 ms 149704 KB Output is correct
6 Correct 410 ms 149772 KB Output is correct
7 Correct 394 ms 149776 KB Output is correct
8 Correct 970 ms 172028 KB Output is correct
9 Correct 1308 ms 228072 KB Output is correct
10 Correct 1493 ms 281724 KB Output is correct
11 Correct 478 ms 159920 KB Output is correct
12 Correct 545 ms 199976 KB Output is correct
13 Correct 738 ms 250096 KB Output is correct
14 Correct 653 ms 151500 KB Output is correct
15 Correct 1119 ms 162680 KB Output is correct
16 Execution timed out 1593 ms 286900 KB Time limit exceeded
17 Halted 0 ms 0 KB -