Submission #916246

# Submission time Handle Problem Language Result Execution time Memory
916246 2024-01-25T14:22:55 Z gaga999 Regions (IOI09_regions) C++17
100 / 100
1479 ms 39784 KB
#include <cstdio>
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <vector>
#include <queue>
#include <stack>
#include <deque>
#include <algorithm>
#include <utility>
#include <set>
#include <map>
#include <stdlib.h>
#include <cstring>
#include <string.h>
#include <string>
#include <sstream>
#include <assert.h>
#include <climits>
#include <sstream>
#include <numeric>
#include <time.h>
#include <limits.h>
#include <list>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#include <random>
#include <iomanip>
#include <complex>
#include <chrono>
#include <fstream>
#include <functional>
#include <unistd.h>
// #pragma GCC optimize("Ofast,no-stack-protector")
// #pragma GCC optimize("O3,unroll-loops")
// #pragma GCC target("avx,avx2,bmi,bmi2,lzcnt,popcnt")
#define lowbit(x) ((x) & -(x))
#define ml(a, b) ((1ll * (a) * (b)) % M)
#define tml(a, b) (a) = ((1ll * (a) * (b)) % M)
#define ad(a, b) ((0ll + (a) + (b)) % M)
#define tad(a, b) (a) = ((0ll + (a) + (b)) % M)
#define mi(a, b) ((0ll + M + (a) - (b)) % M)
#define tmi(a, b) (a) = ((0ll + M + (a) - (b)) % M)
#define tmin(a, b) (a) = min((a), (b))
#define tmax(a, b) (a) = max((a), (b))
#define iter(a) (a).begin(), (a).end()
#define riter(a) (a).rbegin(), (a).rend()
#define init(a, b) memset((a), (b), sizeof(a))
#define cpy(a, b) memcpy((a), (b), sizeof(a))
#define uni(a) a.resize(unique(iter(a)) - a.begin())
#define pb emplace_back
#define mpr make_pair
#define ls(i) ((i) << 1)
#define rs(i) ((i) << 1 | 1)
#define INF 0x3f3f3f3f
#define NIF 0xc0c0c0c0
#define eps 1e-9
#define F first
#define S second
#define AC cin.tie(0)->sync_with_stdio(0)
using namespace std;
typedef long long llt;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef pair<llt, llt> pll;
typedef complex<double> cd;
// const int M = 998244353;

// random_device rm;
// mt19937 rg(rm());
// default_random_engine rg(rm());
// uniform_int_distribution<int> rd(INT_MIN, INT_MAX);
// uniform_real_distribution<double> rd(0, M_PI);

void db() { cerr << "\n"; }
template <class T, class... U>
void db(T a, U... b) { cerr << a << " ", db(b...); }

inline char gc()
{
    const static int SZ = 1 << 16;
    static char buf[SZ], *p1, *p2;
    if (p1 == p2 && (p2 = buf + fread(p1 = buf, 1, SZ, stdin), p1 == p2))
        return -1;
    return *p1++;
}
void rd() {}
template <typename T, typename... U>
void rd(T &x, U &...y)
{
    x = 0;
    bool f = 0;
    char c = gc();
    while (!isdigit(c))
        f ^= !(c ^ 45), c = gc();
    while (isdigit(c))
        x = (x << 1) + (x << 3) + (c ^ 48), c = gc();
    f && (x = -x), rd(y...);
}

template <typename T>
void prt(T x)
{
    if (x < 0)
        putchar('-'), x = -x;
    if (x > 9)
        prt(x / 10);
    putchar((x % 10) ^ 48);
}

const int N = 2e5 + 5, M = 2.6e4, B = 400;
int fa[N], po[N], *a1[M], *a2[M], *vi[M], *vo[M], in[N], ou[N], dp[N];
bool vd[M];
vector<int> eg[N], mb[M];

inline void dfs()
{
    vector<int> sk(1, 1);
    int ct = 0;
    while (!sk.empty())
    {
        if (in[sk.back()])
            ou[sk.back()] = ct, sk.pop_back();
        else
        {
            in[sk.back()] = ++ct;
            for (int v : eg[sk.back()])
                sk.pb(v);
        }
    }
}

void slv(int p, int n, int m)
{
    if (vd[p])
        return;
    vd[p] = 1;
    if (mb[p].size() <= B)
    {
        vi[p] = new int[mb[p].size()];
        vo[p] = new int[mb[p].size()];
        for (int i = 0; i < mb[p].size(); i++)
            vi[p][i] = in[mb[p][i]], vo[p][i] = ou[mb[p][i]];
        sort(vi[p], vi[p] + mb[p].size());
        sort(vo[p], vo[p] + mb[p].size());
    }
    else
    {
        a1[p] = new int[m + 1];
        a2[p] = new int[m + 1];
        fill(a1[p], a1[p] + m + 1, 0);
        fill(a2[p], a2[p] + m + 1, 0);
        for (int v : mb[p])
            dp[v]++;
        for (int i = 1; i <= n; i++)
            dp[i] += dp[fa[i]], a1[p][po[i]] += dp[i];
        fill(dp, dp + n + 1, 0);
        for (int v : mb[p])
            dp[v]++;
        for (int i = n; i > 0; i--)
            dp[fa[i]] += dp[i], a2[p][po[i]] += dp[i];
        fill(dp, dp + n + 1, 0);
    }
}

signed main()
{
    int n, m, q, x, y;
    scanf("%d%d%d%d", &n, &m, &q, &po[1]), mb[po[1]].pb(1);
    for (int i = 2; i <= n; i++)
        scanf("%d%d", &fa[i], &po[i]), eg[fa[i]].pb(i), mb[po[i]].pb(i);
    dfs();
    while (q--)
    {
        scanf("%d%d", &x, &y);
        if (mb[x].size() > B)
            slv(x, n, m), prt(a1[x][y]);
        else if (mb[y].size() > B)
            slv(y, n, m), prt(a2[y][x]);
        else
        {
            slv(x, n, m), slv(y, n, m);
            int ans = 0, p1 = 0, p2 = 0;
            for (int i = 0; i < mb[y].size(); i++)
            {
                while (p1 < mb[x].size() && vi[x][p1] <= vi[y][i])
                    p1++;
                while (p2 < mb[x].size() && vo[x][p2] < vi[y][i])
                    p2++;
                ans += p1 - p2;
            }
            prt(ans);
        }
        putchar('\n'), fflush(stdout);
    }
}

Compilation message

regions.cpp: In function 'void slv(int, int, int)':
regions.cpp:143:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  143 |         for (int i = 0; i < mb[p].size(); i++)
      |                         ~~^~~~~~~~~~~~~~
regions.cpp: In function 'int main()':
regions.cpp:185:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  185 |             for (int i = 0; i < mb[y].size(); i++)
      |                             ~~^~~~~~~~~~~~~~
regions.cpp:187:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  187 |                 while (p1 < mb[x].size() && vi[x][p1] <= vi[y][i])
      |                        ~~~^~~~~~~~~~~~~~
regions.cpp:189:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  189 |                 while (p2 < mb[x].size() && vo[x][p2] < vi[y][i])
      |                        ~~~^~~~~~~~~~~~~~
regions.cpp:170:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  170 |     scanf("%d%d%d%d", &n, &m, &q, &po[1]), mb[po[1]].pb(1);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
regions.cpp:172:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  172 |         scanf("%d%d", &fa[i], &po[i]), eg[fa[i]].pb(i), mb[po[i]].pb(i);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
regions.cpp:176:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  176 |         scanf("%d%d", &x, &y);
      |         ~~~~~^~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 3 ms 6744 KB Output is correct
2 Correct 2 ms 6744 KB Output is correct
3 Correct 2 ms 6744 KB Output is correct
4 Correct 3 ms 6804 KB Output is correct
5 Correct 4 ms 6824 KB Output is correct
6 Correct 9 ms 7104 KB Output is correct
7 Correct 12 ms 7124 KB Output is correct
8 Correct 14 ms 7156 KB Output is correct
9 Correct 23 ms 7000 KB Output is correct
10 Correct 38 ms 7520 KB Output is correct
11 Correct 58 ms 8292 KB Output is correct
12 Correct 63 ms 8716 KB Output is correct
13 Correct 76 ms 7988 KB Output is correct
14 Correct 108 ms 9192 KB Output is correct
15 Correct 124 ms 9268 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 514 ms 11400 KB Output is correct
2 Correct 608 ms 10632 KB Output is correct
3 Correct 972 ms 12184 KB Output is correct
4 Correct 129 ms 8924 KB Output is correct
5 Correct 186 ms 9792 KB Output is correct
6 Correct 315 ms 13676 KB Output is correct
7 Correct 570 ms 14376 KB Output is correct
8 Correct 489 ms 22044 KB Output is correct
9 Correct 919 ms 16932 KB Output is correct
10 Correct 973 ms 39784 KB Output is correct
11 Correct 1479 ms 18944 KB Output is correct
12 Correct 642 ms 19316 KB Output is correct
13 Correct 792 ms 19228 KB Output is correct
14 Correct 920 ms 22524 KB Output is correct
15 Correct 1251 ms 20244 KB Output is correct
16 Correct 1343 ms 20544 KB Output is correct
17 Correct 1223 ms 23188 KB Output is correct