题目

P1494 [国家集训队]小Z的袜子

解析

  1. 在区间\([l,r]\)内,

    任选两只袜子,有

\[r-l+1\choose2
\]

\[=\frac{(r-l+1)!}{2!(r-l-1)!}
\]

\[=\frac{(r-l+1)(r-l)}{2}
\]

种选择。

  1. 对于一种颜色

    设在区间\([l,r]\)内出现次数为\(cnt_i\)

    从\(cnt_i\)只这种颜色的袜子里任选两只

    就有$$cnt_i\choose2$$

\[=\frac{cnt_i!}{2!(cnt_i-2)!}
\]

\[=\frac{(cnt_i)(cnt_i-1)}{2!}
\]

\[=\frac{cnt_i^2-cnt_i}{2}
\]

种方案。

3. 那对于区间内所有颜色的袜子,任选两只颜色相同的方案是

\[\sum_{i=l}^r \frac{cnt_i^2-cnt_i}{2}
\]

\[=\frac{\sum_{i=l}^rcnt_i- \sum_{i=l}^rcnt_i}{2}
\]

这样得到能抽到两只相同颜色的袜子概率是

\[\frac{\frac{\sum_{i=l}^rcnt_i^2- \sum_{i=l}^rcnt_i}{2}}{\frac{(r-l+1)(r-l)}{2}}
\]

\[=\frac{\sum_{i=l}^rcnt_i^2- \sum_{i=l}^rcnt_i}{(r-l+1)(r-l)}
\]

因为区间内所有颜色的袜子出现的次数加起来就是区间长度\(r-l+1\)

所以就有

\[\frac{\sum_{i=l}^rcnt_i^2- (r-l+1)}{(r-l+1)(r-l)}
\]

这样对于一个询问的区间,\(r-l+1\)是一定值,这样,我们就只需要用莫队维护\(cnt_i^2\)得到的价值就可以了。

当新加入一个元素的时候\((cnt_i+1)^2=cnt_i^2+2cnt_i+1\),sum就加上\(2cnt_i+1\)。

删除一个元素的时候,sum就减去\(2cnt_i-1\)即可。

最后注意特判分子等于0的情况,否则会RE。

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5e4 + 10;
int n, m, num, sum;
int fz[N], fm[N], a[N], cnt[N];
class node {
public :
int l, r, id, block;
bool operator < (const node &oth) const {
return this->block != oth.block ? this->l < oth.l : (this->block & 1 ? this->r < oth.r : this->r > oth.r);
}
} e[N]; template<class T>inline void read(T &x) {
x = 0; int f = 0; char ch = getchar();
while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
x = f ? -x : x;
return;
} inline void add(int x) {sum += (cnt[a[x]] * 2 + 1), cnt[a[x]]++;}; inline void del(int x) {sum -= (cnt[a[x]] * 2 - 1), cnt[a[x]]--;}; int gcd(int a, int b) {return b == 0 ? a : gcd(b, a % b);} signed main() {
read(n), read(m);
int k = sqrt(n);
for (int i = 1; i <= n; ++i) read(a[i]);
for (int i = 1, x, y; i <= m; ++i) {
read(x), read(y);
e[i] = (node) {x, y, i, x / k + 1};
}
sort(e + 1, e + 1 + m);
int l = 1, r = 0;
for (int i = 1; i <= m; ++i) {
int ll = e[i].l, rr = e[i].r;
while (l < ll) del(l++);
while (l > ll) add(--l);
while (r < rr) add(++r);
while (r > rr) del(r--);
if (ll == rr) {
fz[e[i].id] = 0;
fm[e[i].id] = 1;
continue;
}
fz[e[i].id] = sum - (rr - ll + 1), fm[e[i].id] = (rr - ll + 1) * (rr - ll);
int GCD = gcd(fz[e[i].id], fm[e[i].id]);
fz[e[i].id] /= GCD, fm[e[i].id] /= GCD;
}
for (int i = 1; i <= m; ++i) {
if (fz[i] == 0) printf("0/1\n");
else printf("%lld/%lld\n", fz[i], fm[i]);
}
}

P1494 [国家集训队]小Z的袜子的更多相关文章

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

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

  2. P1494 [国家集训队]小Z的袜子(luogu)

    P1494 小Z的袜子 终于了解了莫队算法(更专业的名称Square Root Decomposition of Queries) 莫队算法: 一般来说解决静态(实际上也有修改的但复杂度更高)的离线( ...

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

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

  4. luogu P1494 [国家集训队]小Z的袜子 ( 普 通 )

    题目:    链接:https://www.luogu.org/problemnew/show/P1494 题意:一些袜子排成一排,每个袜子有固定的颜色.                        ...

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

    题目链接:https://www.luogu.org/problemnew/show/P1494 题目大意:中文题目 具体思路:计算概率的时候,每一次是区间的移动,每一次移动,记得先将原来的记录的影响 ...

  6. Luogu P1494 [国家集训队]小Z的袜子

    比较简单的莫队题,主要是为了熟练板子. 先考虑固定区间时我们怎么计算,假设区间\([l,r]\)内颜色为\(i\)的袜子有\(cnt_i\)只,那么对于颜色\(i\)来说,凑齐一双的情况个数为: \( ...

  7. 【luogu P1494 [国家集训队]小Z的袜子】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1494 #include <cstdio> #include <algorithm> ...

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

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

  9. P1494 [国家集训队]小Z的袜子(莫队算法)

    莫队板子 代码 #include <cstdio> #include <algorithm> #include <cstring> #include <cma ...

随机推荐

  1. windows蓝屏代码

    原始链接 引用自  https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/bug-check-code-referenc ...

  2. Fragment 生命周期的详情

    Fragment每个生命周期方法的意义.作用(注意红色的不是生命周期方法):setUserVisibleHint():设置Fragment可见或者不可见时会调用此方法.在该方法里面可以通过调用getU ...

  3. shell判断USB接口是否有设备插入

    #/bin/sh usb_num=$(cat /proc/scsi/scsi | grep "Vendor" | wc -l)if [ $usb_num = 2 ];then    ...

  4. SQL 创建分区表

    (以项目中实际使用的GNSS库为例) 背景:数据量巨大,定时创建月表存放数据,月表中数据存放在不同的文件组中来提高查询效率   一.创建数据库,添加文件组 除了逻辑文件和物理文件的分离之外,SQL S ...

  5. access denied for user 'root'@'localhost'(using password:YES) FOR WINDOWS

    以windows为例: mysql5.5 1. 关闭正在运行的MySQL服务. 2. 打开DOS窗口,转到mysql\bin目录. 3. 输入mysqld --skip-grant-tables 回车 ...

  6. Burpsuite 之intruder

    首先工具:Burpsuite1.7,DVWA,火狐浏览器代理插件,火狐浏览器,密码字典(以下用Bp代指burpsuite) 启动Bp,启动DVWA,并打开本地代理功能 ​ 开启bp的拦截功能,并在dv ...

  7. #021 Java复习第一天

    上学期在慧河工作室学习简单过java到面向对象就停止了 现在有事情又要用到java发现全忘了..... 快速复习一下 网课PPT 计算机: 硬件 + 软件 主要硬件: cpu :cpu是一个计算机的运 ...

  8. 英语口语练习系列-C06-购物

    <水调歌头>·苏轼 明月几时有,把酒问青天. 不知天上宫阙,今夕是何年? 我欲乘风归去,又恐琼楼玉宇, 高处不胜寒. 起舞弄清影,何似在人间! 转朱阁,低绮户,照无眠. 不应有恨,何事长向 ...

  9. .NET CORE学习笔记系列(2)——依赖注入【2】基于IoC的设计模式

    原文:https://www.cnblogs.com/artech/p/net-core-di-02.html 正如我们在<控制反转>提到过的,很多人将IoC理解为一种“面向对象的设计模式 ...

  10. HBase案例:HBase 在人工智能场景的使用

    近几年来,人工智能逐渐火热起来,特别是和大数据一起结合使用.人工智能的主要场景又包括图像能力.语音能力.自然语言处理能力和用户画像能力等等.这些场景我们都需要处理海量的数据,处理完的数据一般都需要存储 ...