【洛谷1494】[国家集训队] 小Z的袜子(莫队)
大致题意: 有\(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的袜子(莫队)的更多相关文章
- BZOJ 2038 [2009国家集训队]小Z的袜子 莫队
2038: [2009国家集训队]小Z的袜子(hose) 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Descriptionw ...
- P1494 [国家集训队]小Z的袜子/莫队学习笔记(误
P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小\(Z\)每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小\(Z\)再也无法忍受这恼人的找袜子过程,于是他 ...
- 洛谷 P1494 [国家集训队] 小Z的袜子
题目概述: 小Z把N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务 ...
- BZOJ2038 [2009国家集训队]小Z的袜子 莫队+分块
作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从 ...
- 洛谷P1494 [国家集训队]小Z的袜子
Code: #include<cstdio> #include<iostream> #include<algorithm> #include<cstring& ...
- 洛谷 P1494 [国家集训队]小Z的袜子(莫队)
题目链接:https://www.luogu.com.cn/problem/P1494 一道很经典的莫队模板题,然而每道莫队题的大体轮廓都差不多. 首先莫队是一种基于分块的算法,它的显著特点就是: 能 ...
- [日常摸鱼]bzoj2038[2009国家集训队]小Z的袜子-莫队算法
今天来学了下莫队-这题应该就是这个算法的出处了 一篇别人的blog:https://www.cnblogs.com/Paul-Guderian/p/6933799.html 题意:一个序列,$m$次询 ...
- BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]
BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...
- BZOJ 2038: [2009国家集训队]小Z的袜子
二次联通门 : BZOJ 2038: [2009国家集训队]小Z的袜子 /* BZOJ 2038: [2009国家集训队]小Z的袜子 莫队经典题 但是我并不认为此题适合入门.. Answer = ∑ ...
- 【洛谷】1494:[国家集训队]小Z的袜子【莫队】
P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… ...
随机推荐
- <?>与<T>的区别
?是通配符(占位符),可以表示任意一个,T只是一种替代,只能表示其中一个 假设有A,B,C三个类 <?>可以是A,B,C任意一个,每一个<?>之间没有关联 <T>如 ...
- 启动Kafka
启动zookeeper 使用命令查看zookeeper是否启动成功: 启动kafka Brokerr 使用命令查看kafka Broker是否启动更成功 在kafka中创建topic 'test' b ...
- VUE项目引入微信jssdk
npm i -S weixin-js-sdkimport wx from 'weixin-js-sdk'
- DNS服务器设置
1,域名解析:ip能够访问,但是域名不能访问. 2,配置好网络之后,切换到命令行模式,配置好的网络便不能用了. 具体方法: 打开vim /etc/sysconfig/network-scripts/i ...
- select简单示例,有注释
全部都在代码中: import select import socket import queue """ 简单的select 实现echo server 个人理解: s ...
- python list常见用法
来至builtins.py: def extend(self, iterable): # real signature unknown; restored from __doc__ "&qu ...
- pat1015. Reversible Primes (20)
1015. Reversible Primes (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A r ...
- SpringBoot | 第二十七章:监控管理之Actuator使用
前言 随着我们服务越来越多,部署的环境也越来越繁多时,由于各服务都部署在不同的机器上,每当出现问题或者异常时,想快速进行问题的定位就变的麻烦了.所以,本章节开始,开始讲解SpringBoot的监控相关 ...
- Java学习第十九天
1:异常(理解) (1)程序出现的不正常的情况. (2)异常的体系 Throwable |--Error 严重问题,我们不处理. |--Exception |--RuntimeException 运行 ...
- 几道web题简单总结
拖了好长时间,总结一下这一段时间做的几道值得记录一下的题目,有的没做出来,但是学习到了新的东西 1.homebrew event loop ddctf的一道题目,学到了python eval函数的用法 ...