HDU - 1166 树状数组模板(线段树也写了一遍)
题意: 汉语题就不说题意了,用到单点修改和区间查询(树状数组和线段树都可以)
思路:
树状数组的单点查询,单点修改和区间查询。
树状数组是巧妙运用二进制的规律建树,建树就相当于单点修改。这里面用到一个lowbit的概念,将数的下标转化为二进制。找到值为1的最低位。前面的数舍去,判断这个数为几,那么这个数组的当前下标储存的值从这个下标开始往前的前几项和。
不是特别懂,先拿来用了
在树状数组里面求区间和,并不能直接求到,需要求两个区间之间的差。
树状数组:
#include<stdio.h>
#include<string.h>
int t,n,m,a[500010],c[500010];
int lowbit(int x)
{
return x&(-x);
}
void update(int i,int k)//单点修改 加 树状数组初始化
{
int j=i;
while(j<=n)
{
c[j]+=k;
j+=lowbit(j);
}
}
int query(int l)//区间查询
{
int i=l,sum=0;
while(i>0)
{
sum+=c[i];
i-=lowbit(i);
}
return sum;
}
int main()
{
char s[100];
int z=1;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
update(i,a[i]);//建立树状数组
}
// printf("\n_______________\n");
// for(int i=1;i<=n;i++)
// printf("%d ",c[i]);
// printf("\n_______________\n");
int t1,t2,t3;
printf("Case %d:\n",z++);
while(1)
{
scanf("%s",s);
if(s[0]=='E')
break;
if(s[0]=='Q')
{
scanf("%d%d",&t1,&t2);
printf("%d\n",query(t2)-query(t1-1));
}
if(s[0]=='S')
{
scanf("%d%d",&t1,&t2);
update(t1,t2*-1);
}
if(s[0]=='A')
{
scanf("%d%d",&t1,&t2);
update(t1,t2);
}
}
}
return 0;
}
线段树:
#include<stdio.h>
#include<string.h>
int sum[300010];
void build(int l,int r,int o)
{
if(lr)
{
scanf("%d",&sum[o]);
return ;
}
int mid=(l+r)>>1;
build(l,mid,o<<1);
build(mid+1,r,o<<1|1);
sum[o]=sum[o<<1]+sum[o<<1|1];
}
int query(int x,int y,int l,int r,int o)
{
if(x<=l&&y>=r)
return sum[o];
int mid=(l+r)>>1;
int sum=0;
if(x<=mid) sum+=query(x,y,l,mid,o<<1);
if(y>mid) sum+=query(x,y,mid+1,r,o<<1|1);
return sum;
}
void update(int x,int y,int c,int l,int r,int o,int p)
{
if(xl&&yr)
{
if(p1)
sum[o]+=c;
else
sum[o]-=c;
return;
}
int mid=(l+r)>>1;
if(x<=mid) update(x,y,c,l,mid,o<<1,p);
if(y>mid) update(x,y,c,mid+1,r,o<<1|1,p);
sum[o]=sum[o<<1]+sum[o<<1|1];
}
int main()
{
int t,n,t1,t2,t3,z=1;
char a[101];
scanf("%d",&t);
while(t–)
{
printf(“Case %d:\n”,z++);
memset(sum,0,sizeof(sum));
scanf("%d",&n);
build(1,n,1);
while(1)
{
scanf("%s",a);
if(a[0]‘E’)
break;
if(a[0]‘Q’)
{
scanf("%d%d",&t1,&t2);
printf("%d\n",query(t1,t2,1,n,1));
}
if(a[0]‘A’)
{
scanf("%d%d",&t1,&t2);
update(t1,t1,t2,1,n,1,1);
}
if(a[0]‘S’)
{
scanf("%d%d",&t1,&t2);
update(t1,t1,t2,1,n,1,0);
}
}
}
return 0;
}
HDU - 1166 树状数组模板(线段树也写了一遍)的更多相关文章
- HDU 5618 Jam's problem again(三维偏序,CDQ分治,树状数组,线段树)
Jam's problem again Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Tota ...
- bzoj3196 二逼平衡树 树状数组套线段树
题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...
- st表、树状数组与线段树 笔记与思路整理
已更新(2/3):st表.树状数组 st表.树状数组与线段树是三种比较高级的数据结构,大多数操作时间复杂度为O(log n),用来处理一些RMQ问题或类似的数列区间处理问题. 一.ST表(Sparse ...
- 2019南昌网络赛 I. Yukino With Subinterval 树状数组套线段树
I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】
题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...
- [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】
题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...
- POJ 1195 Mobile phones (二维树状数组或线段树)
偶然发现这题还没A掉............速速解决了............. 树状数组和线段树比较下,线段树是在是太冗余了,以后能用树状数组还是尽量用......... #include < ...
- 【BZOJ3196】二逼平衡树(树状数组,线段树)
[BZOJ3196]二逼平衡树(树状数组,线段树) 题面 BZOJ题面 题解 如果不存在区间修改操作: 搞一个权值线段树 区间第K大--->直接在线段树上二分 某个数第几大--->查询一下 ...
随机推荐
- 【Mood】在COVID-19疫情中
看完网课(这还得从一只蝙蝠说起...),本来准备刷几道题. 还是来记录下这次事件吧. 2月1号,病毒感染人数破万. 接下来4天(今日6号)疫情走向爆发期. 每日平均新增发病人数达到了3000~4000 ...
- html+css布局类型
一.单列布局 1.代码如下 <!doctype html> <html> <head> <meta charset="utf-8"/> ...
- psql的时间类型,通过时间查询
psql的时间类型,通过时间查询 psql有date/timestamp类型,date只显示年月日1999-01-08,而timestamp显示年月日时分秒 1999-01-08 09:54:03.2 ...
- 简说Python之IO
闺女,你在玩电脑什么游戏? 爸爸,我在玩植物大战僵尸呢. 闺女,你知道什么是输入输出设备吗? 爸爸,??? 你看,咱们的键盘和鼠标 ,就是可以控制那些植物的工具.这些发出指令的就是输入设备.咱们可以用 ...
- JavaScript 预编译与作用域
JavaScript 预编译与作用域 JavaScript 预编译的过程和作用域的分析步骤是 JS 学习中重要的一环,能够帮助我们知道代码的执行顺序,更好理解闭包的概念 预编译 JavaScript ...
- 服务发现组件之 — Eureka
前言 现在流行的微服务体系结构正在改变我们构建应用程序的方式,从单一的单体服务转变为越来越小的可单独部署的服务(称为微服务),共同构成了我们的应用程序.当进行一个业务时不可避免就会存在多个服务之间调用 ...
- 【Python】2.17学习笔记 移位运算符,逻辑运算符
移位运算符 左移运算符 \(<<\),将对应的二进制数末尾补一颗零,高位自然溢出(遁入虚无 print( 5 << 2 ) 把\(5\)的二进制数左移两位 即把\(101\)变 ...
- 爬虫 | cnblog文章收藏排行榜(“热门文摘”)
目录 需要用的module 单页测试 批量抓取 数据保存 背景说明 因为加入cnblog不久,发现上面有很多优秀的文章. 无意中发现cnblog有整理文章的收藏排行榜,也就是热门文摘. 不过有点坑的是 ...
- Android 开发技术周报 Issue#273
新闻/News Android 11有新玩法:双击手机背部截屏/进入多任务界面 Android 11 DP2证实了类似AirDrop的附近文件分享功能 谷歌发布Camera Go:即使入门机也能有出色 ...
- 从发布订阅模式入手读懂Node.js的EventEmitter源码
前面一篇文章setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop详细讲解了浏览器和Node.js的异步API及其底层原理Event Loop.本文会讲一下不 ...