답안 #727517

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
727517 2023-04-20T22:31:04 Z CutSandstone Regions (IOI09_regions) C++17
95 / 100
5872 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);
    }
}
void add(vector<int>& bit, int ind, int val){for(ind++; ind < bit.size(); ind += ind & -ind) { bit[ind] += val; };}
int prev(vector<int>& bit, int ind) {
    int total = 0;
    for (ind++; ind > 0; ind -= ind & -ind) { total += bit[ind]; }
    return total;
}
int sum(vector<int>& bit, int a, int b){
    return prev(bit, b)-(a == 0 ? 0:prev(bit, 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<vector<int>> 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;
}
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 block = sqrt(N);
    big.resize(R, -1);
    int p = 0;
    for(int i = 0; i<R; i++) if(cnt[i].size() >= block) 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, vector<int>(N+1));
    for(int i = 0; i<N; i++) if(big[nums[i]]+1) add(sums[big[nums[i]]], st[i], 1);
    vector<int> b(N+1);
    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+=sum(sums[big[down]], 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]) add(b, st[i], 1);
            for(int i: cnt[up]) ret+=sum(b, st[i], en[i])-(up == down ? 1:0);
            for(int i: cnt[down]) add(b, st[i], -1);
            mem[up*R+down] = ret;
            cout << ret << endl;
        }
    }
}

Compilation message

regions.cpp: In function 'void add(std::vector<int>&, int, int)':
regions.cpp:19:61: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 | void add(vector<int>& bit, int ind, int val){for(ind++; ind < bit.size(); ind += ind & -ind) { bit[ind] += val; };}
      |                                                         ~~~~^~~~~~~~~~~~
regions.cpp: In function 'void dfs(int, std::vector<int>&)':
regions.cpp:38:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   38 |     else for(int i = 0; i<curr.size(); i++) ans[s][i] = curr[i];
      |                         ~^~~~~~~~~~~~
regions.cpp: In function 'int main()':
regions.cpp:60:47: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   60 |     for(int i = 0; i<R; i++) if(cnt[i].size() >= block) 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 2 ms 208 KB Output is correct
4 Correct 4 ms 336 KB Output is correct
5 Correct 7 ms 380 KB Output is correct
6 Correct 24 ms 484 KB Output is correct
7 Correct 32 ms 540 KB Output is correct
8 Correct 30 ms 600 KB Output is correct
9 Correct 27 ms 1244 KB Output is correct
10 Correct 101 ms 1580 KB Output is correct
11 Correct 115 ms 2360 KB Output is correct
12 Correct 152 ms 3068 KB Output is correct
13 Correct 213 ms 3124 KB Output is correct
14 Correct 286 ms 5240 KB Output is correct
15 Correct 377 ms 8320 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1028 ms 24984 KB Output is correct
2 Correct 1510 ms 17944 KB Output is correct
3 Correct 2380 ms 21820 KB Output is correct
4 Correct 327 ms 4632 KB Output is correct
5 Correct 397 ms 7004 KB Output is correct
6 Correct 596 ms 32660 KB Output is correct
7 Correct 869 ms 36968 KB Output is correct
8 Correct 1234 ms 96868 KB Output is correct
9 Correct 3477 ms 22772 KB Output is correct
10 Runtime error 114 ms 131072 KB Execution killed with signal 9
11 Correct 5872 ms 27876 KB Output is correct
12 Correct 1870 ms 31364 KB Output is correct
13 Correct 2234 ms 32912 KB Output is correct
14 Correct 2704 ms 62744 KB Output is correct
15 Correct 4410 ms 41032 KB Output is correct
16 Correct 4150 ms 47092 KB Output is correct
17 Correct 3777 ms 77392 KB Output is correct