点此看题面

大致题意: 有\(N\)只从\(1\sim N\)编号的袜子,告诉你每只袜子的颜色,\(M\)组询问,每组询问给你一个区间\([L\sim R]\),让你求出小Z随机抽出\(2\)只袜子时有多大概率抽到两只颜色相同的袜子。

题意转换

假设这些袜子中共有\(K\)种颜色,则对于第\(i\)种颜色的袜子,抽到两次的概率为$$\frac{cnt[i](cnt[i]-1)}{(R-L+1)(R-L)}$$

那么,在整个区间中抽到两只相同颜色的袜子的概率就是$$\sum_{i=1}^K\frac{cnt[i](cnt[i]-1)}{(R-L+1)(R-L)}$$

即$$\frac{\sum_{i=1}^Kcnt[i](cnt[i]-1)}{(R-L+1)(R-L)}$$

莫队

这时,我们就不难发现,对于一个区间,只要知道这个区间中每种颜色的袜子的出现次数就可以了。于是,就很容易想到用莫队来求解。

我们只要记录每种颜色的袜子的出现次数,并在每次更新指针的同时更新\(ans\)即可。

代码

#include<bits/stdc++.h>
#define LL long long
#define N 50000
#define M 50000
using namespace std;
LL n,Q,a[N+5],pos[N+5],ans1[M+5],ans2[M+5],cnt[N+5];
struct Query
{
LL l,r,pos;
}q[M+5];
inline char tc()
{
static char ff[100000],*A=ff,*B=ff;
return A==B&&(B=(A=ff)+fread(ff,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(LL &x)
{
x=0;char ch;
while(!isdigit(ch=tc()));
while(x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void write(LL x)
{
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
inline bool cmp(Query x,Query y)
{
return pos[x.l]<pos[y.l]||(pos[x.l]==pos[y.l]&&(pos[x.l]&1?x.r<y.r:x.r>y.r));
}
inline LL gcd(LL x,LL y)//求最大公因数,为之后的约分做准备
{
return y?gcd(y,x%y):x;
}
int main()
{
register LL i;
for(read(n),read(Q),i=1;i<=n;++i) read(a[i]),pos[i]=(i-1)/sqrt(n)+1;
for(i=1;i<=Q;++i) read(q[i].l),read(q[i].r),q[i].pos=i;
sort(q+1,q+Q+1,cmp);
LL ans=0,L=q[1].l,R=q[1].r;
for(i=L;i<=R;++i)//先暴力求解第一个问题的答案
{
if(++cnt[a[i]]) ans-=((cnt[a[i]]-1)*(cnt[a[i]]-2));
ans+=cnt[a[i]]*(cnt[a[i]]-1);
}
LL t1=ans,t2=(q[1].r-q[1].l+1)*(q[1].r-q[1].l),g=gcd(t1,t2);
ans1[q[1].pos]=t1/g,ans2[q[1].pos]=t2/g;
for(i=2;i<=Q;++i)
{
if(q[i].l==q[i].r)//题目中的附加说明,对于L=R的情况直接输出0/1
{
ans1[q[i].pos]=0,ans2[q[i].pos]=1;
continue;
}
while(L<q[i].l) ans-=cnt[a[L]]*(cnt[a[L]]-1),--cnt[a[L]],ans+=cnt[a[L]]*(cnt[a[L]]-1),++L;//若L指针小于当前询问的l,就先更新ans,再移动指针
while(L>q[i].l) --L,ans-=cnt[a[L]]*(cnt[a[L]]-1),++cnt[a[L]],ans+=cnt[a[L]]*(cnt[a[L]]-1);//若L指针大于当前询问的l,则操作顺序与上面的操作恰好相反
while(R>q[i].r) ans-=cnt[a[R]]*(cnt[a[R]]-1),--cnt[a[R]],ans+=cnt[a[R]]*(cnt[a[R]]-1),--R;//R指针的操作与L指针类似
while(R<q[i].r) ++R,ans-=cnt[a[R]]*(cnt[a[R]]-1),++cnt[a[R]],ans+=cnt[a[R]]*(cnt[a[R]]-1);
LL t1=ans,t2=(q[i].r-q[i].l+1)*(q[i].r-q[i].l),g=gcd(t1,t2);//注意约分
ans1[q[i].pos]=t1/g,ans2[q[i].pos]=t2/g;
}
for(i=1;i<=Q;++i) write(ans1[i]),putchar('/'),write(ans1[i]?ans2[i]:1),putchar('\n');
return 0;
}

【洛谷1494】[国家集训队] 小Z的袜子(莫队)的更多相关文章

  1. BZOJ 2038 [2009国家集训队]小Z的袜子 莫队

    2038: [2009国家集训队]小Z的袜子(hose) 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Descriptionw ...

  2. P1494 [国家集训队]小Z的袜子/莫队学习笔记(误

    P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小\(Z\)每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小\(Z\)再也无法忍受这恼人的找袜子过程,于是他 ...

  3. 洛谷 P1494 [国家集训队] 小Z的袜子

    题目概述: 小Z把N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务 ...

  4. BZOJ2038 [2009国家集训队]小Z的袜子 莫队+分块

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

  5. 洛谷P1494 [国家集训队]小Z的袜子

    Code: #include<cstdio> #include<iostream> #include<algorithm> #include<cstring& ...

  6. 洛谷 P1494 [国家集训队]小Z的袜子(莫队)

    题目链接:https://www.luogu.com.cn/problem/P1494 一道很经典的莫队模板题,然而每道莫队题的大体轮廓都差不多. 首先莫队是一种基于分块的算法,它的显著特点就是: 能 ...

  7. [日常摸鱼]bzoj2038[2009国家集训队]小Z的袜子-莫队算法

    今天来学了下莫队-这题应该就是这个算法的出处了 一篇别人的blog:https://www.cnblogs.com/Paul-Guderian/p/6933799.html 题意:一个序列,$m$次询 ...

  8. BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]

    BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...

  9. BZOJ 2038: [2009国家集训队]小Z的袜子

    二次联通门 : BZOJ 2038: [2009国家集训队]小Z的袜子 /* BZOJ 2038: [2009国家集训队]小Z的袜子 莫队经典题 但是我并不认为此题适合入门.. Answer = ∑ ...

  10. 【洛谷】1494:[国家集训队]小Z的袜子【莫队】

    P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… ...

随机推荐

  1. maven入门与常用插件使用

    maven不仅仅是一款管理jar包的工具,还可以

  2. (转)Linux系统sersync数据实时同步

    Linux系统sersync数据实时同步 原文:http://blog.csdn.net/mingongge/article/details/52985259 前面介绍了以守护进程的方式传输或同步数据 ...

  3. linux文件夹权限问题

    linux下 ls 某文件夹需要文件夹有 r 读权限. cd 某文件夹 需要文件夹有 x 运行权限 参考: http://www.linuxidc.com/Linux/2016-11/136959.h ...

  4. css样式查找遇到的问题汇总

    利用css简单排除元素的第一个子元素 例如:排除表格的第一行 /*除了表格的第一行其他都显示为红色*/ table tr+tr{ background-color:red;/*除了表格的第一行其他都显 ...

  5. 1、java线程模型

    要了解多线程,先需要把java线程模型搞清楚,否则有时候很难理清楚一个问题. 硬件多线程: 物理机硬件的并发问题跟jvm中的情况有不少相似之处,物理机的并发处理方案对于虚拟机也有相当大的参考意义.在买 ...

  6. LeetCode 319 ——Bulb Switcher——————【数学技巧】

    319. Bulb Switcher My Submissions QuestionEditorial Solution Total Accepted: 15915 Total Submissions ...

  7. JS常用的设计模式(4)——适配器模式

    去年年前当时正在开发dev.qplus.com, 有个存储应用分类id的js文件, 分类id的结构最开始设计的比较笨重. 于是我决定重构它. 我把它定义成一个json树的形式, 大概是这样: var ...

  8. [转]什么?你还不会写JQuery 插件

    本文转自:http://www.cnblogs.com/joey0210/p/3408349.html 前言 如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jque ...

  9. VS2015自定义类模板的方法

    在前一段时间忽然想给自己电脑上的vs新建类的时候添加一个自定义个注释,但是在网上搜了很久都是说vs2012之类的方法系统也都是win7.XP之类的独独没有win8的.故此自己不断的尝试修改发现方法如下 ...

  10. javascript: Convert special characters to HTML

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...