zoukankan      html  css  js  c++  java
  • BZOJ2783: [JLOI2012]树

    题解: 不得不吐槽bzoj的题意看的一脸懵逼啊  转站洛谷读了一发题 ....很裸 dfs过程中维护前缀和 二分一下是否会有满足的位置即可

    #include <bits/stdc++.h>
    const int MAXN=1e5+10;
    using namespace std;
    vector<int>vec[MAXN];
    int a[MAXN],num[MAXN],key;
    bool vis[MAXN];int n,m;
    int slove(int l,int r,int t){
    	if(l>r)return 0;
    	int pos=r,ans=0;
    	while(l<=r){
    		int mid=(l+r)>>1;
    		if(num[pos]-num[mid-1]>=t)ans=num[pos]-num[mid-1],l=mid+1;
    		else r=mid-1;
    	}
    	if(ans==t)return 1;
    	return 0;
    }
    void dfs(int v,int pre,int dep){
    	if(m!=a[v])key+=slove(1,dep,m-a[v]);
    	else key++;
    	num[dep+1]=num[dep]+a[v];
    	for(int i=0;i<vec[v].size();i++){
    		if(vec[v][i]!=pre){
    			dfs(vec[v][i],v,dep+1);
    		}
    	}
    }
    int main(){
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    	int u,v;
    	for(int i=1;i<n;i++){
    		scanf("%d%d",&u,&v);
    		vec[u].push_back(v);vis[v]=1;
    	}
    	int S;key=0;
    	for(int i=1;i<=n;i++)if(!vis[i]){S=i;break;}
    	dfs(S,0,1);
    	if(a[S]==m)key++;
    	printf("%d
    ",key);
    }
    

    题目描述

    在这个问题中,给定一个值S和一棵树。在树的每个节点有一个正整数,问有多少条路径的节点总和达到S。路径中节点的深度必须是升序的。假设节点1是根节点,根的深度是0,它的儿子节点的深度为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
    输出样例#1: 复制
    2

    说明

    对于100%数据,N<=100000,所有权值以及S都不超过1000。

  • 相关阅读:
    java三大特性或java对象的三大特性?
    数据结构与算法第10周作业——二叉树的创建和遍历算法
    JDBC的应用
    数据结构与算法--第5周作业(线性表合并算法)
    数据结构与算法--第4周作业(单链表)
    WEB(JSP)下的JDBC操作实验
    application下的JDBC操作
    思考题:JSP的指令inclue和动作include的区别
    css3动画小试
    JS => 函数
  • 原文地址:https://www.cnblogs.com/wang9897/p/9465572.html
Copyright © 2011-2022 走看看