[ BZOJ 2038 ] Hose
\(\\\)
Description
给出一个数列,多次询问,每次给出一个区间 \([l_i,r_i]\) ,问在区间中随意选两个位置不同的数,是同一个数的概率有多大。
- \(n,m\le 5\times 10^4\)
\(\\\)
Solution
莫队模板。
才发现自己还没有正经学过莫队
设 \(cnt[i]\) 表示 \(i\) 在 \([l,r]\) 中出现的个数,\(S\) 为这个区间的数集,一个区间的答案可以表示成:
\]
分母好说,考虑如何求分子,不妨展开一下。
\]
于是有一个机智的做法:我们设 \(ans\) 表示括号里面的东西。
每次区间移动时,假如 \(cnt[x]\to cnt[x]'\) ,那么对 \(ans\) 的更新有:
\]
就可以 \(O(1)\) 移动回答区间的左端点或右端点了。
关于询问的排序:左端点在同一个块内的按照右端点排序,不在同一个块内的按照左端点所在块排序。
这样每个块右端点至多移动 \(O(N)\),左端点至多移动 \(O(q\sqrt N)\) ,其中 \(q\) 是左端点在这个块内的询问个数。
总复杂度 \(O(N\sqrt N)\)
\(\\\)
Code
#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 50010
#define R register
#define gc getchar
using namespace std;
typedef long long ll;
inline ll rd(){
ll x=0; char c=gc();
while(!isdigit(c)) c=gc();
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return x;
}
ll ans,n,m,s[N],cnt[N],bl[N];
struct Q{ll l,r,id,ans1,ans2;}q[N];
inline bool cmp(Q x,Q y){
return bl[x.l]==bl[y.l]?x.r<y.r:bl[x.l]<bl[y.l];
}
inline bool cmp1(Q x,Q y){return x.id<y.id;}
inline ll C(ll x){return (x*(x-1)>>1);}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
inline void move(ll &llst,ll &rlst,ll lnew,ll rnew){
while(llst<lnew){
int x=cnt[s[llst]];
ans=ans-x*x+(x-1)*(x-1)+1;
--cnt[s[llst]]; ++llst;
}
while(llst>lnew){
--llst;
int x=cnt[s[llst]];
ans=ans-x*x+(x+1)*(x+1)-1;
++cnt[s[llst]];
}
while(rlst<rnew){
++rlst;
int x=cnt[s[rlst]];
ans=ans-x*x+(x+1)*(x+1)-1;
++cnt[s[rlst]];
}
while(rlst>rnew){
int x=cnt[s[rlst]];
ans=ans-x*x+(x-1)*(x-1)+1;
--cnt[s[rlst]]; --rlst;
}
}
int main(){
ll n=rd(),m=rd();
ll t=sqrt(n);
for(R ll i=1,cntt=1;i<=n;++i){
if(i%t==0) ++cntt;
bl[i]=cntt;
}
for(R ll i=1;i<=n;++i) s[i]=rd();
for(R ll i=1;i<=m;++i){q[i].l=rd();q[i].r=rd();q[i].id=i;}
sort(q+1,q+1+m,cmp);
ll lnow=1,rnow=1;
++cnt[s[1]];
for(R ll i=1,g;i<=m;++i){
if(q[i].l==q[i].r){
q[i].ans1=0;
q[i].ans2=1;
continue;
}
move(lnow,rnow,q[i].l,q[i].r);
g=gcd(ans/2,C(q[i].r-q[i].l+1));
q[i].ans1=ans/g/2;
q[i].ans2=C(q[i].r-q[i].l+1)/g;
}
sort(q+1,q+1+m,cmp1);
for(R int i=1;i<=m;++i) printf("%lld/%lld\n",q[i].ans1,q[i].ans2);
return 0;
}
[ BZOJ 2038 ] Hose的更多相关文章
- 【莫队】bzoj 3781,bzoj 2038,bzoj 3289
好像又有一个星期没更博客了.. 最近疯狂考试...唯一有点收获的就是学会了莫队这种神奇的算法.. 听起来很难..其实是一个很简单的东西.. 就是在区间处理问题时对于一个待求区间[L',R']通过之前求 ...
- [BZOJ 2038]小Z的袜子
传送门:BZOJ 2038 题意很明确,是在给定的区间内任意选取两个数,求选到两个相同的数的概率. 所以我们得首先统计在给定的区间内,相同的数对有多少对,那么这里就使用到了莫队算法.如果对莫队算法还不 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子
二次联通门 : BZOJ 2038: [2009国家集训队]小Z的袜子 /* BZOJ 2038: [2009国家集训队]小Z的袜子 莫队经典题 但是我并不认为此题适合入门.. Answer = ∑ ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7676 Solved: 3509[Subm ...
- Bzoj 2038: [2009国家集训队]小Z的袜子(hose) 莫队,分块,暴力
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 5763 Solved: 2660[Subm ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )
莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) --------------------------- ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 分块
分块大法好 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MB Submit: 2938 Solved: 13 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 9894 Solved: 4561[Subm ...
随机推荐
- wsdl2objc定制(一)namespace
1.问题抛出: 如今还是有非常多人使用 wsdl2objc 来调用webservice,可是有时候会有不开心的事情发生, <soap:Envelope xmlns:soap="http ...
- 图像处理之基础---opencv 开发的环境搭建
vs2010 opencv2.4.8 下载: vs2010 http://opencv.org/ 步骤: http://my.phirobot.com/blog/2014-02-opencv_conf ...
- 我的Android进阶之旅------>Android编译错误java.util.zip.ZipException: duplicate entry的解决方法
今天在Android Studio中把另外一个项目引入当前项目,编译的时候出现了java.util.zip.ZipException: duplicate entry错误. 错误例如以下所看到的: F ...
- BZOJ 3550 ONTAK2010 Vacation 单纯形
题目大意:给定一个长度为3n的区间.要求选一些数,且随意一段长度为n的区间内最多选k个数.求选择数的和的最大值 单纯形直接搞 注意一个数仅仅能被选一次 因此要加上xi<=1这个约束条件 不明确3 ...
- NYOJ1026 阶乘末尾非0 【模板】
阶乘末尾非0 时间限制:2000 ms | 内存限制:65535 KB 难度:3 描写叙述 我们的问题非常是简单.n! 末尾非0数是几? 比方n=5的时候,n! =120,那么n!末尾非0数是2. ...
- 优化tomcat配置(从内存、并发、缓存)优化
一.Tomcat内存优化 ** Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 java_OPTS 参数. JAVA_O ...
- Using Python with TurboGears A complete web framework integrating several Python projects
Using Python with TurboGears TurboGears is a Python web framework based on the ObjectDispatch paradi ...
- 【转】 Android Studio --“Cannot resolve symbol” 解决办法
Android Studio 无法识别同一个 package 里的其他类,将其显示为红色,但是 compile 没有问题.鼠标放上去后显示 “Cannot resolve symbol XXX”,重启 ...
- Masonry复杂ScrollView布局
前言 说到iOS自动布局,有很多的解决办法.有的人使用xib/storyboard自动布局,也有人使用frame来适配.对于前者,笔者并不喜欢,也不支持.对于后者,更是麻烦,到处计算高度.宽度等,千万 ...
- U-Boot编译过程完全分析
2.1 U-Boot Makefile分析 2.1.1 U-Boot编译命令 对于mini2440开发板,编译U-Boot需要执行如下的命令: $ make m ...