• 线段树简单单点更新模板+练习


    HDU-1754 I Hate It

    http://acm.hdu.edu.cn/showproblem.php?pid=1754

     

    Problem Description

    很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。 
    这让很多学生很反感。 

    不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

    Input

    本题目包含多组测试,请处理到文件结束。 
    在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。 
    学生ID编号分别从1编到N。 
    第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。 
    接下来有M行。每一行有一个字符 C (只取'Q'或'U') ,和两个正整数A,B。 
    当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。 
    当C为'U'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。 

    Output

    对于每一次询问操作,在一行里面输出最高成绩。

    Sample Input

    5 6
    1 2 3 4 5
    Q 1 5
    U 3 6
    Q 3 4
    Q 4 5
    U 2 9
    Q 1 5

    Sample Output

    5
    6
    5
    9

    Hint

    Huge input,the C function scanf() will work better than cin

    简单模板题,直接粘代码

      1 #include <stdio.h>
      2 #include <string.h>
      3 #include <iostream>
      4 #include <string>
      5 #include <math.h>
      6 #include <algorithm>
      7 #include <vector>
      8 #include <queue>
      9 #include <set>
     10 #include <map>
     11 #include <math.h>
     12 const int INF=0x3f3f3f3f;
     13 typedef long long LL;
     14 const int mod=1e9+7;
     15 //const double PI=acos(-1);
     16 const int maxn=100010;
     17 using namespace std;
     18 //ios::sync_with_stdio(false);
     19 //    cin.tie(NULL);
     20 
     21 int n,m;
     22 struct node
     23 {
     24     int l;
     25     int r;
     26     int MAX;
     27 }SegTree[200010<<2];
     28 
     29 void PushUp(int rt)
     30 {
     31     SegTree[rt].MAX=max(SegTree[rt<<1].MAX,SegTree[rt<<1|1].MAX);
     32 }
     33 
     34 void Build(int l,int r,int rt)
     35 {
     36     SegTree[rt].l=l;
     37     SegTree[rt].r=r;
     38     if(l==r)
     39     {
     40         scanf("%d",&SegTree[rt].MAX);
     41         return;
     42     }
     43     int mid=(l+r)>>1;
     44     Build(l,mid,rt<<1);
     45     Build(mid+1,r,rt<<1|1);
     46     PushUp(rt);
     47 }
     48 
     49 void Update(int aim,int num,int rt)
     50 {
     51     int l=SegTree[rt].l;
     52     int r=SegTree[rt].r;
     53     if(l==r)
     54     {
     55         SegTree[rt].MAX=num;
     56         return ;
     57     }
     58     int mid=(l+r)>>1;
     59     if(aim<=mid)
     60         Update(aim,num,rt<<1);
     61     if(aim>mid)
     62         Update(aim,num,rt<<1|1);
     63     PushUp(rt);
     64 }
     65 
     66 int Query(int L,int R,int rt)
     67 {
     68     int l=SegTree[rt].l;
     69     int r=SegTree[rt].r;
     70     if(L<=l&&R>=r)
     71     {
     72         return SegTree[rt].MAX;
     73     }
     74     int mid=(l+r)>>1;
     75     int MAX=0;
     76     if(L<=mid)
     77         MAX=max(MAX,Query(L,R,rt<<1));
     78     if(R>mid)
     79         MAX=max(MAX,Query(L,R,rt<<1|1));
     80     return MAX;
     81 }
     82 
     83 int main()
     84 {
     85     while(~scanf("%d %d",&n,&m))
     86     {
     87         Build(1,n,1);
     88         for(int i=1;i<=m;i++)
     89         {
     90             char c[5];
     91             int a,b;
     92             scanf("%s %d %d",c,&a,&b);
     93             if(c[0]=='Q')
     94             {
     95                 printf("%d
    ",Query(a,b,1));
     96             }
     97             else if(c[0]=='U')
     98             {
     99                 Update(a,b,1);
    100             }
    101         }
    102     }
    103     return 0;
    104 }

    HDU-1166 敌兵布阵 

    http://acm.hdu.edu.cn/showproblem.php?pid=1166

    Problem Description

    C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视。 
    中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,例如Derek问:“Tidy,马上汇报第3个营地到第10个营地共有多少人!”Tidy就要马上开始计算这一段的总人数并汇报。但敌兵营地的人数经常变动,而Derek每次询问的段都不一样,所以Tidy不得不每次都一个一个营地的去数,很快就精疲力尽了,Derek对Tidy的计算速度越来越不满:"你个死肥仔,算得这么慢,我炒你鱿鱼!”Tidy想:“你自己来算算看,这可真是一项累人的工作!我恨不得你炒我鱿鱼呢!”无奈之下,Tidy只好打电话向计算机专家Windbreaker求救,Windbreaker说:“死肥仔,叫你平时做多点acm题和看多点算法书,现在尝到苦果了吧!”Tidy说:"我知错了。。。"但Windbreaker已经挂掉电话了。Tidy很苦恼,这么算他真的会崩溃的,聪明的读者,你能写个程序帮他完成这项工作吗?不过如果你的程序效率不够高的话,Tidy还是会受到Derek的责骂的. 

    Input

    第一行一个整数T,表示有T组数据。 
    每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50)。 
    接下来每行有一条命令,命令有4种形式: 
    (1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30) 
    (2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30); 
    (3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数; 
    (4)End 表示结束,这条命令在每组数据最后出现; 
    每组数据最多有40000条命令 

    Output

    对第i组数据,首先输出“Case i:”和回车, 
    对于每个Query询问,输出一个整数并回车,表示询问的段中的总人数,这个数保持在int以内。 

    Sample Input

    1
    10
    1 2 3 4 5 6 7 8 9 10
    Query 1 3
    Add 3 6
    Query 2 7
    Sub 10 2
    Add 6 3
    Query 3 10
    End 

    Sample Output

    Case 1:
    6
    33
    59

    简单模板题,所以尝试换种方法,用结构体来实现线段树,直接粘代码

      1 #include <stdio.h>
      2 #include <string.h>
      3 #include <iostream>
      4 #include <string>
      5 #include <math.h>
      6 #include <algorithm>
      7 #include <queue>
      8 #include <set>
      9 #include <math.h>
     10 const int INF=0x3f3f3f3f;
     11 typedef long long LL;
     12 const int mod=1e9+7;
     13 const double PI=acos(-1);
     14 const int maxn=50010;
     15 using namespace std;
     16 
     17 int A[50010];
     18 
     19 struct ST
     20 {
     21     int l;
     22     int r;
     23     int sum;
     24 }SegTree[maxn<<2];
     25 
     26 void PushUp(int rt)
     27 {
     28     SegTree[rt].sum=SegTree[rt<<1].sum+SegTree[rt<<1|1].sum;
     29     return;
     30 }
     31 
     32 void Build(int l,int r,int rt)
     33 {
     34     SegTree[rt].l=l;
     35     SegTree[rt].r=r;
     36     if(l==r)
     37     {
     38         SegTree[rt].sum=A[l];
     39         return ;
     40     }
     41     int mid=(l+r)>>1;
     42     Build(l,mid,rt<<1);
     43     Build(mid+1,r,rt<<1|1);
     44     PushUp(rt);
     45     return ;
     46 }
     47 
     48 void Update(int L,int C,int rt)
     49 {
     50     int l=SegTree[rt].l;
     51     int r=SegTree[rt].r;
     52     if(l==r)
     53     {
     54         SegTree[rt].sum+=C;
     55         return ;
     56     }
     57     int mid=(l+r)>>1;
     58     if(L<=mid)
     59         Update(L,C,rt<<1);
     60     else
     61         Update(L,C,rt<<1|1);
     62     PushUp(rt);
     63     return ;
     64 }
     65 
     66 int Query(int L,int R,int rt)
     67 {
     68     int l=SegTree[rt].l;
     69     int r=SegTree[rt].r;
     70     if(L<=l&&R>=r)
     71         return SegTree[rt].sum;
     72     int sum=0;
     73     int mid=(l+r)>>1;
     74     if(L<=mid)
     75         sum+=Query(L,R,rt<<1);
     76     if(R>mid)
     77         sum+=Query(L,R,rt<<1|1);
     78     return sum;
     79 }
     80 
     81 int main()
     82 {
     83     //freopen("sample.txt","r",stdin);
     84     int T;
     85     int num=0;
     86     scanf("%d",&T);
     87     while(T--)
     88     {
     89         printf("Case %d:
    ",++num);
     90         int n;
     91         scanf("%d",&n);
     92         memset(SegTree,0,sizeof(SegTree));
     93         memset(A,0,sizeof(A));
     94         for(int i=1;i<=n;i++)
     95         {
     96             scanf("%d",&A[i]);
     97         }
     98         char str[10];
     99         Build(1,n,1);
    100         while(~scanf("%s",str)&&strcmp(str,"End")!=0)
    101         {
    102             int a,b;
    103             scanf("%d %d",&a,&b);
    104             if(strcmp(str,"Add")==0)
    105                 Update(a,b,1);
    106             else if(strcmp(str,"Sub")==0)
    107                 Update(a,-b,1);
    108             else if(strcmp(str,"Query")==0)
    109                 printf("%d
    ",Query(a,b,1));
    110         }
    111     }
    112     return 0;
    113 }
  • 相关阅读:
    STM32 GPIO 配置之ODR, BSRR, BRR 详解
    Understanding the STM32F0's GPIO
    STM32F4 External interrupts
    Calculate CAN bit timing parameters -- STM32
    禁用SQL Server Management Studio的IntelliSense
    SQL Server 2016中In-Memory OLTP继CTP3之后的新改进
    一张图解释SQL Server集群、镜像、复制、日志传送
    SQL Server出现错误: 4014
    SQL Server 2016五大优势挖掘企业用户数据价值
    SQL Server 2008, 2008 R2, 2012 and 2014 完全支持TLS1.2加密传输
  • 原文地址:https://www.cnblogs.com/jiamian/p/11371230.html
Copyright © 2020-2023  润新知