[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 [题意] 给定一个有颜色的序列,回答若干个询问:区间内任选两个颜色相同的概率. ...
随机推荐
- Python-自定义函数-参数
一.自定义函数参数 1.种类 (1)位置参数 "x"就是位置参数 #!/usr/bin/env python # -*- coding: utf-8 -*- #author: di ...
- Java实验3与第五周总结
1.已知字符串:"this is a test of java".按要求执行以下操作:(要求源代码.结果截图.) •统计该字符串中字母s出现的次数. •统计该字符串中子串" ...
- 利用Flot作基于时间段的曲线图
Flot是一个可以用于绘制多种图表的开源的JS库,Flot本身的功能已经是基本可以满足日常的需要啦,更可喜的是Flot还有很多的插件可以使用,从而为我们提供更加强大的定制功能,本文在作图中使用的显示坐 ...
- JS中值类型和引用类型
一.值类型 例子: var a=10; var b=a; a=20; console.log(b); 例子中,将a的值赋给了b,b=10,然后改变a的值不会影响b的值,a和b是独立的两份,互不影响. ...
- 数学: HDU1098 Ignatius's puzzle
Ignatius's puzzle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- 工作日记之查看Linux系统里面的启动频率2017_02_07
链接:http://www.jb51.net/LINUXjishu/19905.html 查看Linux里面的batch: cat /etc/crontab (1)0 19 * * 6 root /d ...
- css重置的各种版本总结
个人手机端常用到的: @charset "utf-8"; body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ...
- Hangfire
参考 开源分布式Job系统,调度与业务分离-如何创建一个计划HttpJob任务
- python2和3的一些区别,编码方式
python2与python3的区别: #python2 print() print'abc' #range() xrange()生成器 #raw_input()#python3 #print('ab ...
- json反序列化与pickle的用法
json反序列化与pickle 一.定义 序列化:将内存中的不可持久化和传输对象转换为可方便持久化和传输对象的过程. 反序列化:将可持久化和传输对象转换为不可持久化和传输对象的过程. 二. 应用场景 ...