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 ...
随机推荐
- Bitmap转ImageSource
bitmap to bytes Bitmap b = new Bitmap( "test.bmp "); MemoryStream ms = new MemoryStream(); ...
- Motion Matching 资料汇总
https://www.gdcvault.com/play/1023280/Motion-Matching-and-The-Road https://twvideo01.ubm-us.net/o1/v ...
- 浅谈备受开发者好评的.NET core敏捷开发工具,讲讲LEARUN工作流引擎
通俗来讲,所谓一个工作流管理系统,如果将其拆分出来一个个单讲话,大致可理解为由工作流引擎.工作流设计器.流程操作.工作流客户界面. 流程监控.表单设计器.与表单的集成以及与应用程序的集成等几个部分组成 ...
- XmlAnalyzer1.00 源码
此工程用途:将xml同级属性/子节点按字母序排列重新输出. 源码下载: https://files.cnblogs.com/files/heyang78/XmlAnalyzer-20200526-1. ...
- 借助rownum中求Oracle表中前三名(三甲:状元榜眼探花)的方法(总计三种方法,以讲述rownum的使用为主)
要求前三名,MySQL中有order by排序,limit限制数量,结果很容易得到,而且limit的执行顺序也在order by之后,写出的sql高效易懂而不易出错. 但在oracle中,由于没有li ...
- 字符串对象跟xml格式的转换
package com.sunshen.jfids.testWebService.task; import java.io.File; import java.io.StringWriter; imp ...
- CentOS 7 安装部署 cassandra作为kairosdb的数据存储
环境 Centos 7.4 java 1.8.0 安装步骤 java yum -y install java-1.8.0-openjdk* cassandra wget https://mirrors ...
- console线和RJ45
123 前言 一直以为console口和RJ45是同一种接口,but后来我发现我错了~ RJ45 先介绍一下RJ45吧 什么是RJ45? RJ45是一种接口 我们家用的网线的接口 其实就是RJ45 r ...
- numpy函数笔记(持续更新)
numpy函数笔记 np.isin用法 np.isin(a,b) 用于判定a中的元素在b中是否出现过,如果出现过返回True,否则返回False,最终结果为一个形状和a一模一样的数组.(注意:这里的a ...
- Django+bootstrap启动登录模板页面(Django三)
上次用Django启动了我的第一个页面 具体步骤参考:初步启动DjangoDjango启动第一个页面但是页面非常简陋,所以我从网上找了个模板,下载网址:免费下载模板,解压后内部文件如下: 效果图:下面 ...