社区讨论

求调 30pts WA

P4268[USACO18FEB] Directory Traversal G参与者 2已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mknvj4vc
此快照首次捕获于
2026/01/21 18:22
4 周前
此快照最后确认于
2026/02/11 02:29
上周
查看原帖
CPP
#include<bits/stdc++.h>
//#include<bits/extc++.h>
using namespace std;

typedef long long ll;

struct N {
	int v;
	int jd;
	ll dis;
	int len;

	void show() {
		printf("%d %d %lld %d\n ",v,jd,dis,len);
	}
};

//__gnu_pbds::gp_hash_table <int, ll> f;
//__gnu_pbds::gp_hash_table <int, vector<N> > T;

unordered_map<int,ll> f;
unordered_map<int,vector<N> > T;


ll ans=LLONG_MAX;
string s;
N x;

N dfs(int ts) {
	cin>>s;
	
	int m,len=s.size();
	
	scanf("%d",&m);

	if(!m)
		return {ts,1,0,len};
	else {
		int *a=new int[m];
		int j=0;
		ll d=0;

		for(int i=0; i<m; i++) scanf("%d",&a[i]);

		for(int i=0; i<m; i++) {
			auto t=dfs(a[i]);

			j+=t.jd,
			   d+=(!t.dis) ? (t.len)
								: (t.dis + (t.len+1) * t.jd);
			T[ts].push_back(t);
		}
		delete[] a;

		return {ts,j,d,len};
	}
}

void dsa(int ts) {

	(ans>f[ts])&&(ans=f[ts]);

	for(auto i : T[ts]) {
		if (!t.dis) continue;
		f[i.v]=f[ts]-(i.len+1)*i.jd+(x.jd-i.jd)*3;
		dsa(i.v);
	}
}


int main() {
	int n;
	cin>>n;
	x=dfs(1);
	f[1]=x.dis;
	dsa(1);
	printf("%lld",ans);
	return 0;
}

回复

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

正在加载回复...