HDU 1166 敌兵布阵 线段树区间求和 更改

  1 #include<iostream>
  2 #include<string>
  3 #include<algorithm>
  4 #include<cstdlib>
  5 #include<cstdio>
  6 #include<set>
  7 #include<map>
  8 #include<vector>
  9 #include<cstring>
 10 #include<stack>
 11 #include<cmath>
 12 #include<queue>
 13 #include <bits/stdc++.h>
 14 using namespace std;
 15 #define INF 0x3f3f3f3f
 16 #define ll long long
 17 #define clc(a,b) memset(a,b,sizeof(a))
 18 const int maxn=50000;
 19
 20 int ans;
 21 struct  node
 22 {
 23     int left,right,sum;
 24     int mid()
 25     {
 26         return (left+right)>>1;
 27     }
 28 }tree[maxn*4];
 29
 30 void build_tree(int l,int r,int o)
 31 {
 32     tree[o].left=l;
 33     tree[o].right=r;
 34     if(l==r)
 35     {
 36         scanf("%d",&tree[o].sum);
 37         return ;
 38     }
 39     int mid=tree[o].mid();
 40     build_tree(l,mid,o<<1);
 41     build_tree(mid+1,r,o<<1|1);
 42     tree[o].sum=tree[o<<1].sum+tree[o<<1|1].sum;
 43 }
 44
 45 void query(int l,int r,int o,int L,int R)
 46 {
 47     if(L<=l&&r<=R)
 48     {
 49         ans+=tree[o].sum;
 50         return ;
 51     }
 52     int mid=tree[o].mid();
 53     if(R<=mid)
 54      query(l,mid,o<<1,L,R);
 55     else if(L>mid)
 56         query(mid+1,r,o<<1|1,L,R);
 57     else
 58     {
 59         query(l,mid,o<<1,L,R);
 60         query(mid+1,r,o<<1|1,L,R);
 61     }
 62 }
 63
 64 void update(int l,int r,int o,int pos,int add)
 65 {
 66     if(l==r)
 67     {
 68        tree[o].sum+=add;
 69        return ;
 70     }
 71     int mid=tree[o].mid();
 72     if(pos<=mid)
 73     {
 74         update(l,mid,o<<1,pos,add);
 75     }
 76     else
 77         update(mid+1,r,o<<1|1,pos,add);
 78     tree[o].sum=tree[o<<1].sum+tree[o<<1|1].sum;
 79 }
 80
 81 int main()
 82 {
 83     int t,n,cnt;
 84     int a,b;
 85     char str[10];
 86     cnt=1;
 87     scanf("%d",&t);
 88     while(t--)
 89     {
 90         scanf("%d",&n);
 91         build_tree(1,n,1);
 92         printf("Case %d:\n",cnt++);
 93         while(scanf("%s",str))
 94         {
 95             if(str[0]==‘E‘)
 96                 break;
 97             scanf("%d%d",&a,&b);
 98             if(str[0]==‘Q‘)
 99             {
100                 ans=0;
101                 query(1,n,1,a,b);
102                 printf("%d\n",ans);
103             }
104             else if(str[0]==‘A‘)
105             update(1,n,1,a,b);
106             else
107                 update(1,n,1,a,-b);
108         }
109     }
110     return 0;
111 }

时间: 2025-01-10 07:34:32

HDU 1166 敌兵布阵 线段树区间求和 更改的相关文章

hdu 1116 敌兵布阵 线段树 区间求和 单点更新

线段树的基本知识可以先google一下,不是很难理解 线段树功能:update:单点增减 query:区间求和 #include <bits/stdc++.h> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 using namespace std; const int MAXN = 50008; int sum[MAXN<<2]; void build(int l, int r, int rt)

[HDU 1166 敌兵布阵] 线段树 或 树状数组

1 #include<iostream> 2 #include<cstdio> 3 #include<memory.h> 4 using namespace std; 5 int n,C[50005]; 6 //-------------------------- 7 int lowbit(int x){ 8 return x&-x; 9 } 10 int sum(int x){ 11 int ret=0; 12 while(x>0){ 13 ret+=C

hdu 1166 敌兵布阵 线段树 点更新

// hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就可以了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 虽然十分简单,十分的水,继续加油 #include <algorithm> #include <bitset> #include <cassert> #include <cctype> #include <cfloat> #include <climits

HDU 1166 敌兵布阵 线段树

敌兵布阵 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视.中央情

HDU 1166 敌兵布阵(线段树单点更新,板子题)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 87684    Accepted Submission(s): 36912 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

hdu 1166 敌兵布阵 (线段树)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 45437    Accepted Submission(s): 19314 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

HDU 1166 敌兵布阵 //线段树单点更新

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 41385    Accepted Submission(s): 17489 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

HDU - 1166 敌兵布阵 (线段树+单点修改,区间查询和)

C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视. 中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,例如Derek问:“Tidy,马上汇

HDU 1166 敌兵布阵 线段树单点更新求和

题目链接 中文题,线段树入门题,单点更新求和,建一棵树就可以了. #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #define N 50005 using namespace std; int data[N]; struct Tree { int l,r,sum; }tree[N*4]; void bui