zoukankan      html  css  js  c++  java
  • Travel

    Description
    Yicou经常旅游,但很可惜他不太喜欢旅游(人在江湖,身不由己阿~)所以,每次yicou到了一个景点以后,就会通过景点地图,寻找最少时间走出景区的路线。
    这天,yicou一群人,在FJ的带领下去旅游,不过yicou并不关心去的是哪里,他只想着赶快走出去回去编程。在拿到地图的时候,他惊奇的发现。整个景区竟然是一颗高度为h完全二叉树!最后一行的叶结点全都连接着出口!而入口正好连接着是树根。每个点都只能走向其两个子结点。并且这张地图很好的标出了,每个景点观光时间(从0到99)(路程时间忽略不计)。现在,yicou需要你帮助他寻找从入口到某一出口的最短时间。
    不过,在你算完最短时间以后,突然发现,那是一张过期的地图!由于小鱼儿和花无缺的移花接木的影响,很多景点的观光时间变了…(假冒伪略害人不浅阿~)之后你又在小卖部买到了后面一次的更新数据。刚算完新的最短时间,哈哈~,发现还不是最新的,又买了一次更新…一直买了m次,才全都是最新的,而这最后一次算出的才是yicou想要的时间。
    不过,你为了向yicou说明,你为了帮他付出了很多努力,yicou需要请你吃饭!你需要把过程中算得的那m次不算数的最短时间,和最后一次算数的最短时间,都给yicou看。
    举例:
    1
    2 5
    3 4 6 7
    最短为1-2-3 为6

    后来第3行第1个数据变为10
    1
    2 5
    10 4 6 7
    最短为1-2-4 为7

    后来第3行第2个数据变为10
    1
    2 5
    10 10 6 7
    最短为1-5-6 为12


    再后来第2行第2个数据变为6
    1
    2 6
    10 10 6 7
    最短为1-6-6 为13


    Input
    There are many tests, but only one case in each test.
    The first line contain a number h (1<= h <= 16) 代表完全二叉树的高度
    Next h lines, each has 2^i (0<=i Next line contain a number m (0<= m <= 10000) 代表更新次数
    Next m lines each contains i, j, k means: the ith line’s jth data changes to k
    数据准保合乎出题规范,不用判错。


    Output
    m+1 lines each means a min time

    Sample Input

    3
    1
    2 5
    3 4 6 7
    3
    3 1 10
    3 2 10
    2 2 6


    Sample Output

    6
    7
    12
    13

    View Code
     1 #include <stdio.h>
    2 #include<math.h>
    3 #include<string.h>
    4 #define min(a,b) (((a) < (b)) ? (a) : (b))
    5 #define mx (1024*64+2)
    6 int a[mx],l;
    7 int f[mx];
    8 int fan(int i)
    9 {
    10 if (i>=l)
    11 return a[i];
    12 else if(f[i]!=-1)
    13 return f[i];
    14 else
    15 return f[i]=min(fan(2*i),fan(2*i+1))+a[i];
    16 }
    17 int main()
    18 {
    19 int n,i,j;
    20 int m,x,y,num,c;
    21 scanf("%d",&n);
    22 num=pow(2,n);
    23 for(i=1;i<num;i++) scanf("%d",&a[i]);
    24 memset(f,-1,sizeof(f));
    25 l=pow(2,n-1);
    26 for(i=l;i<num;i++) f[i]=a[i];
    27 printf("%d\n",fan(1));
    28 scanf("%d",&m);
    29 for(i=0;i<m;i++)
    30 {
    31 scanf("%d%d%d",&x,&y,&c);
    32 n=pow(2,x-1)+y-1;
    33 f[n]+=c-a[n];
    34 a[n]=c;
    35 if(n>=l) f[n]=a[n];
    36 n=n/2;
    37 while( n>=1 && f[n]!=min(f[2*n],f[2*n+1])+a[n] )
    38 {
    39 f[n]=min(f[2*n],f[2*n+1])+a[n];
    40 n=n/2;
    41 }
    42 printf("%d\n",f[1]);
    43 }
    44
    45 return 0;
    46 }


  • 相关阅读:
    记录一次有意思的XSS过滤绕过2
    2018年总结
    记录一次Oracle注入绕waf
    记录一次有意思的XSS过滤绕过
    绕过阿里云waf进行SQL注入
    CRLF在过滤XSS语句后打Cookie方式
    JavaWeb之商品查看后历史记录代码实现
    Mysql注入小tips --持续更新中
    JDK动态代理(Proxy)的两种实现方式
    ajax 异步刷新
  • 原文地址:https://www.cnblogs.com/qijinbiao/p/2378502.html
Copyright © 2011-2022 走看看