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大--->直接在线段树上二分 某个数第几大--->查询一下 ...
随机推荐
- scrapy爬虫-代理IP中间件
class ProxyDownloaderMiddleware(object): # Not all methods need to be defined. If a method is not de ...
- Java入门教程九(封装继承多态)
封装 封装就是将对象的属性和方法相结合,通过方法将对象的属性和实现细节保护起来,实现对象的属性隐藏.做法就是:修改属性的可见性来限制对属性的访问,并为每个属性创建一对取值(getter)方法和赋值(s ...
- 自己动手用java写一个hashMap
入坑java很多年了,现在总结一下自己学到的东西. 1.首先我们先来聊聊什么是HashMap? 什么是hash?hash用中文的说法就叫做“散列”,通俗的讲就是把任意长度的字符串输入,经过hash计算 ...
- 从头认识js-HTML中使用JavaScript
<script>元素 在HTML页面中插入Javascript的主要办法就是使用<script>元素,HTML4.01为<script>定义了下列6个属性. 1.a ...
- 小程序打开web-view传参数注意事项
通过URL传参数过去的参数值建议使用BASE64 加密后传输 (尤其是值含有 ‘中文’,‘符号’,‘http’ 的内容) 试过使用 encodeURI, encodeURLComment ,es ...
- Ubuntu几秒钟没有任何操作自动黑屏
在鼠标或键盘30秒内没有做任何操作以后,显示器自动黑屏. 重新点击鼠标或键盘,屏幕唤醒. 设置中心各种设置方式都已经尝试过.无效. $xset -q // 执行该命令 Keyboard Control ...
- vue开发路由相关基础知识和笔记
路由实现:hash模式 和 history模式 hash模式: 概述 在浏览器中符号"#",#以及#后面的字符称之为hash,用window.location.hash读取: 特点 ...
- iview中遇到table的坑(已经修改了table的数据,但是界面没有更新)
https://blog.csdn.net/bigdargon/article/details/89381466 https://blog.csdn.net/qiuyan_f/article/deta ...
- 教你高效使用数据可视化BI软件创建医院卫生耗材运营监控大屏
灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件. 本文以医院卫生耗材运营监控大屏 ...
- 2653 区间xor
前言 这个题目在我之前那篇c++位运算的的随笔中提到过. 有兴趣的话去看看吧! 飞机场:https://www.cnblogs.com/laoguantongxiegogofs/p/12444517. ...