답안 #916242

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
916242 2024-01-25T14:20:24 Z gaga999 Regions (IOI09_regions) C++17
100 / 100
1418 ms 39480 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);
        }
    }
}

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);
      |         ~~~~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 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 3 ms 6804 KB Output is correct
5 Correct 5 ms 6824 KB Output is correct
6 Correct 10 ms 7356 KB Output is correct
7 Correct 15 ms 6868 KB Output is correct
8 Correct 17 ms 7160 KB Output is correct
9 Correct 22 ms 7000 KB Output is correct
10 Correct 44 ms 7776 KB Output is correct
11 Correct 58 ms 8032 KB Output is correct
12 Correct 76 ms 8644 KB Output is correct
13 Correct 88 ms 8164 KB Output is correct
14 Correct 121 ms 8672 KB Output is correct
15 Correct 120 ms 9192 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 478 ms 11428 KB Output is correct
2 Correct 594 ms 10612 KB Output is correct
3 Correct 992 ms 11988 KB Output is correct
4 Correct 134 ms 8968 KB Output is correct
5 Correct 191 ms 10084 KB Output is correct
6 Correct 308 ms 13704 KB Output is correct
7 Correct 549 ms 14320 KB Output is correct
8 Correct 534 ms 22036 KB Output is correct
9 Correct 879 ms 17236 KB Output is correct
10 Correct 1024 ms 39480 KB Output is correct
11 Correct 1418 ms 19304 KB Output is correct
12 Correct 644 ms 19944 KB Output is correct
13 Correct 796 ms 19232 KB Output is correct
14 Correct 907 ms 22776 KB Output is correct
15 Correct 1226 ms 20216 KB Output is correct
16 Correct 1301 ms 20588 KB Output is correct
17 Correct 1243 ms 23160 KB Output is correct