답안 #727504

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
727504 2023-04-20T21:40:31 Z CutSandstone Regions (IOI09_regions) C++17
90 / 100
5892 ms 131072 KB
// #pragma GCC optimize ("Ofast")
// #pragma GCC target ("avx,avx2")
#include <bits/stdc++.h>
#define ll long long
#define vi vector<int>
#define f first
#define s second
#define pb push_back
#define inf ~((long long)1<<63)
using namespace std;
const int mod = 1000000007;
void setio(string name = "") { 
    ios::sync_with_stdio(false), cin.tie(nullptr); 
    if(name.length()) {
        freopen((name + ".in").c_str(), "r", stdin);
        freopen((name + ".out").c_str(), "w", stdout);
    }
}
class BIT {
  private:
    int size;
    vector<int> bit;
    vector<int> arr;

  public:
    BIT(int size) : size(size), bit(size + 1), arr(size) {}
    void set(int ind, int val) { add(ind, val - arr[ind]); }
    void add(int ind, int val) {
        arr[ind] += val;
        ind++;
        for (; ind <= size; ind += ind & -ind) { bit[ind] += val; }
    }
    int prev(int ind) {
        ind++;
        int total = 0;
        for (; ind > 0; ind -= ind & -ind) { total += bit[ind]; }
        return total;
    }
    int sum(int a, int b){
        return prev(b)-(a == 0 ? 0:prev(a-1));
    }
};
int N, R, timer = 0;
vector<vector<int>> cnt;
vector<int> big;
vector<int> st, en;
vector<vector<int>> g;
vector<vector<int>> ans;
vector<int> nums;
vector<BIT> sums;
void dfs(int s, vector<int>& curr){
    if(big[nums[s]]+1) curr[big[nums[s]]]++;
    else for(int i = 0; i<curr.size(); i++) ans[s][i] = curr[i];
    st[s] = timer++;
    for(int i: g[s]) dfs(i, curr);
    if(big[nums[s]]+1) curr[big[nums[s]]]--;
    en[s] = timer-1;
}
void getComp(int size){
    vector<int> b(size);
    for(int i = R-1; i>=0; i--) if(big[i]+1) b[--size] = i;
    for(int i = 0; i<b.size(); i++) for(int j: cnt[b[i]])
        sums[i].set(st[j], 1);
}
int main() {
    setio();
    int Q; cin >> N >> R >> Q;
    g.resize(N, vector<int>(0));
    nums.resize(N);
    cin >> nums[0];
    for(int i = 1; i<N; i++){
        int par; cin >> par;
        g[par-1].pb(i);
        cin >> nums[i];
    }
    cnt.resize(R, vector<int>(0));
    for(int i = 0; i<N; i++) cnt[--nums[i]].pb(i);
    int sqrt = 1;
    while(sqrt*sqrt <= N) sqrt++;
    big.resize(R, -1);
    int p = 0;
    for(int i = 0; i<R; i++) if(cnt[i].size() >= sqrt) big[i] = p++;
    st.resize(N);
    en.resize(N);
    ans.resize(N, vector<int>(p));
    vector<int> curr(p);
    dfs(0, curr);
    sums.resize(p, BIT(N));
    getComp(p);
    BIT b(N);
    unordered_map<int, int> mem;
    while(Q--> 0){
        int up, down; cin >> up >> down; --up, --down;
        if(mem.find(up*R+down) != mem.end()) cout << mem[up*R+down] << endl;
        else if(big[down]+1){
            int ret = 0;
            for(int i: cnt[up]) ret+=sums[big[down]].sum(st[i], en[i]);
            mem[up*R+down] = ret;
            cout << ret << endl;
        }else if(big[up]+1){
            int ret = 0;
            for(int i: cnt[down])
                ret+=ans[i][big[up]];
            mem[up*R+down] = ret;
            cout << ret << endl;
        }else{
            int ret = 0;
            for(int i: cnt[down]) b.set(st[i], 1);
            for(int i: cnt[up]) ret+=b.sum(st[i], en[i])-(up == down ? 1:0);
            for(int i: cnt[down]) b.set(st[i], 0);
            mem[up*R+down] = ret;
            cout << ret << endl;
        }
    }
}

Compilation message

regions.cpp: In function 'void dfs(int, std::vector<int>&)':
regions.cpp:53:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |     else for(int i = 0; i<curr.size(); i++) ans[s][i] = curr[i];
      |                         ~^~~~~~~~~~~~
regions.cpp: In function 'void getComp(int)':
regions.cpp:62:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |     for(int i = 0; i<b.size(); i++) for(int j: cnt[b[i]])
      |                    ~^~~~~~~~~
regions.cpp: In function 'int main()':
regions.cpp:82:47: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   82 |     for(int i = 0; i<R; i++) if(cnt[i].size() >= sqrt) big[i] = p++;
      |                                 ~~~~~~~~~~~~~~^~~~~~~
regions.cpp: In function 'void setio(std::string)':
regions.cpp:15:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   15 |         freopen((name + ".in").c_str(), "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
regions.cpp:16:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |         freopen((name + ".out").c_str(), "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 208 KB Output is correct
2 Correct 1 ms 208 KB Output is correct
3 Correct 3 ms 208 KB Output is correct
4 Correct 5 ms 336 KB Output is correct
5 Correct 6 ms 380 KB Output is correct
6 Correct 16 ms 500 KB Output is correct
7 Correct 15 ms 700 KB Output is correct
8 Correct 28 ms 648 KB Output is correct
9 Correct 46 ms 1216 KB Output is correct
10 Correct 95 ms 1644 KB Output is correct
11 Correct 88 ms 2248 KB Output is correct
12 Correct 163 ms 3132 KB Output is correct
13 Correct 215 ms 3044 KB Output is correct
14 Correct 302 ms 5608 KB Output is correct
15 Correct 382 ms 8720 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1188 ms 31936 KB Output is correct
2 Correct 1379 ms 22384 KB Output is correct
3 Correct 2337 ms 25472 KB Output is correct
4 Correct 394 ms 4576 KB Output is correct
5 Correct 369 ms 6984 KB Output is correct
6 Correct 572 ms 44856 KB Output is correct
7 Correct 841 ms 50704 KB Output is correct
8 Runtime error 85 ms 131072 KB Execution killed with signal 9
9 Correct 3637 ms 22632 KB Output is correct
10 Runtime error 107 ms 131072 KB Execution killed with signal 9
11 Correct 5892 ms 29232 KB Output is correct
12 Correct 1344 ms 32812 KB Output is correct
13 Correct 2341 ms 34848 KB Output is correct
14 Correct 2635 ms 80148 KB Output is correct
15 Correct 4152 ms 44420 KB Output is correct
16 Correct 4035 ms 49960 KB Output is correct
17 Correct 3992 ms 97176 KB Output is correct