点我看题目 

题意 :HDU的中文题也不常见。。。。这道题我就不详述了。。。。。

思路 :这个题用线段树用树状数组都可以,用线段树的时候要注意输入那个地方,输入一个字符串的时候不要紧接着输入两个数字,因为我就是这样贡献了好几个RE。。。。

不要用cin,cout,因为也是这样我又贡献了好几个TLE。。。。血一般的教训啊,这道题是水题,模板题。

这个是线段树的代码

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h> using namespace std; const int maxn = ;
int a[maxn] ;
int ans ;
struct node
{
int l,r,value ;
} Node[*maxn] ; void build(int v ,int l,int r)
{
Node[v].l = l ;
Node[v].r = r ;
if(l == r)
{
Node[v].value = a[r] ;
return ;
}
int mid = (l+r)>> ;
build(v*,l,mid) ;
build(v*+,mid+,r) ;
Node[v].value = Node[v*].value+Node[v*+].value ;
} int query(int v,int l,int r)
{
if(Node[v].l == l && Node[v].r == r)
return Node[v].value ;
int mid = (Node[v].l+Node[v].r) >> ;
if(r <= mid)
return query(v*,l,r) ;
else
{
if(l > mid)
return query(v*+,l,r) ;
else
return query(v*,l,mid)+query(v*+,mid+,r) ;
}
} void update(int v,int n,int m)
{
Node[v].value += m ;
if(Node[v].l == n && Node[v].r == n)
return ;
else
{
int mid = (Node[v].l+Node[v].r)>> ;
if(n <= mid)
update(*v,n,m) ;
else if(n > mid)
update(*v+,n,m) ;
}
} void sub(int v,int n,int m)
{
Node[v].value -= m ;
if(Node[v].l == n && Node[v].r == n)
return ;
else
{
int mid = (Node[v].l+Node[v].r)>> ;
if(n <= mid)
sub(*v,n,m) ;
else if(n > mid)
sub(*v+,n,m) ;
}
} int main()
{
int T ,x=;
scanf("%d",&T) ;
while(T--)
{
int n ;
ans = ;
scanf("%d",&n) ;
for(int i = ; i <= n ; i++)
scanf("%d",&a[i]) ;
build(,,n) ;
printf("Case %d:\n",x++) ;
char ch[] ;
while(true)
{
scanf("%s",ch) ;
int a,b ;
if(ch[] == 'Q')
{
scanf("%d %d",&a,&b) ;
printf("%d\n",query(,a,b)) ;
}
else if(ch[] == 'A'){
scanf("%d %d",&a,&b) ;
update(,a,b) ;
}
else if(ch[] == 'S'){
scanf("%d %d",&a,&b) ;
sub(,a,b) ;
}
if(ch[] == 'E')
break ;
}
// printf("\n") ;
}
return ;
}

这个是树状数组的

#include <stdio.h>
#include <iostream>
#include <string.h> using namespace std ; const int maxn = ;
int ch[maxn] ;
int data ;
int n ; int lowbit(int i)
{
return i&(-i) ;
}
int sum(int i)
{
int ans = ;
while(i > )
{
ans += ch[i] ;
i -= lowbit(i) ;
}
return ans ;
}
void add(int x,int value)
{
while(x <= n)
{
ch[x] += value ;
x += lowbit(x) ;
}
}
int main()
{
int T ;
scanf("%d",&T) ;
for(int i = ; i <= T ; i++)
{
scanf("%d",&n) ;
memset(ch,,sizeof(ch)) ;
for(int j = ; j <= n ; j++)
{
scanf("%d",&data) ;
add(j,data) ;
}
printf("Case %d:\n",i) ;
char sh[] ;
int a,b ;
while(~scanf("%s",sh))
{
if(sh[] == 'E')
break ;
if(sh[] == 'A')
{
scanf("%d %d",&a,&b) ;
add(a,b) ;
}
if(sh[] == 'Q')
{
scanf("%d %d",&a,&b) ;
printf("%d\n",sum(b)-sum(a-)) ;
}
if(sh[] == 'S')
{
scanf("%d %d",&a,&b);
add(a,-b) ;
}
}
}
return ;
}

当时初学时代码太乱,跟崔老师学习了一点,现在重新刷了一遍

 #include <cstdio>
#include <string>
#include <cstring>
#include <iostream> using namespace std ; int p[*],a ;
//string sh ;
char sh[] ;
//void pushdown(int rt, int m)
//{
//
//}
void pushup(int rt)
{
p[rt] = p[rt << ] + p[rt << | ] ;
}
void build(int l,int r,int rt)
{
if(l == r)
{
cin >> a ;
p[rt] = a ;
return ;
}
int mid = (l + r) >> ;
build(l,mid,rt << ) ;
build(mid + , r , rt << | ) ;
pushup(rt) ;
}
void update(int l , int r,int sc,int rt,int flag,int x)
{
if(l == r)
{
if(flag > )
p[rt] += sc ;
else p[rt] -= sc ;
return ;
}
int mid = (l+r) >> ;
if(mid >= x)
update(l,mid,sc,rt << ,flag,x) ;
if(mid < x)
update(mid+,r,sc,rt << | ,flag,x) ;
pushup(rt) ;
}
int query(int L,int R,int l,int r,int rt)
{
int sum = ;
if(l >= L && r <= R)
{
return p[rt] ;
}
int mid = (l+r) >> ;
if(mid >= L)
sum += query(L,R,l,mid,rt << ) ;
if(mid < R)
sum += query(L,R,mid+,r,rt << | ) ;
return sum ;
}
int main()
{
int T,N ,x,y;
// cin >> T ;
scanf("%d",&T) ;
for(int i = ; i <= T ; i++)
{
scanf("%d",&N) ;
build(,N,) ;
printf("Case %d:\n",i) ;
while(~scanf("%s",sh))
{
if(sh[] == 'E')
break ;
// cin >> x >> y ;
scanf("%d %d",&x,&y) ;
if(sh[] == 'Q')
{
int ans = query(x,y,,N,) ;
// cout << ans << endl ;
printf("%d\n",ans) ;
}
else if(sh[] == 'A')
{
update(,N,y,,,x) ;
}
else if(sh[] == 'S')
{
update(,N,y,,-,x) ;
}
}
}
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. android之手动安装apk到模拟器

    一.将apk放到SDK的指定路径 二.打开命令行 三.安装apk到模拟器 此处遇到无法找到主机,解决办法: 发现是进程2512堵塞导致的 进入powershell 查看进程 发现2512进程是360手 ...

  2. [原创]HTML标签总结!! 第一次画 尚需要改进 多关照

    HTML 页面标签总结  拿xMind写了一下午总结的   只能传图片了   CSS明天整理  后天看看能不能传上来 //======================================= ...

  3. MySQL高可用解决方案(MySQL HA Solution)

    http://blog.sina.com.cn/s/blog_7e89c3f501012vtr.html 什么是高可用性?很多公司的服务都是24小时*365天不间断的.比如Call Center.这就 ...

  4. 3 WPF之从0开始学习XMAL

    转载:http://blog.csdn.net/fwj380891124/article/details/8088233   剖析最简单的XMAL代码: <Window x:Class=&quo ...

  5. sql 复习

    创建表 #设置外键 create table example3(id int primary key, stu_id int, course_id int, constraint c_fk forei ...

  6. content = "IE=edge,chrome=1" 详解

    content = "IE=edge,chrome=1" 详解 < meta http-equiv = "X-UA-Compatible" content ...

  7. 使用asp.net上传图片并且裁剪的方法

    工欲善其事,必先利其器,坚持才能更好 这篇文章主要是强调怎么使用asp.net上传图片并且能够裁剪,这个功能主要使用在注册信息的时候需要上传头像并且图片格式很大的时候能够把图片裁剪成更小的图片.下面来 ...

  8. serialize

    Jquery的serialize()方法用于将表单元素转换为查询字符串格式, Submit按钮及File选择元素是不能序列化的. $('input:button').click(function() ...

  9. 12天学好C语言——记录我的C语言学习之路(Day 3)

    12天学好C语言--记录我的C语言学习之路 Day 3: 不知不觉到了第三天的学习,我们前两天学习的东西很杂乱,各个方面都有学习.我觉得这不是不系统,也不是学的不扎实,这种学习对于初学者而言我认为是很 ...

  10. win10 删除资源管理器中的6个文件夹

    细心的朋友会发现,在Win10此电脑(计算机)中,除了我们最熟悉的磁盘外,还新增了视频.图片.文档.下载.音乐.桌面这6个文件夹.不少网友举觉得这6个文件夹其实并没什么用,想要去除删掉.那么Win10 ...