hdu 5854 K-th value (2016多校第九场1011) 树形dp

我们二分一下答案,然后发现如果小于等于答案的个数x,剩下的是y个那么一定满足:x>(x+y)/k也就是(k-1)*x-y>0所以我们只需要把小于等于答案的变成k-1,其他的变成-1跑一遍树形dp即可。

#include
#include
#include
#include
#include
using namespace std;
const int maxn=100004;
struct pi{
    int a,b,c;
}pp[maxn];
int k,l,r;
typedef pairp1;
vectorg[maxn];
int dp[maxn][52];
int ans;
void dfs(int u,int pa){
    dp[u][0]=0;
    for(int i=1;i<=r;i++) dp[u][i]=-1000000000;
    for(p1 v:g[u]){
        if(v.first!=pa){
            dfs(v.first,u);
            if(ans) return;
            for(int i=0;i0){
                        ans=1;
                        return;
                    }
                }
            }
            for(int i=0;i>t;
    while(t--){
        scanf("%d",&n);
        for(int i=1;imid){
                    g[pp[i].a].push_back(make_pair(pp[i].b,-1));
                    g[pp[i].b].push_back(make_pair(pp[i].a,-1));
                }
                else{
                    g[pp[i].a].push_back(make_pair(pp[i].b,k-1));
                    g[pp[i].b].push_back(make_pair(pp[i].a,k-1));
                }
            }
            ans=0;
            dfs(1,-1);
            if(ans) ri=mid-1;
            else le=mid+1;
        }
        if(le>1000000000) printf("-1\n");
        else printf("%d\n",le);
    }
}


你可能感兴趣的:(动态规划)