【BZOJ2038】小Z的袜子(莫队)
题意:
给定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的袜子(莫队)的更多相关文章
- BZOJ2038 小Z的袜子 莫队
BZOJ2038 题意:q(5000)次询问,问在区间中随意取两个值,这两个值恰好相同的概率是多少?分数表示: 感觉自己复述的题意极度抽象,还是原题意有趣(逃: 思路:设在L到R这个区间中,x这个值得 ...
- [国家集训队][bzoj2038] 小Z的袜子 [莫队]
题面: 传送门 思路: 又是一道标准的莫队处理题目,但是这道题需要一点小改动:求个数变成了求概率 我们思考:每次某种颜色从i个增加到i+1个,符合要求的情况多了多少? 原来的总情况数是i*(i-1)/ ...
- 【填坑向】bzoj2038小Z的袜子 莫队
学莫队必做题,,,但是懒得写.今天来填个坑 莫队水题 莫队实际上就是按一个玄学顺序来离线计算询问,保证复杂度只会多一个n1/2,感觉是玄学(离线算法都很玄学) 易错点:要开long long(卡我半天 ...
- BZOJ2038 小Z的袜子(莫队之源)
题意+思路: 给你m个区间询问,问每个区间内的$\displaystyle \frac{\sum x^2-(R-L+1)}{(R-L)(R-L+1)} $,其中x为每种数字的个数,用cnt存储: 所以 ...
- 小Z的袜子 & 莫队
莫队学习 & 小Z的袜子 引入 莫队 由莫涛巨佬提出,是一种离线算法 运用广泛 可以解决广大的离线区间询问题 莫队的历史 早在mt巨佬提出莫队之前 类似莫队的算法和莫队的思想已在Codefor ...
- BZOJ 2038 [2009国家集训队]小Z的袜子 莫队
2038: [2009国家集训队]小Z的袜子(hose) 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Descriptionw ...
- 【国家集训队2010】小Z的袜子[莫队算法]
[莫队算法][国家集训队2010]小Z的袜子 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程, ...
- bzoj 2308 小Z的袜子(莫队算法)
小Z的袜子 [题目链接]小Z的袜子 [题目类型]莫队算法 &题解: 莫队算法第一题吧,建议先看这个理解算法,之后在参考这个就可以写出简洁的代码 我的比第2个少了一次sort,他的跑了1600m ...
- P1494 [国家集训队]小Z的袜子/莫队学习笔记(误
P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小\(Z\)每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小\(Z\)再也无法忍受这恼人的找袜子过程,于是他 ...
- BZOJ2038 [2009国家集训队]小Z的袜子 莫队+分块
作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从 ...
随机推荐
- 序列化pickle模块
1.pickle模块 pickle.dumps() 和pickle.loads() import pickle f = open('112.pkl','w') a = {'name':2,2:3,3: ...
- 自定义 TypeHandler
自定义TypeHandler分为三个步骤: 1.编写自定义TypeHandler,并继承自抽象类BaseTypeHandler<T>,实现抽象方法 2.在mybatis-config.xm ...
- 李开复:AlphaGo 若打败了世界冠军,意味着什么?
创新工场董事长李开复在知乎就AlphaGo与李世石的人机大战发表了自己看法,他认为四个月前的AlphaGo击败李世石基本不可能,不过这四个月AlphaGo进步很多,比赛应该很精彩.但是,无论这次结果如 ...
- WEB前端研发工程师编程能力成长之路(2)(转)
WEB前端研发工程师编程能力成长之路(2) 四.[入微] 最强解决方案.你能够走在需求的前面,将当前需求里有的.没有直接提出来的.现在暂时没有但将来可能有的等等,及前端编程潜规则等各个方方面面都综 ...
- SQLite -创建数据库
SQLite -创建数据库 SQLite sqlite3命令用于创建新的SQLite数据库.你不需要有任何特权来创建一个数据库. 语法: sqlite3命令的基本语法如下: $sqlite3 Data ...
- $.noconflict() 有什么用处
jQuery默认使用"$"操作符,prototype等其他框架也是是使用"$",于是,如果jQuery在其他库之后引入,那么jQuery将获得"$&q ...
- 使用Spring AOP切面解决数据库读写分离
http://blog.jobbole.com/103496/ 为了减轻数据库的压力,一般会使用数据库主从(master/slave)的方式,但是这种方式会给应用程序带来一定的麻烦,比如说,应用程序如 ...
- mybatis中配置中引入properties文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...
- 解决aspnet上传文件大小限制
<system.web> <httpRuntime executionTimeout="600" maxRequestLength="20480& ...
- 【转】解决WPF图片模糊最佳方法(绑定PixelWidth与PixelHeight)
解决WPF图片模糊最佳方法(绑定PixelWidth与PixelHeight) 转载自:http://www.360doc.com/content/13/1126/09/10504424_332211 ...