Submission #916243

# Submission time Handle Problem Language Result Execution time Memory
916243 2024-01-25T14:21:10 Z gaga999 Regions (IOI09_regions) C++17
100 / 100
1434 ms 39268 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];

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);
        }
    }
}

inline 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 2 ms 6744 KB Output is correct
2 Correct 2 ms 6744 KB Output is correct
3 Correct 3 ms 6744 KB Output is correct
4 Correct 4 ms 6804 KB Output is correct
5 Correct 7 ms 6824 KB Output is correct
6 Correct 9 ms 6844 KB Output is correct
7 Correct 12 ms 6880 KB Output is correct
8 Correct 15 ms 7160 KB Output is correct
9 Correct 20 ms 7000 KB Output is correct
10 Correct 36 ms 8048 KB Output is correct
11 Correct 62 ms 8080 KB Output is correct
12 Correct 66 ms 7960 KB Output is correct
13 Correct 95 ms 7900 KB Output is correct
14 Correct 99 ms 8936 KB Output is correct
15 Correct 121 ms 9180 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 535 ms 11280 KB Output is correct
2 Correct 525 ms 10616 KB Output is correct
3 Correct 926 ms 12132 KB Output is correct
4 Correct 144 ms 8920 KB Output is correct
5 Correct 186 ms 9984 KB Output is correct
6 Correct 301 ms 13736 KB Output is correct
7 Correct 545 ms 14148 KB Output is correct
8 Correct 486 ms 21464 KB Output is correct
9 Correct 896 ms 16692 KB Output is correct
10 Correct 968 ms 39268 KB Output is correct
11 Correct 1434 ms 18812 KB Output is correct
12 Correct 557 ms 19836 KB Output is correct
13 Correct 754 ms 19596 KB Output is correct
14 Correct 925 ms 22728 KB Output is correct
15 Correct 1307 ms 20248 KB Output is correct
16 Correct 1282 ms 20260 KB Output is correct
17 Correct 1228 ms 23304 KB Output is correct