• bzoj2783: [JLOI2012]树


    2783: [JLOI2012]树

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 753  Solved: 447
    [Submit][Status][Discuss]

    Description

    数列
    提交文件:sequence.pas/c/cpp
    输入文件:sequence.in
    输出文件:sequence.out
    问题描述:
    把一个正整数分成一列连续的正整数之和。这个数列必须包含至少两个正整数。你需要求出这个数列的最小长度。如果这个数列不存在则输出-1。
    输入格式:
    每行包含一个正整数n。
    每个文件包含多行,读入直到文件结束。
    输出格式:
    对于每个n,输出一行,为这个数列的最小长度。
     

           第一行是两个整数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。

    数据范围:
    对于所有数据,n≤263

    这个是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

    3 3

    1 2 3

    1 2

    1 3

    Sample Output

    2

    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
    ",ans);
    26 }
    View Code
  • 相关阅读:
    内核配置中Default kernel command string和uboot中bootargs变量的区别
    内核编译配置选项含义
    WARNING: Unable to open an initial console
    Linux内核学习之四库全书
    EABI和OABI
    0.8.11版本ffmpeg一天移植将近完成。
    mmsplayer for wince,windows demo已经发布
    mmsplayer for wince,windows demo已经发布
    0.8.11版本ffmpeg一天移植将近完成。
    ffmpeg AT&T汇编转intel汇编 之(read_time)
  • 原文地址:https://www.cnblogs.com/Bloodline/p/5499204.html
Copyright © 2020-2023  润新知