VIJOS-P1320 清点人数
JDOJ 1427: VIJOS-P1320 清点人数
Description
初始时,火车上没有学生;当同学们开始上火车时,年级主任从第一节车厢出发走到最后一节车厢,每节车厢随时都有可能有同学上下。年级主任走到第m节车厢时,他想知道第1到m这m节车厢上一共有多少学生,但是他没有调头往回走的习惯.也就是说每次当他提问时,m总会比前一次大。
Input
第一行两个整数n,k,表示火车共有n节车厢以及k个事件。接下来有k行,按时间先后给出k个事件,每行开头都有一个字母A,B或C,如果字母为A,接下来是一个数m,表示年级主任现在在第m节车厢;如果为B,接下来两个数m,p,表示在第m节车厢有p名学生上车;如果为C,接下来两个数m,p,表示在第m节车厢有p名学生下车。学生总人数不会超过100000。
Output
有多少个A就输出多少行,每行一个整数,回答年级主任提出的问题。
Sample Input
10 7 A 1 B 1 1 B 3 1 B 4 1 A 2 A 3 A 10
Sample Output
0 1 2 3
HINT
注意:对于30%的数据,n< =10000,k< =10000 至少有3000个A 对于100%的数据n< =500000,k< =100000. 至少有30000个A
题解:
树状数组模板题。
因为这是本蒟蒻A掉的第一道树状数组的题目,所以在这里索性介绍一下树状数组。
树状数组其实是一种数据结构,它的作用就是优化查询和修改的操作。试想,我们假如在做一道题的时候使用裸的一维数组来存储数据,那每次区间修改需要O(1)的时间,但查询却需要O(n)的时间,针对于某些题目“比如本题”,必然会TLE。所以我们使用树状数组来优化这两个操作,使得修改和查询均可以在O(logn)的时间内完成,提升效率。

(这是百度百科上树状数组的图)
可以直观地看出树状数组是个什么模式,是的,这就是一棵树,而这棵树上每个节点存储的数据就是它所有儿子节点的数据和。所以我们就可以在树上做修改和区间查询(节点减节点),来做到树状数组的优化。
树状数组的实现需要三个特别重要的函数,我一般把它们写成fix()(向上修改),getsum()(向下查询),和lowbit()(这个函数是理解树状数组运行过程的关键)。
首先从最关键的lowbit函数入手。
它长这个样子:
int lowbit(int x)
{
return x+=x&-x;
}
这里还涉及到了位运算的相关知识,这里我不想加以叙述,对其感兴趣的小伙伴可以上网查找相关知识。那么这个lowbit函数是干什么用的呢?
我们可以把它理解成对树状数组的遍历方式。
根据树状数组的示意图可以发现,我们如果想对原数组进行元素修改,会牵连到于之关联的树状数组整个链。所以我们必须层层向上修改,每一层都要修改,才能保证树状数组存储的元素的正确性。
那么这个层层向上(向下),就需要lowbit这个函数,或者是说这个功能,来实现。
下面介绍fix()(修改函数)
void fix(int x)
{
for(int i=x;i<=n;i+=i&-i)
c[i]++;
}
void fix(int x,int y)//表示在x元素处修改y个单位
{
for(int i=x;i<=n;i+=i&i)
c[i]+=y;
}
通过刚才学习lowbit函数,我们应该可以理解这个循环的含义。
其实就是层层向上修改树状数组的对应元素。
然后是getsum()(查询函数),实现内容大同小异。
int getsum(int x)
{
int ret=0;
for(int i=x;i;i-=i&-i)
ret+=c[i];
return ret;
}
这里注意,查询的时候要从上往下查询,这里默认查询的区间是1-->x,如果不是1到x,需要另外加参数。
所以树状数组知识介绍完之后,我们就可以轻松地A这道题。
代码如下:
#include<cstdio>
using namespace std;
int n,k,c[500001];
char s[4];
void fix(int x,int y)
{
for(int i=x;i<=n;i+=i&-i)
c[i]+=y;
}
void getsum(int x)
{
int ret=0;
for(int i=x;i;i-=i&-i)
ret+=c[i];
printf("%d\n",ret);
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=k;i++)
{
scanf("%s",s);
if(s[0]=='A')
{
int x;
scanf("%d",&x);
getsum(x);
}
else if(s[0]=='B')
{
int x,y;
scanf("%d%d",&x,&y);
fix(x,y);
}
else if(s[0]=='C')
{
int x,y;
scanf("%d%d",&x,&y);
fix(x,-y);
}
}
return 0;
}
VIJOS-P1320 清点人数的更多相关文章
- vijos 1320 清点人数
背景 NK中学组织同学们去五云山寨参加社会实践活动,按惯例要乘坐火车去.由于NK中学的学生很多,在火车开之前必须清点好人数. 描述 初始时,火车上没有学生:当同学们开始上火车时,年级主任从第一节车厢出 ...
- 树状数组例题-数星星,简单题easy,校门外的树2,清点人数
[例1]数星星 天空中有一些星星,这些星星都在不同的位置,每个星星都有个坐标,如果一个星星的左下方(包括正左和正下)有k颗星星,就说这颗星星是k级的. 比如,上图中,星星5是3级的(1,2,4在其左下 ...
- vijos 清点人数
背景 NK中学组织同学们去五云山寨参加社会实践活动,按惯例要乘坐火车去.由于NK中学的学生很多,在火车开之前必须清点好人数. 描述 初始时,火车上没有学生:当同学们开始上火车时,年级主任从第一节车厢出 ...
- LOJ P10116 清点人数 题解
每日一题 day13 打卡 Analysis 用简单的树状数组维护单点修改和查询就行了 #include<iostream> #include<cstdio> #include ...
- 换个角度看微信小程序[推荐]
去年参加几次技术沙龙时,我注意到一个有意思的现象:与之前大家统一接受的换名片不同,有些人并不愿意被添加微信好友--"不好意思,不熟的人不加微信". 这个现象之所以有意思,是因为名片 ...
- hiho一下 第九十七周 数论六·模线性方程组
题目1 : 数论六·模线性方程组 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:今天我听到一个挺有意思的故事! 小Hi:什么故事啊? 小Ho:说秦末,刘邦的将军 ...
- loj题目总览
--DavidJing提供技术支持 现将今年7月份之前必须刷完的题目列举 完成度[23/34] [178/250] 第 1 章 贪心算法 √ [11/11] #10000 「一本通 1.1 例 1」活 ...
- 2019寒假练题计划——LibreOJ刷题计划 &《信息学奥赛一本通》提高版题目
目录 2019.1.27 #10082. 「一本通 3.3 例 1」Word Rings 题意 思路 #10083. 「一本通 3.3 例 2」双调路径 题意 思路 #10084. 「一本通 3.3 ...
- hihocode 九十七周 中国剩余定理
题目1 : 数论六·模线性方程组 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:今天我听到一个挺有意思的故事! 小Hi:什么故事啊? 小Ho:说秦末,刘邦的将军 ...
随机推荐
- win10 连接samba 账号密码不正确,win7可以访问
1.本地安全策略,本地策略-安全选项,需要修改成默认的值的修改方式: 查找注册表浏览到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA ...
- C# 迭代器与yield关键字
迭代器模式是设计模式的一种,因为其运用的普遍性,很多语言都有内嵌的原生支持 在.NET中,迭代器模式是通过IEnumerator.IEnumerable两个接口(有非泛型和泛型2种版本)来封装的 迭代 ...
- server 2012 r2 配置
filezilla的问题还是让人摸不着头脑,配置和别的机器上一样就是报STL权限错误,最后换了个端口就连上了. 服务器,填远端IP,被动模式打开,生成一个证书,被动模式的商品一定要在入站规则里 客户端 ...
- tmp/ccdLyHub.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0' collect2: ld returned 1 exit status
其实就是一个问题,gcc只能编译.c文件,你如果取名为.cpp,那么gcc编译就会就会出现这个错误. 这种情况下: 1.用g++编译(.c 或.c++都可以编译) 2.仍用gcc编译,但是文件后缀改为 ...
- Python之threading多线程,多进程
1.threading模块是Python里面常用的线程模块,多线程处理任务对于提升效率非常重要,先说一下线程和进程的各种区别,如图 概括起来就是 IO密集型(不用CPU) 多线程计算密集型(用CPU) ...
- POJ 2249 暴力求组合数
Binomial Showdown Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22692 Accepted: 692 ...
- FZU 1759 题解 欧拉降幂
本题考点:欧拉降幂 Super A^B mod C Given A,B,C, You should quickly calculate the result of A^B mod C. (1<= ...
- Java8 LocalDateTime和Date相互转换
很想要用Java的时间api,但有时候还是需要转换为Date. 二者的相互转换并不是一步到位那么简单,所以,还是需要记录一下转换的api Date to LocalDateTime Date toda ...
- 基于FlexBox的无约束自适应
全手打原创,转载请标明出处:https://www.cnblogs.com/dreamsqin/p/11972664.html,多谢,=.=~ 一.背景描述 对于通用型带过滤条件的列表查询项目中, ...
- 【BZOJ3328】PYXFIB(单位根反演,矩阵快速幂)
[BZOJ3328]PYXFIB(单位根反演,矩阵快速幂) 题面 BZOJ 题解 首先要求的式子是:\(\displaystyle \sum_{i=0}^n [k|i]{n\choose i}f_i\ ...