社区讨论
help
灌水区参与者 4已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @lobeqe3w
- 此快照首次捕获于
- 2023/10/29 19:48 2 年前
- 此快照最后确认于
- 2023/11/04 01:24 2 年前
有没有人知道快读怎么打?此蒟蒻要崩了
CPP#include<bits/stdc++.h>
#define gc pa==pd&&(pd=(pa=buf)+fread(buf,1,100000,stdin),pa==pd)?EOF:*pa++
using namespace std;
int n,m,b[50005][1300],h[50001],v[50001],w[50001],c[50001],d[50001],f1[50001],f[60000005],mm,i,j;
static char buf[100000],*pa=buf,*pd=buf;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
long long max(int x,int y){
return x>y?x:y;
}
long long dfs(int x){
int m2=m;
for(long long i=1;i<=b[x][0];++i) dfs(b[x][i]);
m++;
c[m]=w[x];
d[m]=v[x];
f1[m]=m2;
}
int main(){
// freopen("treebag.in","r",stdin);
// freopen("treebag.out","w",stdout);
cin>>m>>n;
for(i=1;i<=m;++i) h[i]=read();
for(i=1;i<=m;++i) w[i]=read();
for(i=1;i<=m;++i) v[i]=read();
for(i=1;i<=m;++i){
if(h[i]!=0){
b[h[i]][0]++;
b[h[i]][b[h[i]][0]]=i;
}
}
mm=m;
m=0;
for(i=1;i<=mm;++i) if(h[i]==0) dfs(i);
for(i=1;i<=m;++i){
for(j=n;j>=1;--j){
if(j>=c[i]) f[i*(n+1)+j]=max(f[f1[i]*(n+1)+j],f[(i-1)*(n+1)+j-c[i]]+d[i]);
else f[i*(n+1)+j]=f[f1[i]*(n+1)+j];
}
}
cout<<f[m*(n+1)+n];
}
哪里有问题啊QWQ为什么读入了这个数据以后还是要求继续读入啊?!
21 21
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 1 1 2 1 1 1 2 1 1 3 2 2 3 3 1 1 1 1 1 2
1 2 2 1 1 1 1 2 1 1 3 1 1 2 2 2 2 5 4 3 2
21 21
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 1 1 2 1 1 1 2 1 1 3 2 2 3 3 1 1 1 1 1 2
1 2 2 1 1 1 1 2 1 1 3 1 1 2 2 2 2 5 4 3 2
回复
共 6 条回复,欢迎继续交流。
正在加载回复...