[POI2009]?????????Gas

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[POI2009]?????????Gas相关的知识,希望对你有一定的参考价值。

???????????????   cst   src   tchar   ?????????   ??????   ????????????   break   string   

Description
??????????????????????????????????????????????????????????????????: 1. ????????????????????????????????????????????????????????????????????????????????? 2. ????????????????????????????????????????????????????????????????????????????????????????????? 3. ?????????????????????????????????s???????????? 4. ????????????????????????????????????????????????????????????????????????k??????????????????????????????????????????????????????

Input
?????????n,s,k????????????n-1?????????xi,yi?????????????????????xi???yi??? 1<=n<=100000 1<=s<=n 1<=k<=20 1<=xi

Output
???????????????????????????????????????

Sample Input
12 3 1
1 12
3 8
7 8
8 9
2 12
10 12
9 12
4 8
5 8
8 11
6 8

Sample Output
4

HINT
??????????????????

????????????????????????????????????????????????????????????????????????k?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????

for (int i=k;i;i--)     more[x][i-1]+=more[son][i];

????????????i?????????i-1?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
    int x=0,f=1;char ch=getchar();
    for (;ch<???0???||ch>???9???;ch=getchar())  if (ch==???-???)    f=-1;
    for (;ch>=???0???&&ch<=???9???;ch=getchar())    x=(x<<1)+(x<<3)+ch-???0???;
    return x*f;
}
inline void print(int x){
    if (x>=10)     print(x/10);
    putchar(x%10+???0???);
}
const int N=1e5,M=20;
int pre[(N<<1)+10],now[N+10],child[(N<<1)+10],tot;
ll more[N+10][M+10],need[N+10][M+10];
int n,m,k,Ans;
void join(int x,int y){pre[++tot]=now[x],now[x]=tot,child[tot]=y;}
void dfs(int x,int fa){
    need[x][0]=1;
    for (int p=now[x],son=child[p];p;p=pre[p],son=child[p]){
        if (son==fa)    continue;
        dfs(son,x);
        for (int i=0;i<k;i++)   need[x][i+1]+=need[son][i];
        for (int i=k;i;i--)     more[x][i-1]+=more[son][i];
    }
    int T=(need[x][k]+m-1)/m;
    Ans+=T;
    more[x][k]+=1ll*T*m;
    for (int i=0;i<=k;i++){
        if (more[x][i]){
            for (int j=i;~i&&(j>=i-1||x==1);j--){//??????????????????????????????
                if (more[x][i]<=need[x][j]){
                    need[x][j]-=more[x][i];
                    more[x][i]=0;
                    break;
                }
                more[x][i]-=need[x][j];
                need[x][j]=0;
            }
        }
    }
}
int main(){
    n=read(),m=read(),k=read();
    for (int i=1;i<n;i++){
        int x=read(),y=read();
        join(x,y),join(y,x);
    }
    dfs(1,0);
    int tot=0;
    for (int i=0;i<=k;i++)  tot+=need[1][i];
    Ans+=(tot+m-1)/m;
    printf("%d
",Ans);
    return 0;
}


















以上是关于[POI2009]?????????Gas的主要内容,如果未能解决你的问题,请参考以下文章

1139: [POI2009]Wie

[POI2009]石子游戏Kam

BZOJ1135: [POI2009]Lyz

bzoj1137POI2009Wsp 岛屿

BZOJ 1142: [POI2009]Tab

BZOJ 1115: [POI2009]石子游戏Kam