제출 #1282416

#제출 시각아이디문제언어결과실행 시간메모리
1282416quan606303Museum (CEOI17_museum)C++20
0 / 100
3097 ms47512 KiB
/*
 * @Author: RMQuan 
 * @Date: 2025-10-23 13:22:28 
 * @Last Modified by: RMQuan
 * @Last Modified time: 2025-10-23 14:12:54
 */
/*idea : 



*/
#include <bits/stdc++.h>
bool M1;
#define ll long long
#define INTMAX INT_MAX
#define INTMIN INT_MIN
#define LONGMAX LLONG_MAX
#define LONGMIN LLONG_MIN
#define fi first
#define se second
#define memfull(a,b) memset(a,b,sizeof(a));
#define endl '\n'
#define TASK "TEST"
#define file() if (fopen(TASK".inp","r")){freopen(TASK".inp","r",stdin); freopen(TASK".out","w",stdout);}
using namespace std;
const int MOD=1e9+7;
const int inf=1e9;
const int maxn=1e4+7;
const int LOG=17;
vector<pair<int,int> > adj[maxn];
int n,k,root;
int pos[maxn],h[maxn],depth[maxn],id_rmq=0,rmq[2*maxn][LOG+1];
void dfs(int u,int p)
{
    pos[u]=++id_rmq;
    rmq[id_rmq][0]=u;
    for (auto v:adj[u])
    {
        if (v.fi==p)continue;
        h[v.fi]=h[u]+1;
        depth[v.fi]=depth[u]+v.se;
        dfs(v.fi,u);
        rmq[++id_rmq][0]=u;
    }
}
int get_min_h(int u,int v)
{
    return (h[u]<h[v]?u:v);
}
int lca(int u,int v)
{
    int L=pos[u];
    int R=pos[v];
    if (L>R)swap(L,R);
    int k=__lg(R-L+1);
    return get_min_h(rmq[L][k],rmq[R-(1<<k)+1][k]);
}
int dist(int u,int v)
{
    return depth[u]+depth[v]-2*depth[lca(u,v)];
}
void prepare_lca()
{
    for (int j=1;j<=LOG;j++)
    {
        for (int i=1;i+(1<<j)-1<=id_rmq;i++)rmq[i][j]=get_min_h(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
    }
}
bool cmp(int u,int v)
{
    return pos[u]<pos[v];
}
int dp[maxn][maxn];
int32_t main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    file();
    cin>>n>>k>>root;
    for (int i=1;i<n;i++)
    {
        int x,y,w;
        cin>>x>>y>>w;
        adj[x].push_back({y,w});
        adj[y].push_back({x,w});
    }
    vector<int> node;
    dfs(root,0);
    prepare_lca();
    for (int i=1;i<=n;i++)node.push_back(i);
    sort(node.begin(),node.end(),cmp);
    for (int i=0;i<=n;i++)
    {
        for (int j=0;j<=k;j++)dp[i][j]=inf;
    }
    dp[0][1]=0;
    for (int j=2;j<=k;j++)
    {
        for (int u=1;u<n;u++)
        {
            for (int v=u-1;v>=0;v--)dp[u][j]=min(dp[u][j],dp[v][j-1]+dist(node[v],node[u]));
        }
    }
    int ans=inf;
    for (int i=0;i<n;i++)ans=min(ans,dp[i][k]);
    cout<<ans;
    bool M2;
    cerr<<"-------------------------------------------------"<<endl;
    cerr<<"Time : "<<clock()<<" ms"<<endl;
    cerr<<"Memory : "<<abs(&M2-&M1)/1024/1024<<" MB"<<endl;
    cerr<<"-------------------------------------------------"<<endl;
    return 0;
}

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

museum.cpp: In function 'int32_t main()':
museum.cpp:24:50: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   24 | #define file() if (fopen(TASK".inp","r")){freopen(TASK".inp","r",stdin); freopen(TASK".out","w",stdout);}
      |                                           ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
museum.cpp:79:5: note: in expansion of macro 'file'
   79 |     file();
      |     ^~~~
museum.cpp:24:81: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   24 | #define file() if (fopen(TASK".inp","r")){freopen(TASK".inp","r",stdin); freopen(TASK".out","w",stdout);}
      |                                                                          ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
museum.cpp:79:5: note: in expansion of macro 'file'
   79 |     file();
      |     ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...