题意:

给定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. Android提供的对话框

    1.普通对话框: 给出提示信息,有yes.no两个按钮. AlertDialog dialog=new AlertDialog.Builder(this) //this代表当前Activity对象,表 ...

  2. kde framework概述(KDE Framework译文)

    KDE Frameworks 基于QT框架,提供简单实用的类(例如那些KCoreAddons里的类)去为桌面应用的日常需要整合出解决方案(例如KNewStuff用于在应用中获取可下载的附加内容,或者那 ...

  3. C#处理Android Audio and Video

    Video Converter for .NET (C#) FFMpeg wrapper http://www.nrecosite.com/video_converter_net.aspx Docum ...

  4. JavaScript 字符串与数字的相互转换

    js字符串转换成数字 js 字符串转换数字方法主要有三种:转换函数.强制类型转换.利用JS变量弱类型特点进行转换 1. 转换函数:js提供了parseInt()和parseFloat()两个转换函数. ...

  5. [Windows Server 2012] 安装IIS8.5及FTP

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:安装IIS ...

  6. 聊聊JavaScript和Scala的表达式 Expression

    我们先看下面这段简单的JavaScript代码. 我在第10行调用了函数f,其中传入的第二个和第三个参数都是一个逗号表达式. 函数f的实现,会检查这两个参数的类型,如果是函数,则执行函数调用,再打印其 ...

  7. (转)编码剖析Spring装配基本属性的原理

    http://blog.csdn.net/yerenyuan_pku/article/details/52856465 上回我们已经讲到了Spring依赖注入的第一种方式,现在我们来详解第二种方式,须 ...

  8. C3P0连接池工具类实现步骤及方法

    C3P0连接池的工具类 使用C3P0获得连接对象连接池有一个规范接口 javax.sal.DataSourse 接口定义了一个从连接池中获得连接的方法getConnection(); 步骤导入jar包 ...

  9. Unity3D windows平台视频录制录屏插件 UnityRecorder

    例子:从官方例子简单改了 using UnityEditor;using UnityEditor.Recorder;using UnityEditor.Recorder.Input;using Sys ...

  10. T1订正记-AC自动机-从树到图

    AC自动机已经足够棒了. 但是,好像有时还是要TLE的. 一般的AC自动还是比较好,如果在某些情况下还是会被卡掉,像是这个水题 考试的感觉 我看到这个题后,我清清楚楚的知道,这是个AC自动机+栈. 经 ...