답안 #595382

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
595382 2022-07-13T17:00:08 Z Do_you_copy Regions (IOI09_regions) C++17
75 / 100
6761 ms 131072 KB
#include <bits/stdc++.h>
#define taskname "test"
#define fi first
#define se second
#define pb push_back
#define faster ios_base::sync_with_stdio(0); cin.tie(0);
using namespace std;
using ll = long long;
using pii = pair <ll, ll>;
using pil = pair <ll, ll>;
using pli = pair <ll, ll>;
using pll = pair <ll, ll>;
using ull = unsigned ll;
mt19937 Rand(chrono::steady_clock::now().time_since_epoch().count());

ll min(const ll &a, const ll &b){
    return (a < b) ? a : b;
}

ll max(const ll &a, const ll &b){
    return (a > b) ? a : b;
}

//const ll Mod = 1000000009;
//const ll Mod2 = 999999999989;
//only use when required
const ll maxN = 3e5 + 1;
const ll maxR = 25000 + 1;
ll n, r, q, sq;
vector <ll> color[maxR];
vector <ll> adj[maxN];
vector <vector<ll>> cnt, rcnt;
ll pos[maxN], be[maxN], child[maxN];
ll dpos[maxN], time_in;
ll bit[maxN];

void update(ll x, ll val){
    for (; x <= n; x += x & -x){
        bit[x] += val;
    }
}

ll get(ll x){
    ll sum = 0;
    for (; x; x -= x & -x){
        sum += bit[x];
    }
    return sum;
}

void pre_dfs(ll u){
    dpos[u] = ++time_in;
    for (const ll &i: adj[u]){
        pre_dfs(i);
        child[u] += child[i] + 1;
    }
}

ll dfs(ll u, ll c, ll up = 0){
    ll summ = 0;
    if (be[u] == c) ++up;
    else rcnt[rcnt.size() - 1][be[u]] += up;
    for (const ll &i: adj[u]){
        summ += dfs(i, c, up);
    }
    if (be[u] == c) return summ + 1;
    cnt[cnt.size() - 1][be[u]] += summ;
    return summ;
}

void Init(){
    cin >> n >> r >> q;
    sq = sqrt(n) + 1;
    ll t; cin >> t;
    be[1] = t;
    color[t].pb(1);
    for (ll i = 2; i <= n; ++i){
        ll p, t;
        cin >> p >> t;
        color[t].pb(i);
        be[i] = t;
        adj[p].pb(i);
    }
    pre_dfs(1);
    for (ll i = 1; i <= r; ++i){
        if (color[i].size() >= sq){
            pos[i] = cnt.size();
            cnt.pb({});
            rcnt.pb({});
            cnt.back().resize(maxN, 0);
            rcnt.back().resize(maxN, 0);
            dfs(1, i);
        }
    }
    for (ll i = 1; i <= q; ++i){
        ll u, v;
        cin >> u >> v;
        if (color[v].size() >= sq){
            cout << cnt[pos[v]][u] << endl;
        }
        else if (color[u].size() >= sq){
            cout << rcnt[pos[u]][v] << endl;
        }
        else{
            for (const ll &i: color[v]){
                update(dpos[i], 1);
            }
            ll ans = 0;
            for (const ll &i: color[u]){
                ans += get(dpos[i] + child[i]) - get(dpos[i]);
            }
            cout << ans << endl;
            for (const ll &i: color[v]){
                update(dpos[i], -1);
            }
        }
    }
}


int main(){
    if (fopen(taskname".inp", "r")){
        freopen(taskname".inp", "r", stdin);
        freopen(taskname".out", "w", stdout);
    }
    faster;
    ll tt = 1;
    //cin >> tt;
    while (tt--){
        Init();
    }
}

Compilation message

regions.cpp: In function 'void Init()':
regions.cpp:86:29: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
   86 |         if (color[i].size() >= sq){
      |             ~~~~~~~~~~~~~~~~^~~~~
regions.cpp:98:29: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
   98 |         if (color[v].size() >= sq){
      |             ~~~~~~~~~~~~~~~~^~~~~
regions.cpp:101:34: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'll' {aka 'long long int'} [-Wsign-compare]
  101 |         else if (color[u].size() >= sq){
      |                  ~~~~~~~~~~~~~~~~^~~~~
regions.cpp: In function 'int main()':
regions.cpp:123:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  123 |         freopen(taskname".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
regions.cpp:124:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  124 |         freopen(taskname".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 12708 KB Output is correct
2 Correct 5 ms 7916 KB Output is correct
3 Correct 7 ms 7888 KB Output is correct
4 Correct 8 ms 7972 KB Output is correct
5 Correct 11 ms 8016 KB Output is correct
6 Correct 20 ms 8016 KB Output is correct
7 Correct 28 ms 8016 KB Output is correct
8 Correct 36 ms 8144 KB Output is correct
9 Correct 52 ms 8592 KB Output is correct
10 Correct 95 ms 8580 KB Output is correct
11 Correct 135 ms 9040 KB Output is correct
12 Correct 169 ms 9688 KB Output is correct
13 Correct 215 ms 9420 KB Output is correct
14 Correct 268 ms 24272 KB Output is correct
15 Correct 403 ms 18168 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1540 ms 122276 KB Output is correct
2 Correct 1589 ms 74216 KB Output is correct
3 Correct 2759 ms 63632 KB Output is correct
4 Correct 409 ms 10156 KB Output is correct
5 Correct 448 ms 11888 KB Output is correct
6 Runtime error 118 ms 131072 KB Execution killed with signal 9
7 Runtime error 160 ms 131072 KB Execution killed with signal 9
8 Runtime error 146 ms 131072 KB Execution killed with signal 9
9 Correct 3880 ms 19956 KB Output is correct
10 Runtime error 218 ms 131072 KB Execution killed with signal 9
11 Correct 6761 ms 20900 KB Output is correct
12 Correct 1876 ms 31448 KB Output is correct
13 Correct 2536 ms 31956 KB Output is correct
14 Correct 3007 ms 125696 KB Output is correct
15 Correct 4999 ms 36540 KB Output is correct
16 Correct 4595 ms 43844 KB Output is correct
17 Runtime error 227 ms 131072 KB Execution killed with signal 9