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大--->直接在线段树上二分 某个数第几大--->查询一下 ...
随机推荐
- VUE实现Studio管理后台(二):Slot实现选项卡tab切换效果,可自由填装内容
作为RXEditor的主界面,Studio UI要使用大量的选项卡TAB切换,我梦想的TAB切换是可以自由填充内容的.可惜自己不会实现,只好在网上搜索一下,就跟现在你做的一样,看看有没有好事者实现了类 ...
- react-intl 实现 React 国际化多语言
效果预览 React Intl 国际化步骤 创建国际化资源文件 根据语言获取国际化资源 引入 react-intl 的 local data 创建 LocaleProvider 国际化上下文组件 创建 ...
- 蚂蚁金服开源 | 可视化图形语法G2 3.3 琢磨
G2 是蚂蚁金服数据可视化解决方案 AntV 的一个子产品,是一套数据驱动的.高交互的可视化图形语法. 经过两个多月密锣紧鼓的开发,400+次提交,G2 3.3版本今天终于和大家见面了.自上次3.2版 ...
- 浏览器内核之 HTML 解释器和 DOM 模型
微信公众号:爱写bugger的阿拉斯加如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 此文章是我最近在看的[WebKit 技术内幕]一书的一些理解和做的笔记.而[WebKit 技术内幕]是基 ...
- flask之三:视图高级
视图高级 app.route和app.add_url_rule app.add_url_rule app.add_url_rule('/list/',endpoint='myweb',view_fun ...
- js中所有函数的参数(按值和按引用)都是按值传递的,怎么理解?
我觉着我可能对这块有点误解,所以单独开个博说下自己的理解,当然是研究后的正解了. 1,参数传递是基本类型,看个例子: function addTen(num){ num += 10; return n ...
- java 发送邮件详细讲解
一.JavaMail概述: JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类.但它并没有包含在JDK中,而是作为JavaEE的一部分. 厂商所提供 ...
- seo搜索优化教程14-seo搜索优化实战
为了使大家更方便的了解及学习网络营销推广.seo搜索优化,星辉信息科技强势推出seo搜索优化教程.此为seo教程第14课 根据前面学习的seo搜索优化内容,星辉科技进行总结性的分析,形成一份标准的se ...
- 你知道吗,Flutter内置了10多种Button控件
注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 Flutter内置了10多种Button(按钮)类控件供我 ...
- django 用户认证 user对象
django中的用户模型 内部带有很多的属性方法,我们可以直接使用 1 is_staff Boolean.决定用户是否可以访问admin管理界面.默认False. 2 is_active Boolea ...