题目

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. ArcGIS 网络分析[2.5] VRP(车辆配送)【较难】

    什么是VRP? VRP就是车辆配送. 大家有没有想象过一个城市的某个快递营业点,是怎么让各个快递员配送快递的? 每个快递员针对那片区域的客户,如何走路线才最省时间? 也许你会说,最短路径分析可以做到— ...

  2. 日志管理工具之logrotate

    Logrotate配置和测试 logrotate软件是一个日志管理工具,用于非分隔日志,删除旧的日志文件,并创建新的日志文件,起到“转储作用”,可以为系统节省磁盘空间.logrotate是基于cron ...

  3. 仿9GAG制作过程(三)

    有话要说: 这次准备讲述后台服务器的搭建以及前台访问到数据的过程. 成果: 准备: 安装了eclipse 安装了Tomcat7 安装了数据库管理工具:Navicat 搭建服务器: 用eclipse直接 ...

  4. C#:在匿名方法中捕获外部变量

    先来一段代码引入主题.如果你可以直接说出代码的输出结果,说明本文不适合你.(代码引自<深入理解C#>第三版) class Program { private delegate void T ...

  5. Redis进阶学习笔记

    Redis是什么这里不用再说了吧?下面是官方的解释 Redis is an open source (BSD licensed), in-memory data structure store, us ...

  6. MongoDB副本集功能及节点属性梳理

    副本集的主要功能 副本集是MongoDB高可用的基础,其主要作用 归纳为以下几点: (1)高可用,防止设备(服务器.网络)故障.提供自动FailOver功能. (2)无需配置高可用性虚拟节点:无论是S ...

  7. php开发微信APP支付接口

    之前在开发APP中用到了微信支付,因为是第一次用,所以中途也遇到了好多问题,通过查看文档和搜集资料,终于完成了该功能的实现.在这里简单分享一下后台php接口的开发实例. 原文地址:代码汇个人博客 ht ...

  8. python进阶之正则表达式

    概念: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑. 目的? 给定一个正则表 ...

  9. Spring注解定时器使用

    一.首先要配置我们的spring-service.xml 1.xmlns 多加下面的内容 xmlns:task="http://www.springframework.org/schema/ ...

  10. .NET CORE学习笔记系列(6)——KestrelServer

    原文:http://www.cnblogs.com/artech/p/KestrelServer.html 跨平台是ASP.NET Core一个显著的特性,而KestrelServer是目前微软推出了 ...