bzoj2783: [JLOI2012]树
Posted Bloodline
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj2783: [JLOI2012]树相关的知识,希望对你有一定的参考价值。
2783: [JLOI2012]树
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 753 Solved: 447
[Submit][Status][Discuss]
Description
第一行是两个整数N和S,其中N是树的节点数。
第二行是N个正整数,第i个整数表示节点i的正整数。
接下来的N-1行每行是2个整数x和y,表示y是x的儿子。
输出格式:
输出路径节点总和为S的路径数量。
输入样例: |
输出样例: |
3 3 1 2 3 1 2 1 3 |
2 |
数据范围:
对于30%数据,N≤100;
对于60%数据,N≤1000;
对于100%数据,N≤100000,所有权值以及S都不超过1000。
这个是JLOI2012的T1,发出来仅为了试题完整
=============================================================================================
在这个问题中,给定一个值S和一棵树。在树的每个节点有一个正整数,问有多少条路径的节点总和达到S。路径中节点的深度必须是升序的。假设节点1是根节点,根的深度是0,它的儿子节点的深度为1。路径不必一定从根节点开始。
Input
第一行是两个整数N和S,其中N是树的节点数。
第二行是N个正整数,第i个整数表示节点i的正整数。
接下来的N-1行每行是2个整数x和y,表示y是x的儿子。
Output
输出路径节点总和为S的路径数量。
Sample Input
1 2 3
1 2
1 3
Sample Output
HINT
对于100%数据,N≤100000,所有权值以及S都不超过1000。
Source
连倍增都不会写了。。。。
1 #include<bits/stdc++.h> 2 #define N 102333 3 #define rep(i,l,r) for(int i=l;i<=r;i++) 4 using namespace std; 5 int n,m,s[N][22],fa[N][22],now,w,ans,x,y; 6 //f[i][j] 从i点向上走2^j-1步 7 inline int read(){ 8 int x=0,c=getchar(); 9 while(c>57||c<48)c=getchar(); 10 while(c>47&&c<58)x=x*10+c-48,c=getchar(); 11 return x; 12 } 13 int main () { 14 cin>>n>>m; 15 rep(i,1,n) s[i][0]=read(); rep(i,1,n-1) x=read(),y=read(),fa[y][0]=x; 16 rep(j,0,20) rep(i,1,n) fa[i][j+1]=fa[fa[i][j]][j],s[i][j+1]=s[i][j]+s[fa[i][j]][j]; 17 rep(i,1,n) { 18 now=m; w=i; 19 for(int k=19;k>=0;k--) { 20 if(!fa[w][k]) continue; 21 if(s[w][k]<now) now-=s[w][k],w=fa[w][k]; 22 } 23 if(s[w][0]==now) ++ans; 24 } 25 printf("%d\\n",ans); 26 }
以上是关于bzoj2783: [JLOI2012]树的主要内容,如果未能解决你的问题,请参考以下文章