提出 #20159067


ソースコード 拡げる

#include<bits/stdc++.h>

using namespace std;

const int maxN = 200009;
int N, dp[maxN], vol[maxN], t[maxN], curr[maxN];
vector < int > v[maxN];

int main ()
{
//freopen ("input", "r", stdin);
//freopen ("output", "w", stdout);

scanf ("%d", &N);
for (int i=2; i<=N; i++)
    scanf ("%d", &t[i]), v[t[i]].push_back (i);
for (int i=N; i>=1; i--)
    vol[i] ++, vol[t[i]] += vol[i];
for (int i=N; i>=1; i--)
{
    ///dp[i] = solution to subtree i
    dp[i] = 1;
    int unwantedControlKeptDp = 0, unwantedControlKeptVolDp = 0;
    int K = 0;
    for (auto j : v[i])
        if (vol[j] % 2 == 0)
        {
            if (vol[j] - dp[j] > dp[j])
                dp[i] += dp[j]; ///aoki wins out of these and he can force me at the very beginning to take them
            else
            {
                ///these are unwanted: because the controller loses and keeps control, so will be taken in the end
                unwantedControlKeptDp += dp[j]; ///better one for the one who is not controller
                unwantedControlKeptVolDp += vol[j] - dp[j];
            }
        }
        else
        {
            ///I can keep precisely [(K + 1) / 2] of these
            dp[i] += vol[j] - dp[j]; ///pretend all go for Tak
            curr[++K] = dp[j] - (vol[j] - dp[j]);
        }
    if (K % 2 == 0) dp[i] += unwantedControlKeptDp; ///bad for Aoki who stays controller in the end
    else dp[i] += unwantedControlKeptVolDp;

    sort (curr + 1, curr + K + 1);
    for (int j=1; j<=K; j+=2)
        dp[i] += curr[j];
}

printf ("%d\n", dp[1]);
return 0;
}

提出情報

提出日時
問題 C - DFS Game
ユーザ geniucos
言語 C++ (GCC 9.2.1)
得点 500
コード長 1615 Byte
結果 AC
実行時間 35 ms
メモリ 12824 KiB

コンパイルエラー

./Main.cpp: In function ‘int main()’:
./Main.cpp:14:7: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   14 | scanf ("%d", &N);
      | ~~~~~~^~~~~~~~~~
./Main.cpp:16:11: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   16 |     scanf ("%d", &t[i]), v[t[i]].push_back (i);
      |     ~~~~~~^~~~~~~~~~~~~

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 500 / 500
結果
AC × 3
AC × 34
セット名 テストケース
Sample sample.txt, sample_2.txt, sample_3.txt
All contract_10.txt, contract_10_2.txt, contract_10_3.txt, contract_10_4.txt, contract_2.txt, contract_2_2.txt, contract_2_3.txt, contract_2_4.txt, contract_3000.txt, contract_3000_2.txt, contract_3000_3.txt, contract_3000_4.txt, contract_500.txt, contract_500_2.txt, contract_500_3.txt, contract_500_4.txt, lucky.txt, min.txt, random.txt, random_10.txt, random_2.txt, random_3.txt, random_4.txt, random_5.txt, random_6.txt, random_7.txt, random_8.txt, random_9.txt, sample.txt, sample_2.txt, sample_3.txt, uni.txt, unlucky.txt, unu.txt
ケース名 結果 実行時間 メモリ
contract_10.txt AC 34 ms 12220 KiB
contract_10_2.txt AC 31 ms 12480 KiB
contract_10_3.txt AC 27 ms 12224 KiB
contract_10_4.txt AC 26 ms 12460 KiB
contract_2.txt AC 32 ms 11900 KiB
contract_2_2.txt AC 30 ms 11900 KiB
contract_2_3.txt AC 32 ms 11744 KiB
contract_2_4.txt AC 26 ms 11680 KiB
contract_3000.txt AC 28 ms 12444 KiB
contract_3000_2.txt AC 28 ms 12440 KiB
contract_3000_3.txt AC 29 ms 12452 KiB
contract_3000_4.txt AC 27 ms 12608 KiB
contract_500.txt AC 32 ms 12792 KiB
contract_500_2.txt AC 26 ms 12152 KiB
contract_500_3.txt AC 31 ms 12632 KiB
contract_500_4.txt AC 27 ms 12612 KiB
lucky.txt AC 32 ms 12704 KiB
min.txt AC 9 ms 8268 KiB
random.txt AC 17 ms 9088 KiB
random_10.txt AC 28 ms 11004 KiB
random_2.txt AC 27 ms 10008 KiB
random_3.txt AC 9 ms 8608 KiB
random_4.txt AC 35 ms 11136 KiB
random_5.txt AC 17 ms 9364 KiB
random_6.txt AC 16 ms 9484 KiB
random_7.txt AC 16 ms 9116 KiB
random_8.txt AC 13 ms 9076 KiB
random_9.txt AC 32 ms 10984 KiB
sample.txt AC 12 ms 8320 KiB
sample_2.txt AC 10 ms 8400 KiB
sample_3.txt AC 8 ms 8456 KiB
uni.txt AC 22 ms 10088 KiB
unlucky.txt AC 33 ms 12824 KiB
unu.txt AC 25 ms 10888 KiB