Submission #916247

# Submission time Handle Problem Language Result Execution time Memory
916247 2024-01-25T14:24:33 Z gaga999 Regions (IOI09_regions) C++17
100 / 100
1475 ms 39040 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;
int fa[N], po[N], *a1[M], *a2[M], *vi[M], *vo[M], in[N], ou[N], dp[N], B;
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);
        }
    }
}

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), B = sqrt(n);
    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:139:22: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  139 |     if (mb[p].size() <= B)
      |         ~~~~~~~~~~~~~^~~~
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:177:26: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  177 |         if (mb[x].size() > B)
      |             ~~~~~~~~~~~~~^~~
regions.cpp:179:31: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  179 |         else if (mb[y].size() > B)
      |                  ~~~~~~~~~~~~~^~~
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), B = sqrt(n);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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 6800 KB Output is correct
2 Correct 2 ms 6744 KB Output is correct
3 Correct 3 ms 6744 KB Output is correct
4 Correct 3 ms 7056 KB Output is correct
5 Correct 4 ms 6824 KB Output is correct
6 Correct 9 ms 7100 KB Output is correct
7 Correct 11 ms 6872 KB Output is correct
8 Correct 16 ms 6904 KB Output is correct
9 Correct 22 ms 7000 KB Output is correct
10 Correct 37 ms 7772 KB Output is correct
11 Correct 74 ms 7772 KB Output is correct
12 Correct 63 ms 8416 KB Output is correct
13 Correct 77 ms 8152 KB Output is correct
14 Correct 114 ms 8432 KB Output is correct
15 Correct 119 ms 9180 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 493 ms 10924 KB Output is correct
2 Correct 586 ms 10948 KB Output is correct
3 Correct 933 ms 12496 KB Output is correct
4 Correct 133 ms 9484 KB Output is correct
5 Correct 174 ms 9812 KB Output is correct
6 Correct 278 ms 14092 KB Output is correct
7 Correct 440 ms 16284 KB Output is correct
8 Correct 496 ms 21344 KB Output is correct
9 Correct 906 ms 17212 KB Output is correct
10 Correct 1058 ms 39040 KB Output is correct
11 Correct 1475 ms 19348 KB Output is correct
12 Correct 581 ms 19712 KB Output is correct
13 Correct 781 ms 19032 KB Output is correct
14 Correct 914 ms 22884 KB Output is correct
15 Correct 1204 ms 20256 KB Output is correct
16 Correct 1304 ms 19980 KB Output is correct
17 Correct 1239 ms 23184 KB Output is correct