제출 #1105905

#제출 시각아이디문제언어결과실행 시간메모리
1105905vjudge1무제 (POI11_rot)C++17
100 / 100
231 ms42700 KiB
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define ll long long
#define task "task"

const int ar = 4e5 + 5;
const ll mod = 1e9 + 7;
int n;
int cur;
vector<int> ad[ar];
void input(int p)
{
    int x;
    cin >> x;
    int tmp = (x == 0) ? ++cur : x;
    int C = cur;
    if (x == 0)
    {
        input(C);
        input(C);
    }
    if (p != 0) ad[p].push_back(tmp);
}
int sz[ar];
int Sz[ar];
int timedfs = 0;
int in[ar], out[ar], node[ar];
void dfs(int u, int p)
{
    sz[u] = 1;
    in[u] = ++timedfs;
    node[timedfs] = u;
    bool ok = false;
    for (auto v : ad[u])
    {
        if (v == p) continue;
        ok = true;
        dfs(v, u);
        Sz[u] += Sz[v];
    }
    if (!ok) Sz[u]++;
    out[u] = timedfs;
}
int bit[ar];
void update(int u, int v)
{
    if (u == 0)
    {
        cout << 0;
        exit(0);
    }
    while(u <= n)
    {
        bit[u] += v;
        u += u & (-u);
    }
}
int get(int u)
{
    int ans = 0;
    while(u > 0)
    {
        ans += bit[u];
        u -= u & (-u);
    }
    return ans;
}
ll res[ar];
void hld(int u, int p)
{
    int bigc = 0;
    int _sz = 0;
    for (auto v : ad[u])
    {
        if (v == p) continue;
        if (_sz < Sz[v])
        {
            _sz = Sz[v];
            bigc = v;
        }
    }
    for (auto v : ad[u])
    {
        if (v == p || v == bigc) continue;
        hld(v, u);
        res[u] += res[v];
        for (int i = in[v]; i <= out[v]; i++)
        {
            int uu = node[i];
            if (uu > n) continue;
            update(uu, -1);
        }
    }
    if (bigc) hld(bigc, u), res[u] += res[bigc];
    ll add = 0;
    for (auto v : ad[u])
    {
        if (v == p || v == bigc) continue;
        for (int i = in[v]; i <= out[v]; i++)
        {
            int uu = node[i];
            if (uu > n) continue;
            if (bigc)
            {
                add += (bigc == ad[u][0]) ? get(n) - get(uu) : get(uu - 1);
            }
        }
        for (int i = in[v]; i <= out[v]; i++)
        {
            int uu = node[i];
            if (uu > n) continue;
            update(uu, 1);
        }
    }
    if (u <= n) update(u, 1);
    if (bigc)
    {
        add = min(add, 1ll * Sz[ad[u][0]] * Sz[ad[u][1]] - add);
    }
    res[u] += add;
}
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    if (fopen(task".inp", "r"))
    {
        freopen(task".inp", "r", stdin);
        freopen(task".out", "w", stdout);
    }
    cin >> n;
    cur = n;
    input(0);
    dfs(n + 1, 0);
    hld(n + 1, 0);
    cout << res[n + 1];
}



컴파일 시 표준 에러 (stderr) 메시지

rot.cpp: In function 'int main()':
rot.cpp:132:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  132 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
rot.cpp:133:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  133 |         freopen(task".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...