Submission #727485

# Submission time Handle Problem Language Result Execution time Memory
727485 2023-04-20T21:03:09 Z CutSandstone Regions (IOI09_regions) C++17
25 / 100
1930 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<vector<int>> precomp;
vector<int> st, en;
vector<vector<int>> g;
vector<vector<int>> above;
vector<int> ans;
vector<int> nums;
vector<BIT> sums;
void dfs(int s, vector<int> curr, vector<stack<int>> last){
    ans[s] = ++curr[nums[s]];
    if(big[nums[s]]+1) last[big[nums[s]]].push(s);
    else for(int i = 0; i<last.size(); i++) above[s][i] = last[i].empty() ? -1:last[i].top();
    st[s] = timer++;
    for(int i: g[s]) dfs(i, curr, last);
    if(big[nums[s]]+1) last[big[nums[s]]].pop();
    curr[nums[s]]--;
    en[s] = timer-1;
}
void getComp(int size){
    precomp.resize(size, vector<int>(size, 0));
    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);
        for(int j = 0; j<b.size(); j++) for(int k: cnt[b[j]]) 
            precomp[j][i]+=sums[i].sum(st[k], en[k])-(j == i ? 1:0);
    }
}
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++; sqrt--;
    while((R/sqrt)*N > 100000) 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);
    above.resize(N, vector<int>(p));
    dfs(0, vector<int>(R), vector<stack<int>>(p));
    sums.resize(p, BIT(N));
    getComp(p);
    BIT b(N);
    while(Q--> 0){
        int up, down; cin >> up >> down; --up, --down;
        if(big[up]+1 && big[down]+1) cout << precomp[big[up]][big[down]] << endl;
        else if(big[up]+1){
            int ret = 0;
            for(int i: cnt[down]){
                int u = above[i][big[up]];
                if(u != -1) ret+=ans[u];
            }
            cout << ret << endl;
        }else if(big[down]+1){
            int ret = 0;
            for(int i: cnt[up]) ret+=sums[big[down]].sum(st[i], en[i]);
           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);
           cout << ret << endl;
        }
    }
}

Compilation message

regions.cpp: In function 'void dfs(int, std::vector<int>, std::vector<std::stack<int> >)':
regions.cpp:56:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::stack<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |     else for(int i = 0; i<last.size(); i++) above[s][i] = last[i].empty() ? -1:last[i].top();
      |                         ~^~~~~~~~~~~~
regions.cpp: In function 'void getComp(int)':
regions.cpp:67:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |     for(int i = 0; i<b.size(); i++){
      |                    ~^~~~~~~~~
regions.cpp:70:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   70 |         for(int j = 0; j<b.size(); j++) for(int k: cnt[b[j]])
      |                        ~^~~~~~~~~
regions.cpp: In function 'int main()':
regions.cpp:88:5: warning: this 'while' clause does not guard... [-Wmisleading-indentation]
   88 |     while(sqrt*sqrt <= N) sqrt++; sqrt--;
      |     ^~~~~
regions.cpp:88:35: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'while'
   88 |     while(sqrt*sqrt <= N) sqrt++; sqrt--;
      |                                   ^~~~
regions.cpp:92:47: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   92 |     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);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 208 KB Output is correct
2 Correct 0 ms 208 KB Output is correct
3 Correct 3 ms 208 KB Output is correct
4 Correct 5 ms 208 KB Output is correct
5 Correct 7 ms 336 KB Output is correct
6 Correct 16 ms 1232 KB Output is correct
7 Correct 25 ms 464 KB Output is correct
8 Correct 32 ms 720 KB Output is correct
9 Correct 57 ms 7504 KB Output is correct
10 Correct 84 ms 1616 KB Output is correct
11 Correct 109 ms 2564 KB Output is correct
12 Correct 188 ms 10840 KB Output is correct
13 Correct 215 ms 2592 KB Output is correct
14 Correct 361 ms 6572 KB Output is correct
15 Correct 453 ms 87124 KB Output is correct
# Verdict Execution time Memory Grader output
1 Runtime error 227 ms 131072 KB Execution killed with signal 9
2 Correct 1930 ms 33392 KB Output is correct
3 Runtime error 82 ms 131072 KB Execution killed with signal 9
4 Correct 354 ms 29928 KB Output is correct
5 Runtime error 68 ms 131072 KB Execution killed with signal 9
6 Runtime error 105 ms 131072 KB Execution killed with signal 9
7 Runtime error 232 ms 131072 KB Execution killed with signal 9
8 Runtime error 77 ms 131072 KB Execution killed with signal 9
9 Runtime error 145 ms 131072 KB Execution killed with signal 9
10 Runtime error 99 ms 131072 KB Execution killed with signal 9
11 Runtime error 649 ms 131072 KB Execution killed with signal 9
12 Runtime error 373 ms 131072 KB Execution killed with signal 9
13 Runtime error 117 ms 131072 KB Execution killed with signal 9
14 Runtime error 135 ms 131072 KB Execution killed with signal 9
15 Runtime error 95 ms 131072 KB Execution killed with signal 9
16 Runtime error 92 ms 131072 KB Execution killed with signal 9
17 Runtime error 90 ms 131072 KB Execution killed with signal 9