题目链接

线段树掌握的很差,打算从头从最简单的开始刷一波, 嗯。。就从这个题开始吧!

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <algorithm>
const int maxn = +;
using namespace std;
int a[maxn], n;
struct line
{
int l, r, val;
}tr[maxn<<]; void build(int o, int l, int r)
{
tr[o].l = l; tr[o].r = r;
if(l == r)
{
tr[o].val = a[l];
return;
}
int mid = (l+r)>>;
build(*o, l, mid);
build(*o+, mid+, r);
tr[o].val = tr[*o].val+tr[*o+].val;
}
int query(int o, int l, int r)
{
if(tr[o].l==l && tr[o].r==r)
return tr[o].val;
int mid = (tr[o].l+tr[o].r)>>;
if(r <= mid) query(*o, l, r);
else if(l > mid) query(*o+, l, r);
else
return (query(*o, l, mid)+query(*o+, mid+, r));
}
void update(int o, int p, int add)
{
if(tr[o].l==tr[o].r&&tr[o].l==p)
{
tr[o].val += add;
return;
}
int mid = (tr[o].l+tr[o].r)>>;
if(p<=mid) update(*o, p, add);
else update(*o+, p, add);
tr[o].val = tr[*o].val+tr[*o+].val;
}
int main()
{
int t, i, ca = ;
int p, add, l, r;
char s[];
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(i = ; i <= n; i++)
scanf("%d", &a[i]);
printf("Case %d:\n", ca++); build(, , n);
while(~scanf("%s", s))
{
if(strcmp(s, "End")==) break;
if(s[]=='Q')
{
scanf("%d%d", &l, &r);
printf("%d\n", query(, l, r));
}
if(s[]=='A')
{
scanf("%d%d", &p, &add);
update(, p, add);
}
if(s[]=='S')
{
scanf("%d%d", &p, &add);
update(, p, -add);
}
}
}
return ;
}

注释的代码:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <algorithm>
const int maxn = +;
using namespace std;
int a[maxn], n;
struct line
{
int l, r, val; //val表示该区间的和
}tr[maxn<<]; void build(int o, int l, int r) //o代表当前节点编号
{
tr[o].l = l; tr[o].r = r;
if(l == r)
{
tr[o].val = a[l];
return;
}
int mid = (l+r)>>;
build(*o, l, mid);
build(*o+, mid+, r);
tr[o].val = tr[*o].val+tr[*o+].val; //建树把值从下往上加起来
}
int query(int o, int l, int r) //求l到r的和
{
if(tr[o].l==l && tr[o].r==r) //节点的区间吻合返回
return tr[o].val;
int mid = (tr[o].l+tr[o].r)>>;
if(r <= mid) query(*o, l, r);
else if(l > mid) query(*o+, l, r);
else
return (query(*o, l, mid)+query(*o+, mid+, r)); //横跨了区间
}
void update(int o, int p, int add) //对p节点增加add
{
if(tr[o].l==tr[o].r&&tr[o].l==p)
{
tr[o].val += add;
return;
}
int mid = (tr[o].l+tr[o].r)>>;
if(p<=mid) update(*o, p, add);
else update(*o+, p, add);
tr[o].val = tr[*o].val+tr[*o+].val; //找到值以后的更新
}
int main()
{
int t, i, ca = ;
int p, add, l, r;
char s[];
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(i = ; i <= n; i++)
scanf("%d", &a[i]);
printf("Case %d:\n", ca++); build(, , n);
while(~scanf("%s", s))
{
if(strcmp(s, "End")==) break;
if(s[]=='Q')
{
scanf("%d%d", &l, &r);
printf("%d\n", query(, l, r));
}
if(s[]=='A')
{
scanf("%d%d", &p, &add);
update(, p, add);
}
if(s[]=='S')
{
scanf("%d%d", &p, &add);
update(, p, -add);
}
}
}
return ;
}

HDU 1166 敌兵布阵 (线段树 单点更新)的更多相关文章

  1. HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)

    HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...

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

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  3. HDU 1166 敌兵布阵(线段树单点更新)

    敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...

  4. HDU 1166 敌兵布阵(线段树单点更新,区间查询)

    描述 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况 ...

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

    题目链接 中文题,线段树入门题,单点更新求和,建一棵树就可以了. #include <iostream> #include <cstdio> #include <cmat ...

  6. 【原创】hdu 1166 敌兵布阵(线段树→单点更新,区间查询)

    学习线段树的第三天...真的是没学点啥好的,又是一道水题,纯模板,我个人觉得我的线段树模板还是不错的(毕竟我第一天相当于啥都没学...找了一整天模板,对比了好几个,终于找到了自己喜欢的类型),中文题目 ...

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

    // hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...

  8. HDU 1166 敌兵布阵 <线段树 单点修改 区间查询>

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. HDU 1754 线段树 单点跟新 HDU 1166 敌兵布阵 线段树 区间求和

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  10. hdu 1166 敌兵布阵 线段树区间修改、查询、单点修改 板子题

    题目链接:敌兵布阵 题目: C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视 ...

随机推荐

  1. 历时一周,unity3d+xtion打造我的第一个休闲体感小游戏《空降奇兵》

    1.游戏介绍 本游戏属于休闲小游戏,主要操作如下: 菜单控制:举起左手或右手,点击左边或者右边的菜单:挥动左手或右手,选择关卡: 操作方式:玩家跳跃,游戏中的伞兵从飞机开始降落:玩家通过控制伞兵的左右 ...

  2. WinForm中Component Class、User Control及Custom Control的区别和使用建议

    reference: http://blog.csdn.net/redstonehe/article/details/1536549 .NET Framework 为您提供了开发和实现新控件的能力.除 ...

  3. Win7超级终端查看单片机printf输出

    问题描述:     编写单片机C程序时,经常会用到printf输出信息进行查看,如何查看printf输出? 问题解决:     (1)编写单片机C程序     ucos是一个实时多任务操作系统,以上是 ...

  4. jquery 图片背景透明度(支持IE5/IE6/IE7)

    设置背景图片,以突出透明度的效果及jquery png背景透明插件实例教程 <head> <title>toggle()</title> <style typ ...

  5. 【CodeForces】【#286】Div.2

    T_T越来越水了,这次只做出A+B. A题为了代码简单直接枚举(插入位置和插入字符) //CF #286 Div.2 A #include<vector> #include<stri ...

  6. 【Vijos】【1164】曹冲养猪

    中国剩余定理 没啥重要的……模板题,中国剩余定理就是解出模线性方程组的一个可行解(好像也是唯一解?) 这是一种神奇的构造方法……明白了为什么这样构造是对的就行了=.=至于怎么想到这种构造方法的……去问 ...

  7. java 中 ==和equals 的区别

      Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...

  8. Boost简介

    原文链接:  吴豆豆http://www.cnblogs.com/gdutbean/archive/2012/03/30/2425201.html Boost库 Boost库是为C++语言标准库提供扩 ...

  9. prim求MST

    PRIM==>>MST模板 #include <iostream> using namespace std; #define typec int #define V 3 con ...

  10. SDUT2087离散事件模拟-银行管理

    呃,这个题,我只想仰天长啸:无语死我了,还动用了繁和帅锅给我改,妹的,做题一定要仔细仔细再仔细啊,这种小错误都犯真是该打. 题目描述 现在银行已经很普遍,每个人总会去银行办理业务,一个好的银行是要考虑 ...