답안 #746756

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
746756 2023-05-23T03:57:02 Z Olympia Radio (COCI22_radio) C++17
0 / 110
1500 ms 49816 KB
#include <vector>
#include <iostream>
#include <cassert>
#include <cmath>
#include <map>
#include <set>
using namespace std;
struct BIT{
    vector<long long> bit; //1-indexed
    long long pref(long long ind){
        long long ans = 0;
        ind++;
        while(ind > 0){
            //cout << ind << " ";
            ans += bit[ind];
            ind -= (ind & (-ind));
        }
        return ans;
    }
    long long sum(long long l, long long r){
        if(l == 0){
            return pref(r);
        }
        return pref(r) - pref(l - 1);
    }
    void update(long long ind, long long val){
        ind++;
        while(ind < bit.size()){
            bit[ind] += val;
            ind += ind & (-ind);
        }
    }
    void construct(int n){
        bit.resize(n + 1);
        for(int i = 0; i <= n; i++){
            bit[i] = 0;
        }
    }
};
struct SegmentTreeMin {
    vector<int> vec;
    const int id = (int)1e9;
    int merge (int x, int y) {
        return min(x, y);
    }
    void update (int x, int y) {
        x += (int)vec.size()/2 - 1;
        vec[x] = y;
        while (x != 0) {
            x = (x - 1)/2;
            vec[x] = merge(vec[2 * x + 1], vec[2 * x + 2]);
        }
    }
    int query (int dum, int tl, int tr, int l, int r) {
        if (tl >= l and tr <= r) {
            return vec[dum];
        }
        if (tl > r or tr < l) {
            return id;
        }
        return merge(query(2 * dum + 1, tl, (tl + tr)/2, l, r), query(2 * dum + 2, (tl + tr)/2 + 1, tr, l, r));
    }
    int query (int l, int r) {
        return query(0, 0, (int)vec.size()/2 - 1, l, r);
    }
    SegmentTreeMin (int n) {
        n = (1 << ((int)log2(n) + 1));
        vec.assign(2 * n, id);
    }
};

int main () {
    freopen("grass.out", "r", stdin);
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int N, Q;
    cin >> N >> Q;
    vector<vector<int>> queries;
    vector<bool> ans;
    ans.assign(Q, false);
    vector<int> factors(N + 1);
    vector<bool> isPrime(N + 1);
    isPrime.assign(N + 1, true);
    factors[1] = 1;
    for (int i = 2; i <= N; i++) {
        if (not isPrime[i]) {
            continue;
        }
        for (int j = i; j <= N; j += i) {
            factors[j] = i;
            isPrime[j] = false;
        }
    }
    while (Q--) {
        char c;
        cin >> c;
        if (c == 'C') {
            int x, y;
            cin >> x >> y;
            queries.push_back({--x, --y});
        } else {
            int x; cin >> x;
            queries.push_back({--x});
        }
    }
    vector<bool> act(N);
    for (int i = 2; i * i <= N; i++) {
        cout << i << '\n';
        for (int j = 0; j < N; j++) {
            act[j] = false;
        }
        BIT bs;
        bs.construct(N/i);
        for (int j = 0; j < queries.size(); j++) {
            auto q = queries[j];
            if (q.size() == 1) {
                if ((q[0] + 1) % i == 0) {
                    if (!act[q[0]]) {
                        bs.update((q[0] + 1)/i, 1);
                    } else {
                        bs.update((q[0] + 1)/i, 0);
                    }
                    act[q[0]] = not act[q[0]];
                }
            } else {
                if (bs.sum((q[0])/i, (q[1] + 1)/i) >= 2) {
                    ans[j] = true;
                }
            }
        }
    }
    //cout << "OKAY\n";
    //array of values[]
    //check if it is all discint
    SegmentTreeMin next_oc(N + 1);
    set<int> oc[N];
    act.assign(N, false);
    for (int i = 0; i < queries.size(); i++) {
        auto q = queries[i];
        if (q.size() == 1) {
            if ((q[0] + 1) * (q[0] + 1) < N) {
                continue;
            }
            int x = q[0];
            if (act[x]) {
                oc[factors[x + 1]].erase(q[0]);
                next_oc.update(x, next_oc.id);
                auto it = oc[factors[x + 1]].lower_bound(q[0]);
                if (it != oc[factors[x + 1]].begin()) {
                    --it;
                    next_oc.update(*it, next_oc.id);
                }
            } else {
                oc[factors[x + 1]].insert(q[0]);
                auto it = oc[factors[x + 1]].upper_bound(q[0]);
                if (it != oc[factors[x + 1]].end()) {
                    next_oc.update(x, *it);
                }
                it = oc[factors[x + 1]].lower_bound(q[0]);
                if (it != oc[factors[x + 1]].begin()) {
                    --it;
                    next_oc.update(*it, x);
                }
            }
            act[q[0]] = not act[q[0]];
        } else {
            int l = q[0], r = q[1];
            int res = next_oc.query(l, r);
            if (res <= r) {
                ans[i] = 1;
            }
        }
    }
    for (int i = 0; i < queries.size(); i++) {
        if (queries[i].size() == 2) {
            cout << (ans[i] ? "DA" : "NE") << '\n';
        }
    }
}

Compilation message

Main.cpp: In member function 'void BIT::update(long long int, long long int)':
Main.cpp:28:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |         while(ind < bit.size()){
      |               ~~~~^~~~~~~~~~~~
Main.cpp: In function 'int main()':
Main.cpp:114:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  114 |         for (int j = 0; j < queries.size(); j++) {
      |                         ~~^~~~~~~~~~~~~~~~
Main.cpp:138:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  138 |     for (int i = 0; i < queries.size(); i++) {
      |                     ~~^~~~~~~~~~~~~~~~
Main.cpp:174:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  174 |     for (int i = 0; i < queries.size(); i++) {
      |                     ~~^~~~~~~~~~~~~~~~
Main.cpp:73:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   73 |     freopen("grass.out", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1561 ms 49740 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1573 ms 49816 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1561 ms 49740 KB Time limit exceeded
2 Halted 0 ms 0 KB -