题意:

给定n个数a1, a2…… an与m个询问(L,R)。对于每个询问,从aL, aL+1…… aR这R-L+1个数中随机取出两个数,求这两个数相同的概率。

数据范围:1<=n,m,ai<=50000

思路:

以下是原话:

平方运算的存在是线段树无法打破的坚冰!

只有询问,没有修改! 可以任意的顺序求解询问!

考虑两个位置关系任意的区间[L1,R1]与[L2,R2]

已有前者的信息,要得到后者的信息只需插入或删除L1与L2间的数和R1与R2间的数

若L1<L2则删除[L1,L2-1]内的数, 否则插入[L2,L1-1]内的数;

若R1<R2则插入[R1+1,R2]内的数, 否则删除[R2+1,R1]内的数;

无论何种情况,所需操作数均为 |L1 - L2| + |R1 - R2|

将m个区间重新排列,最小化:

定义(L0,R0) = (1,0)

分块,将询问以左端点所在块的编号为第一关键字,右端点大小为第二关键字排序,依次计算保证

时间复杂度O(N^1.5)

复杂度分析是这样的:
1、i与i+1在同一块内,r单调递增,所以r是O(n)的。由于有n^0.5块,所以这一部分时间复杂度是n^1.5。
2、i与i+1跨越一块,r最多变化n,由于有n^0.5块,所以这一部分时间复杂度是n^1.5
3、i与i+1在同一块内时l变化不超过n^0.5,跨越一块也不会超过n^0.5,忽略*2。由于有m次询问(和n同级),所以时间复杂度是n^1.5
于是就是O(n^1.5)了

 type arr=record
l,r,c,t:longint;
end;
var s:array[..]of int64;
ans:array[..,..]of int64;
q:array[..]of arr;
c,a:array[..]of longint;
n,m,i,kuai:longint;
tmp:int64; procedure swap(var x,y:arr);
var t:arr;
begin
t:=x; x:=y; y:=t;
end; procedure qsort(l,r:longint);
var i,j,mid1,mid2:longint;
begin
i:=l; j:=r; mid1:=q[(l+r)>>].c; mid2:=q[(l+r)>>].r;
repeat
while (mid1>q[i].c)or((mid1=q[i].c)and(mid2>q[i].r)) do inc(i);
while (mid1<q[j].c)or((mid1=q[j].c)and(mid2<q[j].r)) do dec(j);
if i<=j then
begin
swap(q[i],q[j]);
inc(i); dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end; function gcd(x,y:int64):int64;
var r,t:int64;
begin
if x<y then
begin
t:=x; x:=y; y:=t;
end;
repeat
r:=x mod y;
x:=y;
y:=r;
until r=;
exit(x);
end; procedure add(x,y:longint);
begin
tmp:=tmp-s[a[x]]*s[a[x]];
s[a[x]]:=s[a[x]]+y;
tmp:=tmp+s[a[x]]*s[a[x]];
end; procedure modui;
var a,b,c,d,k1,k2,k:int64;
i,j:longint;
begin
a:=; b:=; tmp:=;
for i:= to m do
begin
c:=q[i].l; d:=q[i].r;
for j:=b+ to d do add(j,);
for j:=c to a- do add(j,);
for j:=a to c- do add(j,-);
for j:=d+ to b do add(j,-);
a:=c; b:=d;
if c=d then
begin
ans[i,]:=; ans[i,]:=;
continue;
end;
k1:=tmp-(d-c+);
if k1= then
begin
ans[i,]:=; ans[i,]:=;
continue;
end;
k2:=(d-c+)*(d-c);
k:=gcd(k1,k2);
ans[i,]:=k1 div k;
ans[i,]:=k2 div k;
end; end; procedure qsort1(l,r:longint);
var i,j,mid:longint;
t:int64;
begin
i:=l; j:=r; mid:=q[(l+r)>>].t;
repeat
while mid>q[i].t do inc(i);
while mid<q[j].t do dec(j);
if i<=j then
begin
swap(q[i],q[j]);
t:=ans[i,]; ans[i,]:=ans[j,]; ans[j,]:=t;
t:=ans[i,]; ans[i,]:=ans[j,]; ans[j,]:=t;
inc(i); dec(j);
end;
until i>j;
if l<j then qsort1(l,j);
if i<r then qsort1(i,r);
end; begin
assign(input,'bzoj2038.in'); reset(input);
assign(output,'bzoj2038.out'); rewrite(output);
readln(n,m);
for i:= to n do read(a[i]);
kuai:=trunc(sqrt(n));
for i:= to n do c[i]:=(i-) div kuai+;
for i:= to m do
begin
readln(q[i].l,q[i].r);
q[i].c:=c[q[i].l];
q[i].t:=i;
end;
qsort(,m);
modui;
qsort1(,m);
for i:= to m do writeln(ans[i,],'/',ans[i,]);
close(input);
close(output);
end.

【BZOJ2038】小Z的袜子(莫队)的更多相关文章

  1. BZOJ2038 小Z的袜子 莫队

    BZOJ2038 题意:q(5000)次询问,问在区间中随意取两个值,这两个值恰好相同的概率是多少?分数表示: 感觉自己复述的题意极度抽象,还是原题意有趣(逃: 思路:设在L到R这个区间中,x这个值得 ...

  2. [国家集训队][bzoj2038] 小Z的袜子 [莫队]

    题面: 传送门 思路: 又是一道标准的莫队处理题目,但是这道题需要一点小改动:求个数变成了求概率 我们思考:每次某种颜色从i个增加到i+1个,符合要求的情况多了多少? 原来的总情况数是i*(i-1)/ ...

  3. 【填坑向】bzoj2038小Z的袜子 莫队

    学莫队必做题,,,但是懒得写.今天来填个坑 莫队水题 莫队实际上就是按一个玄学顺序来离线计算询问,保证复杂度只会多一个n1/2,感觉是玄学(离线算法都很玄学) 易错点:要开long long(卡我半天 ...

  4. BZOJ2038 小Z的袜子(莫队之源)

    题意+思路: 给你m个区间询问,问每个区间内的$\displaystyle \frac{\sum x^2-(R-L+1)}{(R-L)(R-L+1)} $,其中x为每种数字的个数,用cnt存储: 所以 ...

  5. 小Z的袜子 & 莫队

    莫队学习 & 小Z的袜子 引入 莫队 由莫涛巨佬提出,是一种离线算法 运用广泛 可以解决广大的离线区间询问题 莫队的历史 早在mt巨佬提出莫队之前 类似莫队的算法和莫队的思想已在Codefor ...

  6. BZOJ 2038 [2009国家集训队]小Z的袜子 莫队

    2038: [2009国家集训队]小Z的袜子(hose) 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Descriptionw ...

  7. 【国家集训队2010】小Z的袜子[莫队算法]

    [莫队算法][国家集训队2010]小Z的袜子 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程, ...

  8. bzoj 2308 小Z的袜子(莫队算法)

    小Z的袜子 [题目链接]小Z的袜子 [题目类型]莫队算法 &题解: 莫队算法第一题吧,建议先看这个理解算法,之后在参考这个就可以写出简洁的代码 我的比第2个少了一次sort,他的跑了1600m ...

  9. P1494 [国家集训队]小Z的袜子/莫队学习笔记(误

    P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小\(Z\)每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小\(Z\)再也无法忍受这恼人的找袜子过程,于是他 ...

  10. BZOJ2038 [2009国家集训队]小Z的袜子 莫队+分块

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

随机推荐

  1. AJPFX浅谈Java 性能优化之字符串过滤实战

    ★一个简单的需求 首先描述一下需求:给定一个 String 对象,过滤掉除了数字(字符'0'到'9')以外的其它字符.要求时间开销尽可能小.过滤函数的原型如下: String filter(Strin ...

  2. codevs 2761 脏话过滤

    时间限制: 1 s  空间限制: 8000 KB  题目等级 : 白银 Silver   题目描述 Description 某论坛希望打造文明论坛,对于每个帖子需要将脏话换成*输出. 脏话有38,25 ...

  3. MongoDB最简单的入门教程之二 使用nodejs访问MongoDB

    在前一篇教程 MongoDB最简单的入门教程之一 环境搭建 里,我们已经完成了MongoDB的环境搭建. 在localhost:27017的服务器上,在数据库admin下面创建了一个名为person的 ...

  4. Unity查找物体的四大主流方法及区别

    GameObject.Find()优点: 使用简单方便不会因为重名而报错,同时查找的是自上而下的第一个物体缺点 不能查找被隐藏的物体,否则出现“空引用异常”,这是很多新人在查找出现空引用bug的原因. ...

  5. liunx 中安装mysql 图形界面 phpmyadmin

    是浏览器图形界面 1. 安装mysql 图形管理工具. 2. 使用phpmyadmin 图像化工具. 3.下载地址  http://www.phpmyadmin.net/ 4. 查看是否安装这两个包 ...

  6. JVM 内存区域方面的面试题

    https://mp.weixin.qq.com/s/TpCElutqVSt7PAzjrGz12w 写在前面(常见面试题) 基本问题 •介绍下 Java 内存区域(运行时数据区)•Java 对象的创建 ...

  7. typescript知识教程

    https://ts.xcatliu.com/basics/type-of-function.html

  8. python导包一不小心就入坑(常用解决办法)

    常见导包报错: - ImportError:No module named - SystemError: Parent module '' not loaded, cannot perform rel ...

  9. MySQL系列(三)--数据库结构优化

    良好的数据库逻辑设计和物理设计是数据库高性能的基础,所以对于数据库结构优化是很有必要的 数据库结构优化目的: 1.减少数据的冗余 2.尽量避免在数据插入.删除和更新异常 例如:有一张设计不得当的学生选 ...

  10. vue之组件的使用(转载)

    在工程目录/src下的component文件夹下创建一个 firstcomponent.vue并写仿照 App.vue 的格式和前面学到的知识写一个组件. <template> <d ...