hdu 1166 线段树 奇兵布阵
#include<iostream>
using namespace std;
const int MAX=;
int tree[(MAX+)*];//n个叶子就有2*n-4*n个节点
int a[MAX+];
int n;
void getup(int root){
return void(tree[root]=tree[root*]+tree[root*+]);//两个孩子分别是root*2 和root*2+1
}
void btree(int l,int r,int root){//建树
if(l==r){
tree[root]=a[l];
return ;
}
int mid=(l+r)>>;
btree(l,mid,root*);
btree(mid+,r,root*+);//因为向下取整 mid必须加一 不然结束不了
getup(root);
}
int myquery(int l,int r,int L,int R,int root){//整个的思想是区间和肯定可以用二分的区间表示
if(l<=L&&r>=R) return tree[root];
int mid=(L+R)>>;
long long sum=;
if(l<=mid) sum+=myquery(l,r,L,mid,root*);//两边相加
if(r>mid) sum+=myquery(l,r,mid+,R,root*+);
return sum;
}
void add(int i,int value,int l,int r,int root){//重点!! 更新的过程
if(l==r) {tree[root]+=value;return ;}
int mid=(l+r)>>;
if(i<=mid) add(i,value,l,mid,root*);
else add(i,value,mid+,r,root*+);
getup(root);
}
int main(){
int t;
cin>>t;
int i=;
while(i<=t){
int flag=;
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
btree(,n,);
char ss[];
while(~scanf("%s",ss)){
if(ss[]=='A'){
int i,value;
scanf("%d %d",&i,&value);
add(i,value,,n,);
}
if(ss[]=='S'){
int i,value;
scanf("%d %d",&i,&value);
add(i,-*value,,n,);
}
if(ss[]=='Q'){
int a ,b;
scanf("%d%d",&a,&b);
if(flag){printf("Case %d:\n",i);flag=;}
printf("%d\n",myquery(a,b,,n,));
}
if(ss[]=='E') break;
}
i++;
}
}
题目链接:acm.hdu.edu.cn/status.php?user=YZBPXX&pid=1166&status=5
hdu 1166 线段树 奇兵布阵的更多相关文章
- 敌兵布阵 HDU 1166 线段树
敌兵布阵 HDU 1166 线段树 题意 这个题是用中文来描写的,很简单,没什么弯. 解题思路 这个题肯定就是用线段树来做了,不过当时想了一下可不可用差分来做,因为不熟练就还是用了线段树来做,几乎就是 ...
- hdu 1166 线段树(sum+单点修改)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- A - 敌兵布阵 HDU - 1166 线段树(多点修改当单点修改)
线段树板子题练手用 #include<cstdio> using namespace std; ; int a[maxn],n; struct Node{ int l,r; long lo ...
- HDU(1166),线段树模板,单点更新,区间总和
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 第一次做线段树,帆哥的一句话,我记下来了,其实,线段树就是一种处理数据查询和更新的手段. 然后, ...
- hdu 1166线段树 单点更新 区间求和
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 1166 线段树单点更新
等线段树复习完再做个总结 1101 2 3 4 5 6 7 8 9 10Query 1 3Add 3 6Query 2 7Sub 10 2Add 6 3Query 3 10End Case 1:633 ...
- hdu 1166 线段树(单点增减 区间求和)
Sample Input1101 2 3 4 5 6 7 8 9 10Query 1 3Add 3 6Query 2 7Sub 10 2Add 6 3Query 3 10End Sample Outp ...
- HDU 1166 线段树模板&树状数组模板
HDU1166 上好的线段树模板&&树状数组模板 自己写的第一棵线段树&第一棵树状数组 莫名的兴奋 线段树: #include <cstdio> using nam ...
- hdu 1166 线段树 区间求和 +单点更新 CD模板
题目链接 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
随机推荐
- Laravel 实现多级控制器(实现Api区分版本)
路由: Route::get('', 'v1\\UserController@index'); 文件夹分层 User控制器命名空间: namespace App\Http\Controllers\v1 ...
- 向PHP发送HTTP-Post请求
欢迎访问我的个人博客,获取更多有用的东西 链接一 链接二 也可以关注我的微信订阅号:CN丶Moti 1.post.html <!DOCTYPE html> <html lang=&q ...
- 仍然有人在叫喊C语言已经过时了
现在,仍然有人在叫喊C语言已经过时了.还有什么值得学习的?看看现在使用Python.PHP和其他语言有多简单.谁去学旧的C语言?是真的吗?作者下载了这两种语言的底层源代码.由于空间的限制,它没有分析框 ...
- SSM框架中的Mapper.xml文件中的增、删、改、查等操作
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...
- django orm 数据查询详解
一 在django里面创建模型 from django.db import models class Blog(models.Model): name = models.CharField(max_l ...
- MySQL计算两个日期相差的天数、月数、年数
MySQL自带的日期函数TIMESTAMPDIFF计算两个日期相差的秒数.分钟数.小时数.天数.周数.季度数.月数.年数,当前日期增加或者减少一天.一周等等. SELECT TIMESTAMPDIFF ...
- 【转】container_of宏 分析
在学习Linux驱动的过程中,遇到一个宏叫做container_of.该宏定义在include/linux/kernel.h中,首先来贴出它的代码: /** * container_of - cast ...
- 9月24日开始发布,主打安全的Librem 5 Linux手机
曾推出搭载PureOS Linux发行版本Librem笔记本系列的硬件厂商Purism,今天正式宣布了Librem 5 Linux手机的最终和官方发售日期.Librem 5于2017年10月正式发布, ...
- python文件操作:文件处理案例
储存一个文件,文件上有多个用户名,密码,做一个认证的流程程序,首先创建一个文件,文件上输入多个用户名,及对应的密码,然后让客户输入用户名和密码,进行用户名和密码核对,如果输入正确,则的认证成功,bre ...
- js实现购物车数量的增加与减少,js实现购物车数量的自增与自减
js实现购物车数量的增加与减少,js实现购物车数量的自增与自减 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E ...