题意: 汉语题就不说题意了,用到单点修改和区间查询(树状数组和线段树都可以)

思路:

树状数组的单点查询,单点修改和区间查询。

树状数组是巧妙运用二进制的规律建树,建树就相当于单点修改。这里面用到一个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 树状数组模板(线段树也写了一遍)的更多相关文章

  1. 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 ...

  2. HDU 5877 2016大连网络赛 Weak Pair(树状数组,线段树,动态开点,启发式合并,可持久化线段树)

    Weak Pair Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Tota ...

  3. bzoj3196 二逼平衡树 树状数组套线段树

    题目传送门 思路:树状数组套线段树模板题. 什么是树状数组套线段树,普通的树状数组每个点都是一个权值,而这里的树状数组每个点都是一颗权值线段树,我们用前缀差分的方法求得每个区间的各种信息, 其实关键就 ...

  4. st表、树状数组与线段树 笔记与思路整理

    已更新(2/3):st表.树状数组 st表.树状数组与线段树是三种比较高级的数据结构,大多数操作时间复杂度为O(log n),用来处理一些RMQ问题或类似的数列区间处理问题. 一.ST表(Sparse ...

  5. 2019南昌网络赛  I. Yukino With Subinterval 树状数组套线段树

    I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...

  6. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  7. [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】

    题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...

  8. [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】

    题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...

  9. POJ 1195 Mobile phones (二维树状数组或线段树)

    偶然发现这题还没A掉............速速解决了............. 树状数组和线段树比较下,线段树是在是太冗余了,以后能用树状数组还是尽量用......... #include < ...

  10. 【BZOJ3196】二逼平衡树(树状数组,线段树)

    [BZOJ3196]二逼平衡树(树状数组,线段树) 题面 BZOJ题面 题解 如果不存在区间修改操作: 搞一个权值线段树 区间第K大--->直接在线段树上二分 某个数第几大--->查询一下 ...

随机推荐

  1. scrapy爬虫-代理IP中间件

    class ProxyDownloaderMiddleware(object): # Not all methods need to be defined. If a method is not de ...

  2. Java入门教程九(封装继承多态)

    封装 封装就是将对象的属性和方法相结合,通过方法将对象的属性和实现细节保护起来,实现对象的属性隐藏.做法就是:修改属性的可见性来限制对属性的访问,并为每个属性创建一对取值(getter)方法和赋值(s ...

  3. 自己动手用java写一个hashMap

    入坑java很多年了,现在总结一下自己学到的东西. 1.首先我们先来聊聊什么是HashMap? 什么是hash?hash用中文的说法就叫做“散列”,通俗的讲就是把任意长度的字符串输入,经过hash计算 ...

  4. 从头认识js-HTML中使用JavaScript

    <script>元素 在HTML页面中插入Javascript的主要办法就是使用<script>元素,HTML4.01为<script>定义了下列6个属性. 1.a ...

  5. 小程序打开web-view传参数注意事项

    通过URL传参数过去的参数值建议使用BASE64 加密后传输    (尤其是值含有 ‘中文’,‘符号’,‘http’ 的内容) 试过使用 encodeURI, encodeURLComment ,es ...

  6. Ubuntu几秒钟没有任何操作自动黑屏

    在鼠标或键盘30秒内没有做任何操作以后,显示器自动黑屏. 重新点击鼠标或键盘,屏幕唤醒. 设置中心各种设置方式都已经尝试过.无效. $xset -q // 执行该命令 Keyboard Control ...

  7. vue开发路由相关基础知识和笔记

    路由实现:hash模式 和 history模式 hash模式: 概述 在浏览器中符号"#",#以及#后面的字符称之为hash,用window.location.hash读取: 特点 ...

  8. iview中遇到table的坑(已经修改了table的数据,但是界面没有更新)

    https://blog.csdn.net/bigdargon/article/details/89381466 https://blog.csdn.net/qiuyan_f/article/deta ...

  9. 教你高效使用数据可视化BI软件创建医院卫生耗材运营监控大屏

    灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件.   本文以医院卫生耗材运营监控大屏 ...

  10. 2653 区间xor

    前言 这个题目在我之前那篇c++位运算的的随笔中提到过. 有兴趣的话去看看吧! 飞机场:https://www.cnblogs.com/laoguantongxiegogofs/p/12444517. ...