Description

作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L
Input

输入文件第一行包含两个正整数N和M。N为袜子的数量,M为小Z所提的询问的数量。接下来一行包含N个正整数Ci,其中Ci表示第i只袜子的颜色,相同的颜色用相同的数字表示。再接下来M行,每行两个正整数L,R表示一个询问。
Output

包含M行,对于每个询问在一行中输出分数A/B表示从该询问的区间[L,R]中随机抽出两只袜子颜色相同的概率。若该概率为0则输出0/1,否则输出的A/B必须为最简分数。(详见样例)
Sample Input
6 4
1 2 3 3 3 2
2 6
1 3
3 5
1 6
Sample Output
2/5
0/1
1/1
4/15
【样例解释】
询问1:共C(5,2)=10种可能,其中抽出两个2有1种可能,抽出两个3有3种可能,概率为(1+3)/10=4/10=2/5。
询问2:共C(3,2)=3种可能,无法抽到颜色相同的袜子,概率为0/3=0/1。
询问3:共C(3,2)=3种可能,均为抽出两个3,概率为3/3=1/1。
注:上述C(a, b)表示组合数,组合数C(a, b)等价于在a个不同的物品中选取b个的选取方案数。
【数据规模和约定】
30%的数据中 N,M ≤ 5000;
60%的数据中 N,M ≤ 25000;
100%的数据中 N,M ≤ 50000,1 ≤ L < R ≤ N,Ci ≤ N。

莫队算法基础题

莫队算法是一种优化的思想

给很多组询问,每次询问一个区间的答案

我们要用一个神奇的数据结构,维护区间信息,可以由(l,r)推出(l+1,r)和(l,r+1)和(l-1,r)和(l,r-1)

这时我们把询问看成点(l,r),两个询问的转移的代价就是曼哈顿距离

然后我们求出曼哈顿最小生成树,再dfs一遍就行了,但是这样很麻烦,所以就有了一个替代品,很容易写

具体操作是先分块,分成根号n块,对询问的区间排序,第一关键字是l所在的块的编号,第二关键字是r

然后就是暴力了,用那个神奇的数据结构从上一次的询问推到这一次的询问

可以证明,这样复杂度是O(n^1.5*那个神奇的数据结构操作一次的时间)

1.对于l,因为我们按块排序,所以每一次变化不超过n^0.5,一共n次,所以是n^1.5

2.对于r,有两种情况

1>l在同一个块,因为第二关键字是r,所以这时r递增,一个块最多O(n),有n^0.5个块,所以是O(n^1.5)

2>l跨块,r最多变化n,最多有n^0.5次跨块,所以为O(n^1.5)

 const
maxn=;
var
ll,rr,a,c,s,kuai:array[..maxn]of longint;
ans:array[..maxn,..]of int64;
n,m,w:longint; procedure swap(var x,y:longint);
var
t:longint;
begin
t:=x;x:=y;y:=t;
end; procedure sort(l,r:longint);
var
i,j,y,z:longint;
begin
i:=l;
j:=r;
y:=kuai[ll[(l+r)>>]];
z:=rr[(l+r)>>];
repeat
while (kuai[ll[i]]<y)or((kuai[ll[i]]=y)and(rr[i]<z)) do
inc(i);
while (kuai[ll[j]]>y)or((kuai[ll[j]]=y)and(rr[j]>z)) do
dec(j);
if i<=j then
begin
swap(ll[i],ll[j]);
swap(rr[i],rr[j]);
swap(a[i],a[j]);
inc(i);
dec(j);
end;
until i>j;
if i<r then sort(i,r);
if j>l then sort(l,j);
end; procedure init;
var
i:longint;
begin
read(n,m);
w:=trunc(sqrt(n));
for i:= to n do
kuai[i]:=i div w;
for i:= to n do
read(c[i]);
for i:= to m do
read(ll[i],rr[i]);
for i:= to m do
a[i]:=i;
sort(,m);
end; function f(x:int64):int64;
begin
exit((x*(x-))>>);
end; function gcd(a,b:int64):int64;
begin
if b= then exit(a);
exit(gcd(b,a mod b));
end; procedure insert(x:longint;a,b:int64);
var
t:longint;
begin
if a= then
begin
ans[x,]:=;
ans[x,]:=;
end;
t:=gcd(a,b);
a:=a div t;
b:=b div t;
ans[x,]:=a;
ans[x,]:=b;
end; procedure work;
var
lastl,lastr,i,j:longint;
sum:int64;
begin
lastl:=;
lastr:=;
sum:=;
for i:= to m do
begin
for j:=lastr+ to rr[i] do
begin
inc(s[c[j]]);
sum:=sum+f(s[c[j]])-f(s[c[j]]-);
end;
for j:=ll[i] to lastl- do
begin
inc(s[c[j]]);
sum:=sum+f(s[c[j]])-f(s[c[j]]-);
end;
for j:=rr[i]+ to lastr do
begin
dec(s[c[j]]);
sum:=sum+f(s[c[j]])-f(s[c[j]]+);
end;
for j:=lastl to ll[i]- do
begin
dec(s[c[j]]);
sum:=sum+f(s[c[j]])-f(s[c[j]]+);
end;
lastl:=ll[i];
lastr:=rr[i];
insert(a[i],sum,f(rr[i]-ll[i]+));
end;
for i:= to m do
writeln(ans[i,],'/',ans[i,]);
end; begin
init;
work;
end.

2038: [2009国家集训队]小Z的袜子(hose) - BZOJ的更多相关文章

  1. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

  2. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7676  Solved: 3509[Subm ...

  3. 莫队算法 2038: [2009国家集训队]小Z的袜子(hose)

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 ...

  4. Bzoj 2038: [2009国家集训队]小Z的袜子(hose) 莫队,分块,暴力

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 5763  Solved: 2660[Subm ...

  5. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )

    莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) --------------------------- ...

  6. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 分块

    分块大法好 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 2938  Solved: 13 ...

  7. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 9894  Solved: 4561[Subm ...

  8. 2038: [2009国家集训队]小Z的袜子(hose) (莫队算法)

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 专题练习: http://acm.hust.edu.cn/vjudge/conte ...

  9. 2038: [2009国家集训队]小Z的袜子(hose)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 9472  Solved: 4344 Desc ...

随机推荐

  1. CSS组件化思考

    为什么组件化? 分层设计,代码复用,减少冗余: 维护方便,弹性好: 如何组件化? 目前代码分成三级: 第一级粒度最细,是基础,主要包含字体配置,颜色配置,UI框架(比如MUI或者pure.css): ...

  2. Java - 正则表达式常用操作

    验证 简单验证 String regex = "\\d{4}-\\d{2}-\\d{2}"; String input = "2016-01-01"; asse ...

  3. Commons Configuration2 - Quick start guide

    原文:http://commons.apache.org/proper/commons-configuration/userguide/quick_start.html Reading a prope ...

  4. 在Ubuntu系统中解压rar和zip文件的方法

    大家在以前的windows系统中会存有很多rar和zip格式的压缩文件,Ubuntu系统默认情况下对这些文件的支持不是很好,如果直接用"归档管理器"打开会提示错误,因此今天跟大家分 ...

  5. SQL Server 2008 错误15023:当前数据库中已存在用户或角色

    解决SQL Server 2008 错误15023:当前数据库中已存在用户或角色,SQLServer2008,错误15023,在使用SQL Server 2008时,我们经常会遇到一个情况:需要把一台 ...

  6. JS正则与.net正则表达式的区别

    原字符串:长期投资人月井石问华菱钢铁(000932)公司反复强调VAMA的战略意义,请问在2015年4季度达产后对公司贡献的盈利预期 正则匹配处理后:公司反复强调VAMA的战略意义,请问在2015年4 ...

  7. uva673 - Parentheses Balance(栈)

    题意:1.空串合法.2.若A和B合法,则AB合法.3.若A合法,则(A)和[A]合法. 思路:遍历串,遇到(或[,则压入队列,若遇到),判断:若栈空,则不合法:若栈顶元素不是(,也不合法.]同理.因为 ...

  8. [GeekBand] STL与泛型编程(3)

    本篇文章主要介绍泛型算法中的变易.排序.数值算法. 一. 变易算法 所谓变易算法是指那些改变容器中的对象的操作. 1.1 copy组 template <class InputIterator, ...

  9. salvage 数据块打捞工具

    基本上所有数据库都是按块存储数据的,每种数据库的块都有自己有特征,我们可以找出特征,当数据库文件丢失,甚至文件系统完全损坏时,从硬盘扇区中把数据页打捞出来,从页从数据页中恢复出行数据.根据这个原理,开 ...

  10. 查看Aix系统配置命令

    prtconf#topas http://baike.baidu.com/link?url=QruEnlfCqyoqQ565LicyKxIGMQYSkVesj6j9GzHWwzpDOagXtuprhT ...