• CF815C Karen and Supermarket


    传送门

    题解

     1 //minamoto
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<vector>
     6 #define ll long long
     7 #define inf 0x3f3f3f3f3f3f3f3f
     8 using namespace std;
     9 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
    10 char buf[1<<21],*p1=buf,*p2=buf;
    11 int read(){
    12     #define num ch-'0'
    13     char ch;bool flag=0;int res;
    14     while(!isdigit(ch=getc()))
    15     (ch=='-')&&(flag=true);
    16     for(res=num;isdigit(ch=getc());res=res*10+num);
    17     (flag)&&(res=-res);
    18     #undef num
    19     return res;
    20 }
    21 const int N=5005;
    22 struct node{ll y,n;};vector<node> f[N];
    23 int head[N],Next[N],ver[N],tot;
    24 inline void add(int u,int v){
    25     ver[++tot]=v,Next[tot]=head[u],head[u]=tot;
    26 }
    27 int c[N],d[N],sz[N],n,q,m;
    28 void dfs(int u){
    29     ll rr,ss,tt;sz[u]=1,f[u].resize(2);
    30     f[u][0].n=0,f[u][0].y=inf,f[u][1].y=c[u]-d[u],f[u][1].n=c[u];
    31     for(int i=head[u];i;i=Next[i]){
    32         int v=ver[i];dfs(v);
    33         f[u].resize(sz[u]+sz[v]+1,(node){inf,inf});
    34         for(int j=sz[u];j>=0;--j)
    35         for(int k=0;k<=sz[v];++k){
    36             rr=f[u][j].n+f[v][k].n,
    37             ss=f[u][j].y+f[v][k].n,
    38             tt=f[u][j].y+f[v][k].y;
    39             if(rr<=m&&f[u][j+k].n>rr) f[u][j+k].n=rr;
    40             if(ss<=m&&f[u][j+k].y>ss) f[u][j+k].y=ss;
    41             if(tt<=m&&f[u][j+k].y>tt) f[u][j+k].y=tt;
    42         }
    43         vector<node>().swap(f[v]);
    44         sz[u]+=sz[v];
    45     }
    46 }
    47 int main(){
    48 //    freopen("testdata.in","r",stdin);
    49     n=read(),m=read(),c[1]=read(),d[1]=read();
    50     for(int i=2,fa;i<=n;++i)
    51     c[i]=read(),d[i]=read(),fa=read(),add(fa,i);
    52     dfs(1);
    53     for(int i=n;i;--i)
    54     if(f[1][i].y<=m||f[1][i].n<=m) return printf("%d
    ",i),0;
    55     return puts("0"),0;
    56 }
  • 相关阅读:
    《别闹了,费曼先生》听书笔记
    提升失败回报率的清单
    《真实的幸福》听书笔记
    JAVA好书之《深入理解Java虚拟机》
    2017第32周五
    2017第32周四
    《具身认知》听书笔记
    javascript的rsa加密和python的rsa解密
    python socket timeout设置
    想使用gevent、mysql、sqlalchemy实现python项目协程异步达到并发的效果
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9831686.html
Copyright © 2020-2023  润新知