[BZOJ2038]:[2009国家集训队]小Z的袜子(hose)(离线莫队)
题目传送门
题目描述
作为一个生活散漫的人,小$Z$每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……
具体来说,小$Z$把这$N$只袜子从$1$到$N$编号,然后从编号$L$到$R$($L$尽管小$Z$并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬)。
你的任务便是告诉小$Z$,他有多大的概率抽到两只颜色相同的袜子。当然,小$Z$希望这个概率尽量高,所以他可能会询问多个$(L,R)$以方便自己选择。
输入格式
输入文件第一行包含两个正整数$N$和$M$。
$N$为袜子的数量,$M$为小$Z$所提的询问的数量。
接下来一行包含$N$个正整数$C_i$,其中$C_i$表示第$i$只袜子的颜色,相同的颜色用相同的数字表示。
再接下来$M$行,每行两个正整数$L$,$R$表示一个询问。
输出格式
包含$M$行,对于每个询问在一行中输出分数$A/B$表示从该询问的区间$[L,R]$中随机抽出两只袜子颜色相同的概率。
若该概率为$0$则输出$0/1$,否则输出的$A/B$必须为最简分数。(详见样例)
样例
样例输入
6 4
1 2 3 3 3 2
2 6
1 3
3 5
1 6
样例输出
2/5
0/1
1/1
4/15
数据范围与提示
样例解释:
询问1:共$C_5^2=10$种可能,其中抽出两个$2$有$1$种可能,抽出两个$3$有$3$种可能,概率为$\frac{1+3}{10}=\frac{4}{10}=2/5$。
询问2:共$C_3^2=3$种可能,无法抽到颜色相同的袜子,概率为$\frac{0}{3}=0/1$。
询问3:共$C_3^2=3$种可能,均为抽出两个$3$,概率为$\frac{3}{3}=1/1$。
注:上述$C_a^b$表示组合数,组合数$C_a^b$等价于在$a$个不同的物品中选取$b$个的选取方案数。
数据规模与约定:
30%的数据中,$N,M\leqslant 5,000$;
60%的数据中,$N,M\leqslant 25,000$;
100%的数据中,$N,M\leqslant 50,000$,$1\leqslant L<R\leqslant N$,$C_i\leqslant N$。
题解
设区间中有$k$个不同的颜色,每种颜色有$s[i]$个,答案就是:$\sum \limits_{i=1}{k}\frac{C_{s_i}^2}{C_n^2}$。
之后发现只要维护$s_i^2$即可,在移动左右端点时开个桶就能简单地维护出来。
化一下上面的式子,你会发现其实答案就是:$\sum \limits_{i=1}{k}\frac{(s_i-1)\times s_i}{(n-1)\times n}$,这样在代码实现上就简单多了。
代码时刻
#include<bits/stdc++.h>
using namespace std;
struct rec
{
int l;
int r;
int id;
int pos;
}q[50001];
int n,m;
int a[50001];
int cnt[50001];
long long ans;
long long a1[50001],a2[50001];
bool cmp(rec a,rec b){return a.pos==b.pos?a.r<b.r:a.pos<b.pos;}
void upd(int x,int w)//计算答案
{
ans-=cnt[a[x]]*cnt[a[x]];
cnt[a[x]]+=w;
ans+=cnt[a[x]]*cnt[a[x]];
}
int main()
{
scanf("%d%d",&n,&m);
int t=sqrt(n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i;
q[i].pos=(q[i].l-1)/t+1;
}
sort(q+1,q+m+1,cmp);
int l=1,r=0;
for(int i=1;i<=m;++i)
{
while(l<q[i].l)upd(l++,-1);
while(l>q[i].l)upd(--l,1);
while(r<q[i].r)upd(++r,1);
while(r>q[i].r)upd(r--,-1);
if(l==r){a1[i]=0,a2[i]=1;}
long long x=ans-(r-l+1);//分子
long long y=(long long)(q[i].r-q[i].l+1)*(q[i].r-q[i].l);//分母
long long g=__gcd(x,y);//约分
a1[q[i].id]=x/g,a2[q[i].id]=y/g;
}
for(int i=1;i<=m;i++)
cout<<a1[i]<<'/'<<a2[i]<<endl;
return 0;
}
rp++
[BZOJ2038]:[2009国家集训队]小Z的袜子(hose)(离线莫队)的更多相关文章
- BZOJ2038 2009国家集训队 小Z的袜子(hose) 【莫队】
BZOJ2038 2009国家集训队 小Z的袜子(hose) Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼 ...
- [bzoj2038][2009国家集训队]小Z的袜子(hose)_莫队
小Z的袜子 hose 2009-国家集训队 bzoj-2038 题目大意:给定一个n个袜子的序列,每个袜子有一个颜色.m次询问:每次询问一段区间中每种颜色袜子个数的平方和. 注释:$1\le n,m\ ...
- BZOJ2038 [2009国家集训队]小Z的袜子(hose)(莫队算法)
神奇的莫队算法,用来解决可离线无修改的区间查询问题: 首先对原序列进行分块,√n块每块√n个: 然后对所有查询的区间[l,r]进行排序,首先按l所在的块序号升序排序,如果一样就按r升序排序: 最后就按 ...
- BZOJ_2038_[2009国家集训队]小Z的袜子(hose)_莫队
BZOJ_2038_[2009国家集训队]小Z的袜子(hose)_莫队 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 9894 Solved: 4561[Subm ...
- 2038: [2009国家集训队]小Z的袜子(hose) (莫队算法)
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 专题练习: http://acm.hust.edu.cn/vjudge/conte ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 【莫队算法】
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 【莫队算法模版】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题意概括: 有 N 只袜子(分别编号为1~N),有 M 次查询 (L, R)里面随机 ...
- BZOJ:2038: [2009国家集训队]小Z的袜子(hose)(莫队算法模板)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 解题心得: 第一次接触莫队算法,很神奇,很巧妙.莫队算法主要就是用来解决多次询问时 ...
- bzoj 2038 [2009国家集训队]小Z的袜子(hose)(莫队算法)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2038 [题意] 给定一个有颜色的序列,回答若干个询问:区间内任选两个颜色相同的概率. ...
随机推荐
- 分享一个linux系统中采用嵌套for循环比较两个数组内容,并输出相同值的shell脚本
#!/bin/bash array1=(1 3 5 6 7 9) array2=(3 4 9) echo array1=${array1[@]} echo array2=${array2[@]} fo ...
- jenkins shell 取当前时间
now=`date +%Y%m%d%H%M%S` echo $now newfilename=abc_${now}.warfor i in `ls *.jmx`:dojmeter -n -t $i r ...
- 【Linux 环境搭建】Ubuntu下安装tftp
1.安装软件 sudo apt-get install tftp-hpa tftpd-hap xinetd 2.修改配置文件 sudo vim /etc/default/tftpd-hpa ...
- Linux 查看CPU 核数 还有 CPU 个数的命令
cat /proc/cpuinfo | grep 'physical id' | sort | uniq | wc -l 个数 cat /proc/cpuinfo | grep 'process' | ...
- 2017沈阳区域赛Infinite Fraction Path(BFS + 剪枝)
Infinite Fraction Path Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java ...
- Bootstrap字体图标Font-Awesome 使用教程
转载自:https://blog.csdn.net/crper/article/details/46293295 以备记录使用.
- 腾讯云从零搭建PHP运行环境
一.首先我们得注册腾讯云,租用一台服务器,我选择的是CentOS 7.2 64位,这时候会给你这台主机的公网IP和内网IP,以及这台主机的用户名及密码. 二.我们可以使用腾讯云网页上自带的登录按钮进行 ...
- Node+Express+MySql实现简单增删改查和登录
var express = require('express'); var mysql = require('mysql'); var app = express(); var bodyParser ...
- POJ 3414 Pots (BFS/DFS)
Pots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7783 Accepted: 3261 Special Ju ...
- 计算机系统结构总结_Multiprocessor & cache coherence
Textbook:<计算机组成与设计——硬件/软件接口> HI<计算机体系结构——量化研究方法> QR 最后一节来看看如何实现parallelism 在多处 ...