답안 #540351

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
540351 2022-03-20T06:10:51 Z BadPenalty Logičari (COCI21_logicari) C++14
10 / 110
199 ms 48072 KB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
#define F first
#define S second
#define pb push_back
#define endl '\n'
#define all(x) x.begin(),x.end()
#define yes cout<<"Yes"<<endl
#define no cout<<"No"<<endl
const int N = 2e5,mod = 1e9+7;

vector<int>adj[N];
int head[N],par[N];
int root,special;
ll dp[N][2][2][2][2];
int st(int x)
{
    while(x!=head[x])
    {
        head[x] = head[head[x]];
        x = head[x];
    }
    return x;
}

void dfs(int x,int pr)
{
    par[x] = pr;
    for(auto u:adj[x])
    {
        if(u == pr)continue;
        dfs(u,x);
    }
}

ll calc(int nd,int me,int up,int rt,int sp)
{
    if(dp[nd][me][up][rt][sp]!=-1)
        return dp[nd][me][up][rt][sp];
    bool tr = 1;
    if(nd==special&&rt&&up)tr = 0;
    if(nd==root&&me!=rt)tr = 0;
    if(nd==special&&me!=sp)tr = 0;
    if(!tr)
        return dp[nd][me][up][rt][sp] = 1e18;
    ll sum = me;
    for(auto u:adj[nd])
    {
        if(u==par[nd])continue;
        sum+=calc(u,0,me,rt,sp);
    }
    bool cmp = 0;
    if(up)cmp = 1;
    if(nd==root&&sp)cmp = 1;
    if(nd==special&&rt)cmp = 1;

    ll res = 1e18;
    if(cmp)
    {
        res = min(res,sum);
    }
    else
    {
        for(auto u:adj[nd])
        {
            if(u==par[nd])continue;
            ll val = sum-calc(u,0,me,rt,sp)+calc(u,1,me,rt,sp);
            res = min(res,val);;
        }
    }
    return dp[nd][me][up][rt][sp] = res;


}


int main()
{
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int n;
    cin>>n;

    for(int i = 0;i<=n;i++)
        head[i] = i;
    for(int i = 0;i<n;i++)
    {
        int a,b;
        cin>>a>>b;

        int pa = st(a);
        int pb = st(b);

        if(pa==pb)
        {
            root = a;
            special = b;
        }
        else
        {
            head[pa] = pb;
            adj[a].pb(b);
            adj[b].pb(a);
        }
    }
    dfs(root,0);
    ll ans = 1e18;
//    cout<<root<<' '<<special<<endl;
    memset(dp,-1,sizeof dp);
    for(int rt = 0;rt<=1;rt++)
    {
        for(int sp = 0;sp<=1;sp++)
        {
//            cout<<calc(root,rt,0,rt,sp)<<' '<<endl;
//            cout<<rt<<' '<<sp<<endl;
            ans = min(ans,calc(root,rt,0,rt,sp));
        }
    }
    if(ans==1e18)
        cout<<-1<<endl;
    else
        cout<<ans<<endl;
    return 0;
}
/*

*/
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 30036 KB Output is correct
2 Correct 13 ms 30076 KB Output is correct
3 Correct 14 ms 30036 KB Output is correct
4 Correct 13 ms 30036 KB Output is correct
5 Correct 191 ms 48028 KB Output is correct
6 Correct 199 ms 48072 KB Output is correct
7 Correct 191 ms 47956 KB Output is correct
8 Correct 190 ms 48020 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 30036 KB Output is correct
2 Correct 14 ms 29968 KB Output is correct
3 Correct 14 ms 30024 KB Output is correct
4 Correct 14 ms 30036 KB Output is correct
5 Correct 15 ms 30036 KB Output is correct
6 Correct 14 ms 29980 KB Output is correct
7 Correct 13 ms 30000 KB Output is correct
8 Correct 15 ms 30036 KB Output is correct
9 Incorrect 14 ms 30036 KB Output isn't correct
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 30036 KB Output is correct
2 Correct 14 ms 29968 KB Output is correct
3 Correct 14 ms 30024 KB Output is correct
4 Correct 14 ms 30036 KB Output is correct
5 Correct 15 ms 30036 KB Output is correct
6 Correct 14 ms 29980 KB Output is correct
7 Correct 13 ms 30000 KB Output is correct
8 Correct 15 ms 30036 KB Output is correct
9 Incorrect 14 ms 30036 KB Output isn't correct
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 30036 KB Output is correct
2 Correct 13 ms 30076 KB Output is correct
3 Correct 14 ms 30036 KB Output is correct
4 Correct 13 ms 30036 KB Output is correct
5 Correct 191 ms 48028 KB Output is correct
6 Correct 199 ms 48072 KB Output is correct
7 Correct 191 ms 47956 KB Output is correct
8 Correct 190 ms 48020 KB Output is correct
9 Correct 13 ms 30036 KB Output is correct
10 Correct 14 ms 29968 KB Output is correct
11 Correct 14 ms 30024 KB Output is correct
12 Correct 14 ms 30036 KB Output is correct
13 Correct 15 ms 30036 KB Output is correct
14 Correct 14 ms 29980 KB Output is correct
15 Correct 13 ms 30000 KB Output is correct
16 Correct 15 ms 30036 KB Output is correct
17 Incorrect 14 ms 30036 KB Output isn't correct
18 Halted 0 ms 0 KB -