社区讨论

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

回复

6 条回复,欢迎继续交流。

正在加载回复...