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的任务就是要监视 ...
随机推荐
- 轻松学习Ionic (三) 安装sass并在webstorm中为scss添加watcher
1. 安装Ruby 最新为 2.1.5版本,不放心的话安装 Ruby 1.9.3-p551 安装过程中注意勾选上第二项!即将Ruby加入到可执行的环境变量中去. 安装结束后在命令行中 ...
- http请求之referer头与防盗链
在网页中的占用大流量的信息可以写成这个信息在网络上的url位置,这样就会减少本网站的流量,但是其他网站也 不会随意让你使用人家的资源,因为这样的情对人家的网站没有好处,会增加人家网站的流量,所以要防止 ...
- JavaScript - Base64 编码解码
以下代码摘自:http://cryptojs.altervista.org/encoding/Base64.html function base64_encode(str) { if (window. ...
- Ext.Net学习笔记21:Ext.Net FormPanel 字段验证(validation)
Ext.Net学习笔记21:Ext.Net FormPanel 字段验证(validation) 作为表单,字段验证当然是不能少的,今天我们来一起看看Ext.Net FormPanel的字段验证功能. ...
- cocos2d-x实战 C++卷 学习笔记--第4章 使用菜单
前言: 菜单中包含菜单项,菜单项类是 MenuItem ,每个菜单项都有三个基本状态:正常.选中和禁止. (MenuItem)菜单分类: (文本菜单)MenuItemLabel : MenuItemA ...
- wiegand/韦根
韦根 参考: 1.wiegand/韦根驱动
- [cocos2d-x 2.0.4][iOS7]不能全屏问题
本篇文章由:http://www.sollyu.com/cocos2d-x-2-0-4-ios7-cannot-be-full-screen-problem/ 说明 ▼ 症状如下图 解决 打开你工程的 ...
- OpenJudge/Poj 1163 The Triangle
1.链接地址: http://bailian.openjudge.cn/practice/1163 http://poj.org/problem?id=1163 2.题目: 总时间限制: 1000ms ...
- OpenJudge/Poj 1664 放苹果
1.链接地址: http://bailian.openjudge.cn/practice/1664 http://poj.org/problem?id=1664 2.题目: 总时间限制: 1000ms ...
- DataList和Repeater
DataList和Repeater是两个十分有用的控件,在新闻列表和图片展示的地方经常用到.在这里简单的把他们介绍一下. 1.DataList: 前端页面: <asp:DataList ID=& ...