[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 [题意] 给定一个有颜色的序列,回答若干个询问:区间内任选两个颜色相同的概率. ...
随机推荐
- mysql5.7 修改用户密码
修改vi /etc/my.cnf,增加skip-grant-tables可以免密码登录mysql use mysql ; update user set authentication_string=P ...
- MyEclipse img显示问题
MyEclipse第一个例子,通过HTML的img显示图片,费两天的功夫,故作简单整理,图片2不显示根本原因还是src的路径不对. 选中project中的sr.jpg文件,运行查看浏览器显示的地址,此 ...
- Sql server 执行计划详解
序言 本篇主要目的有二: 1.看懂t-sql的执行计划,明白执行计划中的一些常识. 2.能够分析执行计划,找到优化sql性能的思路或方案. 如果你对sql查询优化的理解或常识不是很深入,那么推荐几骗博 ...
- linux中文件IO
一. linux常用文件IO接口 1.1. 文件描述符 1.1.1. 文件描述符的本质是一个数字,这个数字本质上是进程表中文件描述符表的一个表项,进程通过文件描述符作为index去索引查表得到文件表指 ...
- python中django中间件
一.中间件 所谓的中间件,就是存在socket和视图函数中间的一种相当于过滤的机构. 中间件共分为: (1)process_request(self,request) (2)process_view( ...
- 工作笔记之20170223:①关于Html5的placeholder属性,②以及input的outline:none的样式问题
关于这边几个样式问题,重点有这么几个: (1)placeholder="请输入密码" (2) color:#BEB6B6; border:0px; border-bottom:1p ...
- chromium for android GPU进程结构分析
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/jaylinzhou/article/details/27517471 GPU进程的client(Br ...
- Runnable、Callable和Future三者对比
Runnable是个借口,使用简单: 1. 实现该接口并重写run方法 2. 利用该类的对象创建线程 3. 线程启动时就会自动调用该对象的run方法 通常在开发中结合ExecutorServi ...
- JSP页面包含其他页面的三种方式及区别
一. <%@ include file="header.inc"%> 该指令在编译之前先读入指定的页面中的内容(并不对动态内容求值),融合后的完整页面再被整体的转换为一 ...
- nmbd - 向客户端提供构造在IP之上的NetBIOS名字服务的NetBIOS名字服务器
总览 SYNOPSIS nmbd [-D] [-F] [-S] [-a] [-i] [-o] [-h] [-V][-d <debug level>] [-H <lmhosts fil ...