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的任务就是要监视 ...
随机推荐
- 20160503-spring入门1
一.Spring是什么 Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目得是简化企业开发. IOC 控制反转 publ ...
- 解决IllegalStateException: Can not perform this action after onSaveInstanceState:
今天做项目中的支付宝功能,是在fragment中做的,在支付成功后,想切换到支付成功的页面. 结果就报错了IllegalStateException: Can not perform this act ...
- android webview乱码问题
使用 loadData方法是中文部分会出现乱码,即使指定“utf-8”.“gbk”.“gb2312”也一样. webView.getSettings().setDefaultTextEncodingN ...
- 【重叠I/O之系列三】I/O完成端口
一 串行模式和并行模式 一般一个服务应用程序采用以下两个架构模型之一: 串行模式 一个线程等待一个客户发出的请求,当请求到达的时候,线程会被换醒来处理客户的请求. 并发模式.一个线程等待一个客户 ...
- MySql 5.7密码查看或修改
一.启动命令行,输入: taskkill /f /im mysqld.exe //关闭mysql 二.转入mysql的bin目录下 三.输入:mysqld --skip-grant-tables // ...
- Visualsvn Server的搭建
最近做项目在用svn,对svn有个初步了解,今天利用一点时间在本地配置了一个svn的服务端.整个过程分为以下几步: ①下载Visualsvn Server并且进行安装. ②安装好以后,在Visuals ...
- NSDate与 NSString 、long long类型的相互转化
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3560280.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- 九度OJ 1501 最大连续子序列乘积 -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1501 题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 输入: 输入可能包含 ...
- 初识XML及简单工厂运用--网络电视精灵
网络电视精灵 任务描述 1. 解析XML文件中的数据 三个简单的xml文件; <?xml version="1.0" encoding="utf-8" ? ...
- [翻译]log4net教程
原文:log4net Tutorial 一.基础: log4net分为三部分:配置.设置和调用.配置通常是在app.webconfig或web.config文件中:为了增加灵活性,我们也可以使用单独的 ...