Top Coder 某场Div 2的C题 题解
前天,我们了解了一下一种叫做树状数组的神奇玩意儿,今天就放一道真题来检验一下自己的学习成果吧!

嗯,题目就是这样的啦。
分析:
这题的暴力大家应该都会打吧。
注意到m小的压批,所以对于每一个m值,我们可以用前缀和求出[1,i]这个区间内值为m的数的数量,然后在枚举每个区间,判断一下就OK了。这就是暴力,注意到时间复杂度为(n2m)的。
根据复杂度,我们可以知道,只要再优化掉一个n,或者把n优化成log,那么问题就解决了。
那么这个优化应该如何来进行呢?
我们可以先把数列进行重构:对于a[i]的每一个取值k,进行一次重构,a[i]=k,就把a[i]赋值为1,否则就为-1,那么对于一个区间[l,r],只要sum[r]-sum[l-1]>0那么这个区间就是合法的。(sum为前缀和数组)
重构数列完成后,我们思考:在暴力算法中,枚举区间,枚举了两个端点,那么我们能否做到只枚举一个端点,然后用log的时间求出所有合法右端点的数量,累计到答案上。
至于枚举的那个端点,毫无疑问,是右端点(好吧,只是为了方便,闲着蛋疼的同学也可以尝试着去枚举左端点),然后我们注意到,所有sum值小于sum[r]的,都可以是一个合法的左端点,你是否想到了什么呢?——我*,树状数组直接上啊!!!(也可以是权值线段树)
在枚举r(右端点)的同时,将每个sum[r]加入树状数组,其中,sum[r]为元素下标,加的值为1,然后给ans(答案)加上Getsum(sum[r]-1)就行了。(Getsum(x)为用树状数组求出所有sum值在[1,x]中的数量)
代码:
var
a:array[1..100000]of int64;
sum:array[0..100000]of longint;
c:array[0..200010]of longint;
i,j,k:longint;
n,seed,m,ans:int64;
procedure update(x,y:longint);
begin
if x<200010 then begin c[x]:=c[x]+y; update(x+x and(-x),1) end else exit;
end;
function getsum(x:longint):longint;
begin
if x>0 then exit(c[x]+getsum(x-x and(-x))) else exit(0);
end;
begin
read(n,seed,m);
for i:=1 to n do
begin
a[i]:=(seed div 65536)mod m;
seed:=(seed*1103515245+12345)mod 2147483648;
end;
for i:=0 to m-1 do
begin
fillchar(c,sizeof(c),0);
sum[0]:=100005; update(sum[0],1); //这里特别注意把sum[0]赋值为100000+,因为树状数组在下标<=0时会炸!
for j:=1 to n do
begin
if a[j]=i then sum[j]:=sum[j-1]+1 else sum[j]:=sum[j-1]-1;
update(sum[j],1);
ans:=ans+getsum(sum[j]-1);
end;
end;
writeln(ans);
end.
Top Coder 某场Div 2的C题 题解的更多相关文章
- Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) (前三题题解)
这场比赛好毒瘤哇,看第四题好像是中国人出的,怕不是dllxl出的. 第四道什么鬼,互动题不说,花了四十五分钟看懂题目,都想砸电脑了.然后发现不会,互动题从来没做过. 不过这次新号上蓝名了(我才不告诉你 ...
- Codeforces Round #609 (Div. 2)前五题题解
Codeforces Round #609 (Div. 2)前五题题解 补题补题…… C题写挂了好几个次,最后一题看了好久题解才懂……我太迟钝了…… 然后因为longlong调了半个小时…… A.Eq ...
- BestCoder Round #11 (Div. 2) 前三题题解
题目链接: huangjing hdu5054 Alice and Bob 思路: 就是(x,y)在两个參考系中的表示演全然一样.那么仅仅可能在这个矩形的中点.. 题目: Alice and Bob ...
- Codeforces Round #599 (Div. 2)的简单题题解
难题不会啊…… 我感觉写这个的原因就是因为……无聊要给大家翻译题面 A. Maximum Square 简单题意: 有$n$条长为$a_i$,宽为1的木板,现在你可以随便抽几个拼在一起,然后你要从这一 ...
- Top Coder算法题目浏览器
作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/top-code-offline-browser/ 关于 左耳朵耗子 ...
- [翻译]How to Find a Solution ( 如何找到问题的答案,来自Top Coder 网站)
原文链接: https://www.topcoder.com/community/data-science/data-science-tutorials/how-to-find-a-solution/ ...
- Codeforces Round #612 (Div. 2) 前四题题解
这场比赛的出题人挺有意思,全部magic成了青色. 还有题目中的图片特别有趣. 晚上没打,开virtual contest打的,就会前三道,我太菜了. 最后看着题解补了第四道. 比赛传送门 A. An ...
- Codeforces Round #524 (Div. 2)(前三题题解)
这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...
- Educational Codeforces Round 53 (Rated for Div. 2) (前五题题解)
这场比赛没有打,后来补了一下,第五题数位dp好不容易才搞出来(我太菜啊). 比赛传送门:http://codeforces.com/contest/1073 A. Diverse Substring ...
随机推荐
- Lua 5.3注册C++类相关API
int luaL_newmetatable (lua_State *L, const char *tname); 如果注册表中不存在名为tname的表,则在注册表中创建一个名为tname的表,并将这个 ...
- File类与IO流
一.File类与IO流 数组.集合等内容都是把数据放在内存里面,一旦关机或者断电,数据就会立刻从内存里面消失.而IO主要讲文件的传输(输入和输出),把内存里面的数据持久化到硬盘上,如.txt .avi ...
- php中的加密解密模块-mcrypt
<?php /* 打开加密算法和模式 */ $td = mcrypt_module_open('rijndael-256', '', 'ofb', ''); /* 创建初始向量,并且检测密钥长度 ...
- HTML -- 表单元素1
HTML 表单用于搜集不同类型的用户输入. 一.<form> 标签 <form> 标签用于为用户输入创建 HTML 表单. 表单能够包含 input 元素,比如文本字段.复选框 ...
- Mybatis注解开发案例(入门)
1.创建maven工程,配置pom.xml 文件. 2.创建实体类 3.创建dao接口 4.创建主配置文件SqlMapConfig.xml 5.在SqlMapConfig.xml中导入外部配置文件jd ...
- Python中的相对路径的表示方法
2020/6/3 举例: 现在 6-2.py 想使用 /data/lastfm-2k/user_artists.dat 因为 6-2.py 和 data 是同一级目录,所以正确的写法应该是:
- in多值优化
〇.问题 今天ocp群里有人问 SELECT * FROM table WHERE id IN(11,2,3,44,...) 在in里面有大量数据4000+,有什么 好的处理方式吗? 我的优化方案的总 ...
- Docker实战(2):主从库搭建
入门 基于Docker的Mysql主从复制搭建 首先安装docker 拉取mysql镜像:5.7版本 启动主从数据库容器 docker run -p 3339:3306 --name Maste -e ...
- Prometheus-Alertmanager告警对接到企业微信
之前写过将Prometheus的监控告警信息通过Alertmanager推送到钉钉群. 最近转移了阵地,需要将Prometheus监控告警信息推送到企业微信群,经过两天的摸索,以及查了网上的一些资料, ...
- 研究生杂谈-1粗粒度(Coarse-grained)VS细粒度(fine-grained)
粒度似乎是根据项目模块划分的细致程度区分的,一个项目模块(或子模块)分得越多,每个模块(或子模块)越小,负责的工作越细,就说粒度越细,否则为粗粒度. 简而言之: 粗粒度:模块的功能太过于集中. 细粒度 ...