標籤:stdin data wap char space head lin ORC node
傳送門
題解
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 num19 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\n",i),0;55 return puts("0"),0;56 }
CF815C Karen and Supermarket