답안 #673517

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
673517 2022-12-20T19:53:32 Z Victor Radio (COCI22_radio) C++17
40 / 110
1500 ms 285060 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 380 ms 149832 KB Output is correct
2 Correct 401 ms 149832 KB Output is correct
3 Correct 391 ms 149772 KB Output is correct
4 Correct 398 ms 149756 KB Output is correct
5 Correct 392 ms 149908 KB Output is correct
6 Correct 404 ms 149836 KB Output is correct
7 Correct 395 ms 149732 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 955 ms 171188 KB Output is correct
2 Correct 1238 ms 226768 KB Output is correct
3 Correct 1393 ms 280060 KB Output is correct
4 Correct 451 ms 159824 KB Output is correct
5 Correct 525 ms 199240 KB Output is correct
6 Correct 707 ms 248540 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 380 ms 149832 KB Output is correct
2 Correct 401 ms 149832 KB Output is correct
3 Correct 391 ms 149772 KB Output is correct
4 Correct 398 ms 149756 KB Output is correct
5 Correct 392 ms 149908 KB Output is correct
6 Correct 404 ms 149836 KB Output is correct
7 Correct 395 ms 149732 KB Output is correct
8 Correct 955 ms 171188 KB Output is correct
9 Correct 1238 ms 226768 KB Output is correct
10 Correct 1393 ms 280060 KB Output is correct
11 Correct 451 ms 159824 KB Output is correct
12 Correct 525 ms 199240 KB Output is correct
13 Correct 707 ms 248540 KB Output is correct
14 Correct 618 ms 150324 KB Output is correct
15 Correct 1063 ms 160924 KB Output is correct
16 Execution timed out 1598 ms 285060 KB Time limit exceeded
17 Halted 0 ms 0 KB -