【题意】给定n个数字ai,每次询问一个区间中随机抽选两个数字,数字相同的概率,以分数最简形式输出。n,ai<=50000。

【算法】莫队算法

【题解】参考:莫队……讲稿? by Foreseeable

使用莫队算法的关键在于维护区间信息的增减。

对于区间[L,R],令其中数字i的出现次数为xi,则ans=[ ΣC(xi,2) ] / [ C(Σxi,2) ]。

化简可得,ans=Σx^2-(r-l+1)/C(r-l+1,2)

维护A数组表示每个数字出现次数,每次区间移动一格:减,变,加。

异块按左坐标排序,同块按右坐标排序。

莫队别忘了分块

优化:

1.奇偶分块:根据块编号的奇偶性,奇数块内r升序,偶数块内r降序。

2.块大小:block=n/sqrt(m*2/3)。

#include<cstdio>
#include<cctype>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
int read(){
int s=,t=;char c;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
const int maxn=;
int n,m,a[maxn],be[maxn],block;
ll c[maxn],sum,ansA[maxn],ansB[maxn];
struct cyc{int l,r,id;}b[maxn];
bool cmp(cyc a,cyc b){return be[a.l]^be[b.l]?a.l<b.l:(be[a.l]&?a.r<b.r:a.r>b.r);}
ll gcd(ll a,ll b){return !b?a:gcd(b,a%b);}
void modify(int x,int p){
//printf("%d %d\n",x,p);
sum-=c[a[x]]*c[a[x]];
c[a[x]]+=p;
sum+=c[a[x]]*c[a[x]];
}
int main(){
n=read();m=read();
for(int i=;i<=n;i++)a[i]=read();
block=(int)(1.0*n/sqrt(1.0*m*/));
for(int i=;i<=n;i++)be[i]=(i-)/block+;
for(int i=;i<=m;i++)b[i].l=read(),b[i].r=read(),b[i].id=i;
sort(b+,b+m+,cmp);
int L=,R=;
sum=;//
for(int i=;i<=m;i++){
for(int j=L-;j>=b[i].l;j--)modify(j,);
for(int j=R+;j<=b[i].r;j++)modify(j,);
for(int j=L;j<=b[i].l-;j++)modify(j,-);
for(int j=R;j>=b[i].r+;j--)modify(j,-);
ll A=sum-(b[i].r-b[i].l+),B=1ll*(b[i].r-b[i].l+)*(b[i].r-b[i].l);
ll g=gcd(A,B);
ansA[b[i].id]=A/g;ansB[b[i].id]=B/g;
L=b[i].l;R=b[i].r;
}
for(int i=;i<=m;i++)printf("%lld/%lld\n",ansA[i],ansB[i]);
return ;
}

【BZOJ】2038: [2009国家集训队]小Z的袜子(hose)的更多相关文章

  1. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

  2. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7676  Solved: 3509[Subm ...

  3. Bzoj 2038: [2009国家集训队]小Z的袜子(hose) 莫队,分块,暴力

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 5763  Solved: 2660[Subm ...

  4. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )

    莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) --------------------------- ...

  5. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 分块

    分块大法好 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 2938  Solved: 13 ...

  6. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 9894  Solved: 4561[Subm ...

  7. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)&&莫对算法

    这里跟曼哈顿最小生成树没有太大的关系. 时间复杂度证明: [BZOJ2038 小Z的袜子 AC代码] 排序方式: 第一关键字:l所在的块: 第二关键字:r从小到大. #include<cstdi ...

  8. 洛谷 P1494 BZOJ 2038 [2009国家集训队]小Z的袜子(hose)

    //洛谷题面字体.排版我向来喜欢,却还没收录这道如此有名的题,BZOJ的题面字体太那啥啦,清橙的题面有了缩进,小标题却和正文字体一致,找个好看的题面咋这么难呐………… //2019年3月23日23:0 ...

  9. bzoj 2038: [2009国家集训队]小Z的袜子(hose) (莫队)

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

  10. 【刷题】BZOJ 2038 [2009国家集训队]小Z的袜子(hose)

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

随机推荐

  1. 《剑指offer》--- 两个链表的第一个公共结点

    本文算法使用python3实现 1. 问题   输入两个链表,找出它们的第一个公共结点.   时间限制:1s:空间限制:32768K 2 思路描述   使用两个指针 $ p1,p2 $ 分别指向两个链 ...

  2. python 将base64字符串还原为图片

    今天弄验证码的时候发现,验证码的图片的src竟然是下面的这么一个一串字符串,吓到,好像不可以http请求的,第一次见,就好尴尬,去网上搜索了一下,说是: 这是Data URI scheme. data ...

  3. 软工alpha阶段个人总结

    一.个人总结 类别 具体技能和面试问题 现在的回答(大三下) 语言 最拿手的语言之一,代码量是多少? java,代码量在一万行左右 语言 最拿手的语言之二,代码量是多少? C语言,代码量在五千行左右 ...

  4. (双人项目)四则运算 组员:杨钰宁 闫浩楠 开发语言:Python。

    需求分析:1.适用人群:小学生. 2.能进行“+,—,*,/” 的四则运算.难度可以随时修改. 3.提交试卷后可以显示所得分数并显示错题个数. 4.可以显示答对的题及其打错的题的序号. 代码如下: i ...

  5. 【Leetcode】50. Pow(x, n)

    Implement pow(x, n). Example 1: Input: 2.00000, 10 Output: 1024.00000 Example 2: Input: 2.10000, 3 O ...

  6. 利用canvas对上传图片进行上传前压缩

    利用谷歌调式工具发现,图片大小直接影响着首屏加载时间. 且考虑到后期服务端压力,图片压缩特别必要. 本文是前端利用canvas实现图片.参考文章:https://www.cnblogs.com/007 ...

  7. 还原 listagg/wm_concat 后的数据 pack_split_listatt ;

    1.创建表并制作测试数据: --创建测试表 : CREATE TABLE split_table ( NAME ), ID ) ); --准备测试数据 : INSERT INTO split_tabl ...

  8. bootstrap心得

    最近在弄个人的博客,之前对bootstrap的使用老是感觉使用的一般 幸好在看了慕课网的一个老师的实例教程之后,才感觉是真正对前端使用bootstrap有了一点理解 首先就是. 这些标签,其实都是相当 ...

  9. 【php】set_include_path和get_include_path用法详解

    目的:在框架中方便加载文件 参考:http://blog.sina.com.cn/s/blog_4ce89f200100twbl.html 如果我们没有设置这个值,可能我们需要写一些完全的路径:    ...

  10. Android内存泄漏第一课【转】--------(使用单例模式造成的内存泄漏)

    使用单例模式造成的内存泄漏 Android的单例模式在我们项目开发中经常会用到,不过使用的不恰当的话也会造成内存泄漏.因为单例的静态特性使得单例的生命周期和应用的生命周期一样长, 这就说明了如果一个对 ...