题意:

给定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. Andriod 简介

    Andriod系统采用分层架构,分为4层: 应用程序层(Applications) 包含所有安装在手机上的应用程序(包括系统自带的程序) 应用程序框架层(Application Framework) ...

  2. 模拟ssh的远程网络传输

    粘包产生的原因分析: 第一点:客户端向服务端发起命令请求,服务端接受命令请求,并返回对应的信息,如果信息过大,客户端一次接受不了,那么下一次请求依然返回 上一个命令的内容,就出现了粘包的情况. 第二点 ...

  3. chrome inspect出现白屏的解决方案

    点inspect后 弹出框,可是里面一片白色 PS:原效果不是这样,只是图找不到随便p的 原因可以看这个:http://www.cnblogs.com/slmk/p/7591126.html 大概意思 ...

  4. MVC之在实例中的应用

    MVC模式在Java Web应用程序中的实例分析 1. 结合六个基本质量属性 1)可用性 2)可修改性 3)性能 4)安全性 5)可测试性 6)易用性 2. 分析具体功能模块的MVC设计实现(例如登录 ...

  5. python3 进程与线程

    1.进程定义 狭义的定义: 进程是正在运行的程序的实例. 广义的定义:进程是一个具有 一定独立功能的程序关于某个数据集合的一次运行活动.它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体.它 ...

  6. python基础一 day5 复习

    bytes类型默认编码方式是utf-8和gbk,反正不是unicode strn内部的编码方式是Unicode         range相当于只有一次,第一次之后相当于一个有序列表.range顾头不 ...

  7. JavaScript/JQuery radioButton(单选按钮)练习20190409

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. java中等待所有线程都执行结束

    转自:http://blog.csdn.net/liweisnake/article/details/12966761 今天看到一篇文章,是关于java中如何等待所有线程都执行结束,文章总结得很好,原 ...

  9. process data

    # version 1.0def connect_mysql(sql, oper_type="select", data_l=None): conn = pymysql.conne ...

  10. linux下tomcat服务的相关命令

    一:Linux下tomcat服务的启动.关闭与错误跟踪,使用PuTTy远程连接到服务器以后,通常通过以下几种方式启动关闭tomcat服务:切换到tomcat主目录下的bin目录(cd usr/loca ...