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大--->直接在线段树上二分 某个数第几大--->查询一下 ...
随机推荐
- shell 之 case。。。esac多分支选择
case分支属于匹配执行的方式,它针对指定的变量预先设置一个可能的取值,判断该变量的实际取值是否与预设的某一个值相匹配,如果匹配上了,就执行相应的一组操作,如果没有任何值能够匹配,就执行预先设置的默认 ...
- VUE实现Studio管理后台(二):Slot实现选项卡tab切换效果,可自由填装内容
作为RXEditor的主界面,Studio UI要使用大量的选项卡TAB切换,我梦想的TAB切换是可以自由填充内容的.可惜自己不会实现,只好在网上搜索一下,就跟现在你做的一样,看看有没有好事者实现了类 ...
- 进阶之路 | 奇妙的Handler之旅
前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 需要已经具备的知识: Handler的基本概念及使用 学习导图: 一.为什么要学习Handler? 在Andr ...
- 7-6 jmu_python_最大公约数&最小公倍数 (10 分)
本题要求从键盘输入两个整数(以逗号间隔),编程求出这两个数的最大公约数和最小公倍数 提示:求最大公约数可用辗转相除法,最小公倍数用两数的积除以最大公约数 输入格式: 在一行中输入两个整数,以逗号间隔 ...
- czC#01
1. .net简介: .net分为.net平台及.net Framework 2..NET作用 2.转义与@ 3.类型转换 1) 隐式转换 2)显式类型转换 (待转换的目标类型)原始值
- Canvas 使用及应用
Canvas canvas 是 HTML5 当中我最喜欢的所有新特性中我最喜欢的一个标签了.因为它太强大了,各种有意思的特效都可以实现. 1. canvas 的基本使用方法 - 它是一个行内块元素 - ...
- XML学习笔记--背诵版
前言 一直想系统性的学XML,就没时间学,今晚抽出几个小时时间学完了XML.过几天再过来看看,背一背应该就差不多,记得东西较多,没什么难理解的. XML数据传输格式 第一章 XML概述 1.1 引入 ...
- Oracle根据实体类比对2个数据库结构差异(demo)
源起 在公司做项目时 经常出现 实体结构和线上的数据结构以及公司开发库数据结构不匹配的问题 但是又不能直接把开发库导入到生产库因为生产库已经有实际数据了 所以弄了一个小工具 此处只做记录用 demo级 ...
- Java并发编程(02):线程核心机制,基础概念扩展
本文源码:GitHub·点这里 || GitEE·点这里 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效 ...
- mysql实现读写分离
MySQL读写分离概述 1.读写分离介绍 对于目前单机运行MySQL服务.会导致MySQL连接数过多.最终导致mysql的宕机.因此可以使用多台MySQL服务器一起承担压力.考虑到项目中读写比例的不一 ...