답안 #916245

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
916245 2024-01-25T14:22:13 Z gaga999 Regions (IOI09_regions) C++17
100 / 100
1485 ms 39500 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];
int n, m;
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)
{
    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 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), prt(a1[x][y]);
        else if (mb[y].size() > B)
            slv(y), prt(a2[y][x]);
        else
        {
            slv(x), slv(y);
            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)':
regions.cpp:144:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  144 |         for (int i = 0; i < mb[p].size(); i++)
      |                         ~~^~~~~~~~~~~~~~
regions.cpp: In function 'int main()':
regions.cpp:186:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  186 |             for (int i = 0; i < mb[y].size(); i++)
      |                             ~~^~~~~~~~~~~~~~
regions.cpp:188:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  188 |                 while (p1 < mb[x].size() && vi[x][p1] <= vi[y][i])
      |                        ~~~^~~~~~~~~~~~~~
regions.cpp:190:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  190 |                 while (p2 < mb[x].size() && vo[x][p2] < vi[y][i])
      |                        ~~~^~~~~~~~~~~~~~
regions.cpp:171:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  171 |     scanf("%d%d%d%d", &n, &m, &q, &po[1]), mb[po[1]].pb(1);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
regions.cpp:173:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  173 |         scanf("%d%d", &fa[i], &po[i]), eg[fa[i]].pb(i), mb[po[i]].pb(i);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
regions.cpp:177:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  177 |         scanf("%d%d", &x, &y);
      |         ~~~~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 6744 KB Output is correct
2 Correct 2 ms 6756 KB Output is correct
3 Correct 3 ms 6744 KB Output is correct
4 Correct 3 ms 6800 KB Output is correct
5 Correct 6 ms 6824 KB Output is correct
6 Correct 11 ms 7256 KB Output is correct
7 Correct 15 ms 6868 KB Output is correct
8 Correct 17 ms 6900 KB Output is correct
9 Correct 21 ms 7000 KB Output is correct
10 Correct 39 ms 7776 KB Output is correct
11 Correct 57 ms 7776 KB Output is correct
12 Correct 81 ms 8096 KB Output is correct
13 Correct 91 ms 7896 KB Output is correct
14 Correct 107 ms 8432 KB Output is correct
15 Correct 125 ms 9184 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 491 ms 10928 KB Output is correct
2 Correct 562 ms 10352 KB Output is correct
3 Correct 902 ms 12372 KB Output is correct
4 Correct 152 ms 9188 KB Output is correct
5 Correct 197 ms 10048 KB Output is correct
6 Correct 301 ms 13704 KB Output is correct
7 Correct 523 ms 14128 KB Output is correct
8 Correct 488 ms 22040 KB Output is correct
9 Correct 919 ms 16992 KB Output is correct
10 Correct 1086 ms 39500 KB Output is correct
11 Correct 1485 ms 18480 KB Output is correct
12 Correct 599 ms 19648 KB Output is correct
13 Correct 815 ms 19156 KB Output is correct
14 Correct 910 ms 22528 KB Output is correct
15 Correct 1195 ms 20248 KB Output is correct
16 Correct 1243 ms 20244 KB Output is correct
17 Correct 1174 ms 23060 KB Output is correct