uva 12086 线段树or树状数组练习
题目链接 https://vjudge.net/problem/34215/origin
这个题就是线段树裸题,有两种操作,实现单点更新和区间和的查找即可,这里第一次学习使用树状数组完成。
二者相比,BIT无论从时间,空间还是代码量考虑都要优于ST,所以遇见这种求解区间和的操作考虑使用BIT。
/*线段树 250 ms*/ #include<bits/stdc++.h>
using namespace std;
#define M ((L+R)>>1)
#define lc (id<<1)
#define rc ((id<<1)|1)
int sumv[(<<)+];
void build(int L,int R,int id)
{
if(L==R){scanf("%d",&sumv[id]);return;}
build(L,M,lc);
build(M+,R,rc);
sumv[id]=sumv[lc]+sumv[rc];
}
void update(int L,int R,int id,int x,int y)
{
if(L==R) {sumv[id]=y;return;}
if(x<=M)update(L,M,lc,x,y);
else update(M+,R,rc,x,y);
sumv[id]=sumv[lc]+sumv[rc];
}
int ask(int L,int R,int id,int l,int r)
{
if(L>=l&&R<=r) {return sumv[id];}
if(r<=M) return ask(L,M,lc,l,r);
else if(l>M) return ask(M+,R,rc,l,r);
else return ask(L,M,lc,l,r)+ask(M+,R,rc,l,r);
}
int main()
{
int N,i,j,x,y,k=;
char s[];
while(cin>>N&&N){
build(,N,);
if(k>) puts("");
printf("Case %d:\n",++k);
while(scanf("%s",s)!=EOF){
if(!strcmp(s,"END")) break;
scanf("%d%d",&x,&y);
if(!strcmp(s,"M")) printf("%d\n",ask(,N,,x,y));
else update(,N,,x,y);
}
}
return ;
} /*树状数组 180ms */ #include<bits/stdc++.h>
using namespace std;
int sumv[+],n;
int a[+];
int lowbit(int x){return x&-x;}
int sum(int x)
{
int ret=;
while(x>){
ret+=sumv[x];
x-=lowbit(x);
}
return ret;
}
void add(int x,int d)
{
while(x<=n){
sumv[x]+=d;
x+=lowbit(x);
}
}
int main()
{
int k=;
while(scanf("%d",&n)!=EOF&&n){memset(sumv,,sizeof(sumv));
for(int i=;i<=n;++i){
int x;
scanf("%d",&x);
a[i]=x;
add(i,x);
}
char s[];
if(k>) puts("");
printf("Case %d:\n",++k);
while(scanf("%s",s)!=EOF){
if(!strcmp(s,"END")) break;
int x,y;
scanf("%d%d",&x,&y);
if(s[]=='M'){
printf("%d\n",sum(y)-sum(x-));
}
else{
add(x,y-a[x]);
a[x]=y;
}
}
}
return ;
}
uva 12086 线段树or树状数组练习的更多相关文章
- BZOJ2120:数颜色(数状数组套主席树)(带修改的莫对)
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P ...
- 5.15 牛客挑战赛40 E 小V和gcd树 树链剖分 主席树 树状数组 根号分治
LINK:小V和gcd树 时限是8s 所以当时好多nq的暴力都能跑过. 考虑每次询问暴力 跳父亲 这样是nq的 4e8左右 随便过. 不过每次跳到某个点的时候需要得到边权 如果直接暴力gcd的话 nq ...
- Permutation UVA - 11525(值域树状数组,树状数组区间第k大(离线),log方,log)(值域线段树第k大)
Permutation UVA - 11525 看康托展开 题目给出的式子(n=s[1]*(k-1)!+s[2]*(k-2)!+...+s[k]*0!)非常像逆康托展开(将n个数的所有排列按字典序排序 ...
- UVA 11990 ”Dynamic“ Inversion(线段树+树状数组)
[题目链接] UVA11990 [题目大意] 给出一个数列,每次删去一个数,求一个数删去之前整个数列的逆序对数. [题解] 一开始可以用树状数组统计出现的逆序对数量 对于每个删去的数,我们可以用线段树 ...
- uva 12086 树状数组
树状数组 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> #i ...
- [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- UVA 1513 Movie collection (树状数组+反向存储)
题意:给你n盘歌碟按照(1....n)从上到下放,接着m个询问,每一次拿出x碟,输出x上方有多少碟并将此碟放到开头 直接想其实就是一线段的区间更新,单点求值,但是根据题意我们可以这样想 首先我们倒着存 ...
- HDU 1556 线段树或树状数组,插段求点
1.HDU 1556 Color the ball 区间更新,单点查询 2.题意:n个气球,每次给(a,b)区间的气球涂一次色,问最后每个气球各涂了几次. (1)树状数组 总结:树状数组是一个查 ...
- HDU 3966 Aragorn's Story 树链剖分+树状数组 或 树链剖分+线段树
HDU 3966 Aragorn's Story 先把树剖成链,然后用树状数组维护: 讲真,研究了好久,还是没明白 树状数组这样实现"区间更新+单点查询"的原理... 神奇... ...
随机推荐
- index full scan和index fast full scan区别
触发条件:只需要从索引中就可以取出所需要的结果集,此时就会走索引全扫描 Full Index Scan 按照数据的逻辑顺序读取数据块,会发生单块读事件, Fast Full Index Scan ...
- undefined reference to _imp__xmlFree
Re: [xml] MSYS and MINGW: undefined reference to _imp__xmlFree From: Mike Peat <mpeat unicorninte ...
- php等守护进程监控脚本(转载 http://www.9958.pw/post/php_script_scan)
此脚本用户守护监控进程的执行情况,因为有的时候,我们用各类开发语言做的守护进程可能会因为一些特殊情况被退出,所以此脚本就是为了重启这些进程 代码: #!/bin/bash EMAIL='9958_pw ...
- java 并发——内置锁
坚持学习,总会有一些不一样的东西. 一.由单例模式引入 引用一下百度百科的定义-- 线程安全是多线程编程时的计算机程序代码中的一个概念.在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同 ...
- Jenkins--持续集成服务器
1.持续集成: 1.1概念 持续集成,Continuous integration ,简称CI. 集成:我们所有项目的代码都是托管在SVN服务器上.每个项目都要有若干个单元测试,并有一个所谓集成测试. ...
- hash值是啥,单页面应用的实质
1.什么hash Location hash属性,http://www.runoob.com/jsref/prop-loc-hash.html,hash 属性是一个可读可写的字符串,该字符串是 URL ...
- 端口状态说明 LISTENING、ESTABLISHED、TIME_WAIT及CLOSE_WAIT
TCP状态转移要点 TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放.网络服务器程序要同时 ...
- oracle lpad 函数使用介绍
函数介绍 lpad函数从左边对字符串使用指定的字符进行填充.从其字面意思也可以理解,l是left的简写,pad是填充的意思,所以lpad就是从左边填充的意思. 语法格式如下: lpad( string ...
- Uninstalling JIRA applications from Linux
If you wish to re-install JIRA in 'unattended mode', do not uninstall your previous installation of ...
- 使用sql语句创建 表空间 和用户,以及如何彻底删除表空间和用户,使用命令导出和导出数据库
创建表空间有很多种方式,在安装好oracle 11g 后在网站上 https://localhost:1158/em 手动创建也可以,但是没有sql直接生成方便,下面介绍下如何用sql语句直接生成表空 ...