列表

详情


NC20133. [JLOI2012]树

描述

把一个正整数分成一列连续的正整数之和。这个数列必须包含至少两个正整数。你需要求出这个数列的最小长度。如果这个数列不存在则输出-1

输入描述

第一行是两个整数N和S,其中N是树的节点数。
第二行是N个正整数,第i个整数表示节点i的正整数。
接下来的N-1行每行是2个整数x和y,表示y是x的儿子。

输出描述

输出路径节点总和为S的路径数量。

示例1

输入:

3 3

1 2 3

1 2

1 3

输出:

2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 37ms, 内存消耗: 1204K, 提交时间: 2022-11-18 18:53:17

#include<bits/stdc++.h>
using namespace std;
struct tree{
	int val,fa;
}a[100010];
int n,root,ans=0,s,len;
void work(){
	int k; 
	for(int i=1;i<=n;i++){
		len=0;
		int x=0;
		k=i;
		while(k!=root){
			len++;
			x+=a[k].val;
			k=a[k].fa;
			if(x==s){ans++;break;}
			if(x>s){
				break;//TODO
			}
			//TODO
		}
		x+=a[k].val;
		if(x==s)ans++;//TODO
	}
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	cin>>n>>s;
	for(int i=1;i<=n;i++){
		cin>>a[i].val;//TODO
	}
	for(int i=1;i<=n-1;i++){
		int x,y;
		cin>>x>>y;
		a[y].fa=x;//TODO
	}
	for(int i=1;i<=n;i++){
		if(a[i].fa==0){
		root=i;
		break;	
		}
		//TODO
	}
	work();
	cout<<ans;
	return 0;
} 

上一题