zoukankan      html  css  js  c++  java
  • hdu 1166

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166

    线段树或者树状数组都可以做。

    最近学线段树维护数据,所以我用线段树维护sum。

    线段树实际上就是一个完全二叉树,用递归自顶向下进行访问。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 const int maxn=50006,maxm=40006;
     6 int a[maxn],ans[maxm];
     7 struct{
     8     int lef,rig,sum;
     9 } tree[maxn*4];
    10 int n, ANS;
    11 
    12 void build(int x,int y,int now)
    13 {
    14     tree[now].lef=x;
    15     tree[now].rig=y;
    16     if(x==y){
    17         scanf("%d",&tree[now].sum);
    18         return ;
    19     }
    20     int mid=(x+y)>>1;
    21     build( x, mid, now<<1);
    22     build( mid+1, y, now<<1|1);
    23     tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum;
    24 }
    25 
    26 void add(int x,int y,int now,int goal,int add_num)
    27 {
    28     if(x==y){
    29         tree[now].sum+=add_num;
    30         return ;
    31     }
    32     int mid=(x+y)>>1;
    33     if(goal<=mid){
    34         add( x, mid, now<<1, goal, add_num);
    35     }
    36     else{
    37         add( mid+1, y, now<<1|1, goal, add_num);
    38     }
    39     tree[now].sum+=add_num;
    40 }
    41 
    42 void query(int x,int y,int now, int eachx,int eachy)
    43 {
    44     if(x>=eachx&&y<=eachy){
    45         ANS+=tree[now].sum;
    46         return ;
    47     }
    48     int mid=(x+y)>>1;
    49     if(mid>=eachy){
    50         query( x, mid, now<<1, eachx, eachy);
    51     }
    52     else if(mid<eachx){
    53         query( mid+1, y, now<<1|1, eachx, eachy);
    54     }
    55     else{
    56         query( x, mid, now<<1, eachx, eachy);
    57         query( mid+1, y, now<<1|1, eachx, eachy);
    58     }
    59 }
    60 
    61 int main()
    62 {
    63     int T,kkk=1;
    64     scanf("%d",&T);
    65     while(T--){
    66         char order[10];
    67         scanf("%d",&n);
    68         int num=0;
    69         build(1,n,1);
    70         int x,y;
    71         while( ~scanf("%s",order)){
    72             if(order[0]=='E') break;
    73             scanf("%d%d",&x,&y);
    74             if(order[0]=='A') add(1,n,1,x,y);
    75             if(order[0]=='S') add(1,n,1,x,-y);
    76             if(order[0]=='Q'){
    77                 ANS=0;
    78                 query( 1, n, 1, x, y);
    79                 ans[++num]=ANS;
    80             }
    81         }
    82         printf("Case %d:
    ",kkk++);
    83         for(int i=1;i<=num;i++){
    84             printf("%d
    ",ans[i]);
    85         }
    86     }
    87     return 0;
    88 }

    最后因为一个等于号,调了一会。

  • 相关阅读:
    Vue源码解析
    开发调试的几个小技巧
    C#课后小作业
    C#随堂
    C#是数据类型
    插眼
    SQL基本的45题
    SQL创建数据库、建表、填入内容
    T-SQL语句基础
    SQL基本数据类型等
  • 原文地址:https://www.cnblogs.com/ZQUACM-875180305/p/9347853.html
Copyright © 2011-2022 走看看