数列的单点修改、区间求和

树状数组或线段树入门题

 #include<stdio.h>
#include<string.h> int c[],N; void add(int x,int a){
while(x<=N){
c[x]+=a;
x+=(x&-x);
}
return;
} int sum(int x){
int t=;
while(x){
t+=c[x];
x-=(x&-x);
}
return t;
} int main(){
int T;
while(scanf("%d",&T)!=EOF){
for(int q=;q<=T;q++){
printf("Case %d:\n",q);
memset(c,,sizeof(c));
scanf("%d",&N);
int i,t;
for(i=;i<=N;i++){
scanf("%d",&t);
add(i,t);
}
char s[];
while(scanf("%s",s)){
// printf("%s\n",s);
if(s[]=='S'){
scanf("%d%d",&i,&t);
add(i,-t);
}
else if(s[]=='A'){
scanf("%d%d",&i,&t);
add(i,t);
}
else if(s[]=='Q'){
scanf("%d%d",&i,&t);
printf("%d\n",sum(t)-sum(i-));
}
else if(s[]=='E')break;
}
}
}
return ;
}

树状数组

 #include<stdio.h>
#include<string.h>
const int maxm=; char s[];
int a[maxm],st[maxm<<]; void build(int o,int l,int r){
if(l==r){
st[o]=a[l];
return;
}
int m=l+((r-l)>>);
build(o<<,l,m);
build(o<<|,m+,r);
st[o]=st[o<<]+st[o<<|];
} void update(int o,int l,int r,int x,int c){
if(l==r){
st[o]+=c;
return;
}
int m=l+((r-l)>>);
if(x<=m)update(o<<,l,m,x,c);
if(x>=m+)update(o<<|,m+,r,x,c);
st[o]=st[o<<]+st[o<<|];
} int query(int o,int l,int r,int ql,int qr){
if(ql<=l&&qr>=r)return st[o];
int m=l+((r-l)>>);
int ans=;
if(ql<=m)ans+=query(o<<,l,m,ql,qr);
if(qr>=m+)ans+=query(o<<|,m+,r,ql,qr);
return ans;
} int read(){
int x=;
char c=getchar();
while(c>''||c<'')c=getchar();
while(c>=''&&c<=''){
x=x*+c-'';
c=getchar();
}
return x;
} int main(){
int T=read();
for(int q=;q<=T;q++){
int n=read();
int i;
for(i=;i<=n;i++)a[i]=read();
build(,,n);
printf("Case %d:\n",q);
while(){
scanf("%s",s);
if(s[]=='Q'){
int ql=read();
int qr=read();
printf("%d\n",query(,,n,ql,qr));
}
else if(s[]=='A'){
int x=read();
int c=read();
update(,,n,x,c);
}
else if(s[]=='S'){
int x=read();
int c=read();
update(,,n,x,-c);
}
else if(s[]=='E')break;
}
}
return ;
}

线段树

hdu1166 敌兵布阵 树状数组/线段树的更多相关文章

  1. hdu1166敌兵布阵&&hdu1754I Hate It(线段树入门)

    单点更新是最最基础的线段树,只更新叶子节点,然后把信息用pushup这个函数更新上来. http://acm.hdu.edu.cn/showproblem.php?pid=1166 update单点更 ...

  2. 洛谷P2414 阿狸的打字机 [NOI2011] AC自动机+树状数组/线段树

    正解:AC自动机+树状数组/线段树 解题报告: 传送门! 这道题,首先想到暴力思路还是不难的,首先看到y有那么多个,菜鸡如我还不怎么会可持久化之类的,那就直接排个序什么的然后按顺序做就好,这样听说有7 ...

  3. 树状数组 && 线段树应用 -- 求逆序数

    参考:算法学习(二)——树状数组求逆序数 .线段树或树状数组求逆序数(附例题) 应用树状数组 || 线段树求逆序数是一种很巧妙的技巧,这个技巧的关键在于如何把原来单纯的求区间和操作转换为 求小于等于a ...

  4. hdu1394(枚举/树状数组/线段树单点更新&区间求和)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题意:给出一个循环数组,求其逆序对最少为多少: 思路:对于逆序对: 交换两个相邻数,逆序数 +1 ...

  5. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. hdu 5147 Sequence II【树状数组/线段树】

    Sequence IITime Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...

  7. HDU - 1166 敌兵布阵 方法一:(线段树+单点修改,区间查询和) 方法二:利用树状数组

    C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...

  8. hdu 1166 敌兵布阵——(区间和)树状数组/线段树

    pid=1166">here:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Input 第一行一个整数T.表示有T组数据. 每组数据第一 ...

  9. HDU 1166 敌兵布阵 树状数组||线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=1166 题目大意: 给定n个数的区间N<=50000,还有Q个询问(Q<=40000)求区间和. 每个 ...

随机推荐

  1. Python -- Json 数据编码及解析

    Python  --  Json  数据编码及解析 Json 简单介绍 JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本 ...

  2. 使用mothur进行OTU聚类

    微生物16S的OTU聚类工具有很多,最常用的就是 usearch.cdhit-OTU.mothur. 这些工具大多都是针对二代测序平台的,usearch的64bit版本是收费的. 如果要跑PacBio ...

  3. WPF 的 数据源属性 和 数据源

    (一)数据源(数据对象)属性 :path 或  path的值(path=VM.Property或M.Property),通常具有通知功能(特例除外). (二)path不能孤立而存在,它一定具有所归属的 ...

  4. 4-12 如何搜索API

    遇到一个参数prompt,使用rails ,API没有找到,怎么办? site关键字 在全网搜索 或者google一下,或是在stack overflow 上找答案 prompt 是FormOptio ...

  5. python-day8-元组的内置方法

    #为何要有元组,存放多个值,元组不可变,更多的是用来做查询# t=(1,[1,3],'sss',(1,2)) #t=tuple((1,[1,3],'sss',(1,2)))# print(type(t ...

  6. SqlDataReader的用法

    datareader对象提供只读单向数据的快速传递,单向:您只能依次读取下一条数据;只读:DataReader中的数据是只读的,不能修改;相对地,DataSet中的数据可以任意读取和修改 01.usi ...

  7. 决策树ID3算法实现

    决策树的ID3算法基于信息增益来选择最优特征,于是自己实现了一把,直接上代码. """ CreateTime : 2019/3/3 22:19 Author : X Fi ...

  8. postgresql数据库常用命令

    --获取数据库软件版本select version();--获取数据库启动时间select pg_postmaster_start_time();--获取配置文件最近load时间select pg_c ...

  9. 微信access_token全局缓存,处理过期

    //PHP创建access_token.json文件,将access_token 和 生成时间expires 保存在其中, //{"access_token":"xxxx ...

  10. 我所理解的event loop

    灵魂三问 JS为什么是单线程的 我们都知道,JS是单线程的语言,那为什么呢?我的理解是JS设计之初就是为了在浏览器端完成DOM操作和一些简单交互的,既然涉及到DOM操作如果是多线程就会带来复杂的同步问 ...