bzoj 2038 莫队算法
莫队算法,具体的可以看10年莫涛的论文。
大题思路就是假设对于区间l,r我们有了一个答案,那么对于区间l,r+1,我们
可以暴力的转移一个答案,那么对于区间l1,r1和区间l2,r2,需要暴力处理
的部分就是|r1-r2|+|l1-l2|如果将l看成x,r看成r,得到的暴力部分就是manhattan距离
那么我们将所有的询问,构成一张二维图,可以从一个点转移到另一个点,且总manhattan距离
尽可能的小,所以可以建立一颗manhattan mst,这样的话就可以得到最优的转移,但是实际来说
搞定一个manhattan mst需要的时间不小,我们可以不要最优解,将询问按l分块,只需要做到在每个
块中尽可能的优就行了,所以每个块中可以根据r排序,然后搞就行了
经莫队证明,这个算法的复杂度上界大概是o(n^1.5)
/**************************************************************
Problem:
User: BLADEVIL
Language: Pascal
Result: Accepted
Time: ms
Memory: kb
****************************************************************/
//By BLADEVIL
type
rec =record
l, r, w, s :longint;
end;
var
n, m :longint;
c, size :array[..] of int64;
len :longint;
a :array[..] of rec;
now :longint;
col, ans :array[..] of int64;
all, num :int64;
procedure swap(var a,b:longint);
var
c :longint;
begin
c:=a; a:=b; b:=c;
end;
procedure swap_rec(var a,b:rec);
var
c :rec;
begin
c:=a; a:=b; b:=c;
end;
function gcd(a,b:int64):int64;
begin
if a<b then exit(gcd(b,a)) else
if b= then exit(a) else exit(gcd(b,a mod b));
end;
procedure qs(low,high:longint);
var
i, j, xx, yy :longint;
begin
i:=low; j:=high; xx:=a[(i+j) div ].w;
yy:=a[(i+j) div ].r;
while i<j do
begin
while (a[i].w<xx) or (a[i].w=xx) and (a[i].r<yy) do inc(i);
while (a[j].w>xx) or (a[j].w=xx) and (a[j].r>yy) do dec(j);
if i<=j then
begin
swap_rec(a[i],a[j]);
inc(i); dec(j);
end;
end;
if i<high then qs(i,high);
if j>low then qs(low,j);
end;
procedure init;
var
i :longint;
begin
read(n,m);
for i:= to n do read(c[i]);
len:=trunc(sqrt(m));
for i:= to m do
begin
read(a[i].l,a[i].r);
if a[i].l>a[i].r then swap(a[i].l,a[i].r);
size[i]:=a[i].r-a[i].l+;
a[i].w:=a[i].l div len+;
a[i].s:=i;
end;
qs(,m);
end;
procedure main;
var
i, j :longint;
begin
i:=;
while i<=m do
begin
now:=a[i].w;
fillchar(col,sizeof(col),);
for j:=a[i].l to a[i].r do
begin
ans[a[i].s]:=ans[a[i].s]+*(col[c[j]]);
col[c[j]]:=col[c[j]]+;
end;
inc(i);
while a[i].w<=now do
begin
ans[a[i].s]:=ans[a[i-].s];
for j:=a[i-].r+ to a[i].r do
begin
ans[a[i].s]:=ans[a[i].s]+*(col[c[j]]);
col[c[j]]:=col[c[j]]+;
end;
if a[i-].l<a[i].l then
begin
for j:=a[i-].l to a[i].l- do
begin
col[c[j]]:=col[c[j]]-;
ans[a[i].s]:=ans[a[i].s]-*col[c[j]];
end;
end else
for j:=a[i].l to a[i-].l- do
begin
ans[a[i].s]:=ans[a[i].s]+*(col[c[j]]);
col[c[j]]:=col[c[j]]+;
end;
inc(i);
if i>m then break;
end;
end;
for i:= to m do
begin
if size[i]= then all:= else all:=size[i]*(size[i]-);
num:=gcd(ans[i],all);
writeln(ans[i] div num,'/',all div num);
end;
end;
begin
init;
main;
end.
bzoj 2038 莫队算法的更多相关文章
- bzoj 2038 莫队入门
http://www.lydsy.com/JudgeOnline/problem.php?id=2038 题意:多次询问区间内取出两个相同颜色的种类数 思路:由于不是在线更新,那么可以进行离线查询,而 ...
- HYSBZ 2038 莫队算法
小Z的袜子(hose) Time Limit:20000MS Memory Limit:265216KB 64bit IO Format:%lld & %llu Submit ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
- 【BZOJ】2038: [2009国家集训队]小Z的袜子(hose)(组合计数+概率+莫队算法+分块)
http://www.lydsy.com/JudgeOnline/problem.php?id=2038 学了下莫队,挺神的orzzzz 首先推公式的话很简单吧... 看的题解是从http://for ...
- bzoj 2038 [2009国家集训队]小Z的袜子(hose)(莫队算法)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2038 [题意] 给定一个有颜色的序列,回答若干个询问:区间内任选两个颜色相同的概率. ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 9894 Solved: 4561[Subm ...
- bzoj 2038 A-小Z的袜子[hose] - 莫队算法
作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从 ...
- BZOJ 2038 小Z的袜子(hose) 莫队算法模板题
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题目大意: 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 【莫队算法模版】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题意概括: 有 N 只袜子(分别编号为1~N),有 M 次查询 (L, R)里面随机 ...
随机推荐
- 新建一个DataTable如何手动给其添加多条数据!
早晨起来,想起昨天利用winform做类似于sqlserver数据库导入数据功能的时候,用到了新建一个DataTable手动给其添加多条数据,平时用不到,需要的时候想不起来了,这次不妨把他记下来.以下 ...
- jquery用ajax方式从后台获取json数据,将内容填充到下拉列表。
从后台获取json数据,将内容填充到下拉列表. url:链接 par:ID sel:下拉列表选择器 //获取下拉列表 function BuildSelectBox(url, par, sel) { ...
- DOCTYPE对$(window).height()取值的影响
前言:公司项目需要用到一个弹框垂直居中,网上类似的垂直居中弹出层大同小异,因为项目是基于Jquery 下的,所以用$(window).height()-layer.height())/2 +$(doc ...
- Azkaban 作业调度
转载一篇不错的文章:http://www.cnblogs.com/smartloli/p/5191155.html
- win7防火墙打不开(无法启动windows firewall服务)
点击windows 7控制面板中防火墙的“推荐配置”没有反应:打开“服务”,无法启动windows firewall,并报错. 可能很多的win7用户都碰到过这样的一种情况,那就是win7的防火墙打 ...
- 更强的微光闪烁效果--第三方开源--Shimmer-android
Shimmer-android在github上的项目主页是:https://github.com/RomainPiel/Shimmer-android Shimmer-android干脆在Androi ...
- mysql开启全文索引功能
注意:全文检索模块需要mysql开启全文索引功能,开启方法:修改mysql配置文件:window服务器为my.ini,linux服务器为my.cnf,在 [mysqld] 后面加入一行“ft_min_ ...
- udev/raw/asmlib/多路径 配置asm
asmlib 是linux上面给磁盘/分区头上面打上asm的标记,供asm使用,而且当磁盘的盘符发生改变的时候,不会影响到asm disk,从效果上说,和udev没有本质区别,在redhat 4和5中 ...
- MVC的Filters(拦截过滤)的Error页面,支持Ajax报错
报错拦截过滤到error页面 [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, A ...
- o2o家庭助手demo
前段时间跟一个同事出去游玩,在回来的大巴上面我们聊到了现在比较热门的o2o,说实话我自己早就想要在这个领域好好地玩一把.但是一直苦于没有很好地idea,再加上自己之前一直没有这方面的创业经验,所以一直 ...