HDU 1166 敌兵布阵(线段树 单点更新)
题意 :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 敌兵布阵(线段树 单点更新)的更多相关文章
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- HDU 1166 敌兵布阵(线段树单点更新,板子题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1166 敌兵布阵(线段树单点更新)
敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...
- HDU 1166 敌兵布阵(线段树单点更新,区间查询)
描述 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况 ...
- HDU 1166 敌兵布阵 线段树单点更新求和
题目链接 中文题,线段树入门题,单点更新求和,建一棵树就可以了. #include <iostream> #include <cstdio> #include <cmat ...
- 【原创】hdu 1166 敌兵布阵(线段树→单点更新,区间查询)
学习线段树的第三天...真的是没学点啥好的,又是一道水题,纯模板,我个人觉得我的线段树模板还是不错的(毕竟我第一天相当于啥都没学...找了一整天模板,对比了好几个,终于找到了自己喜欢的类型),中文题目 ...
- hdu 1166 敌兵布阵 线段树 点更新
// hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...
- HDU 1166 敌兵布阵 <线段树 单点修改 区间查询>
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 1754 线段树 单点跟新 HDU 1166 敌兵布阵 线段树 区间求和
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 1166 敌兵布阵 线段树区间修改、查询、单点修改 板子题
题目链接:敌兵布阵 题目: C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视 ...
随机推荐
- 第六章 jQuery操作表单
1.单行文本框的应用 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// ...
- hiveserver2 后台运行
启动hivemetastore hive --service metastore 启动hiveserver2 hive --service hiveserver2 beeline !conne ...
- apache http server 多线程模式
一般apache采用prefork和worker机制,通过apachectl -l命令查看默认使用的prefork机制.需要修改prefork策略 那么需要做如下修改: 1,/usr/local/ap ...
- unity发布ios游戏总结
自己做了几个ios的小游戏,因此总结了一点经验 判断按钮要用unity里面的button不要用OnMouseDown()之类的函数,否则拒绝原因为缺少ios特征 排行榜之类的本地存储数据,不要用本地本 ...
- There is no Action mapped for namespace [/] and action name [user] associated with context path
从c++转到java,初学struts,竟然碰到一个因写错单词而造成的错误,structs --> struts
- 清橙 A1120 拦截导弹 -- 动态规划(最长上升子序列)
题目地址:http://oj.tsinsen.com/A1120 问题描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但 ...
- linux系统使用密钥登录设置
使用密钥登录linux的操作步骤(使用putty): 1.用putty远程登录linux服务器,然后使用puttygen生成密钥,将生成的密钥保存,保存私钥将公钥复制保存到linux服务器的autho ...
- jtemplate使用笔记
最近的项目中用到了jtemplate, 它是客户端基于javascript的模板引擎,绑定的数据为json对象.以前我在页面上显示数据列表时最喜欢用Repeater控件了,因为它相对与其它几个服务端控 ...
- php导出word(可包含图片)
为大家介绍一个 php 生成 导出word(可包含图片)的代码,有需要的朋友可以参考下. 之前介绍过php生成word的例子,只是不能包含图片与链接. 今天 为大家介绍一个 php 生成 导出word ...
- C#中的==、Equal、ReferenceEqual(转载)
1. ReferenceEquals, == , Equals Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不是相等. a) ReferenceEquals ...