[BZOJ 2038]小Z的袜子
传送门:BZOJ 2038
题意很明确,是在给定的区间内任意选取两个数,求选到两个相同的数的概率。
所以我们得首先统计在给定的区间内,相同的数对有多少对,那么这里就使用到了莫队算法。如果对莫队算法还不够了解,请百度一下,会有比较详细的解释,(虽然有一些也在瞎扯蛋),然后套模版就行了。其次这道题还需要用到一点组合数学知识,即C(n,r)=n!/[r! * (n-r)!]。设每次询问的区间长度为l,那么我们可以很快的计算出从l个数中任取两个的组合数为C(l,2)=l*(l-1)/2,套用公式即可。题目要求的概率也就是:区间内 相同的数对数/任取两个的组合数,再进行约分即可。
另外,因为n,m的最大值是50000,所以组合数可能会超过整型范围,所以本题需要开long long
代码如下:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <ctime>
#include <queue>
#include <string>
#include <map>
typedef long long ll;
using namespace std;
const int MAXN = ;
ll n, m;
ll L, R;
ll block;
ll c[MAXN];
ll cnt[MAXN];
ll ans;
ll s1[MAXN], s2[MAXN]; struct like {
ll l, r;
ll No;
} qry[MAXN]; inline ll gi() {
char c;
ll sum = , f = ;
c = getchar();
while (c < '' || c > '') {
if (c == '-')
f = -;
c = getchar();
}
while (c >= '' && c <= '') {
sum = sum * + c - '';
c = getchar();
}
return sum * f;
} inline bool cmp(like a, like b) {
if (a.l / block != b.l / block)
return a.l < b.l;
return a.r < b.r;
} inline void add(ll p) {
ans += cnt[c[p]];
cnt[c[p]]++;
} inline void remove(ll p) {
cnt[c[p]]--;
ans -= cnt[c[p]];
} inline void save(ll p, ll a, ll b) {
if (a == ) {
s1[qry[p].No] = ;
s2[qry[p].No] = ;
return;
}
ll tpa = a, tpb = b;
if (tpa < tpb)
swap(tpa, tpb);
while (tpb) {
ll r = tpa % tpb;
tpa = tpb;
tpb = r;
}
s1[qry[p].No] = a / tpa;
s2[qry[p].No] = b / tpa;
} int main() {
n = gi();
m = gi();
for (ll i = ; i <= n; i++)
c[i] = gi();
for (ll i = ; i <= m; i++) {
qry[i].l = gi();
qry[i].r = gi();
qry[i].No = i;
}
block = sqrt(n);
sort(qry + , qry + m + , cmp);
L = ;
R = ;
cnt[c[]] = ;
for (ll i = ; i <= m; i++) {
while (L < qry[i].l) {
remove(L);
L++;
}
while (L > qry[i].l) {
L--;
add(L);
}
while (R > qry[i].r) {
remove(R);
R--;
}
while (R < qry[i].r) {
R++;
add(R);
}
ll l = qry[i].r - qry[i].l + ;
save(i, ans, l * (l - ) / );
}
for (ll i = ; i <= m; i++)
printf("%lld/%lld\n", s1[i], s2[i]);
return ;
}
[BZOJ 2038]小Z的袜子的更多相关文章
- bzoj 2038 小Z的袜子(hose)(莫队算法)
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 11542 Solved: 5166[Sub ...
- (原创)BZOJ 2038 小Z的袜子(hose) 莫队入门题+分块
I - 小Z的袜子(hose) 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z ...
- BZOJ - 2038 小Z的袜子(普通莫队)
题目链接:小Z的袜子 题意:$n$只袜子,$m$个询问,每次回答有多大概率在$[L,R]$区间内抽到两只颜色相同的袜子 思路:普通莫队,如果两个询问左端点在一个块内,则按询问右端点排序,否则按照所在块 ...
- BZOJ 2038 小z的袜子 & 莫队算法(不就是个暴力么..)
题意: 给一段序列,询问一个区间,求出区间中.....woc! 贴原题! 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过 ...
- BZOJ 2038 小Z的袜子(hose) 莫队算法模板题
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题目大意: 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中 ...
- BZOJ 2038 小z的袜子(莫队)
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...
- BZOJ 2038 小Z的袜子(hose)(分组)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2038 题意:给出n个袜子.m个询问,每个询问一个区间[L,R],询问这个区间中任意拿出两 ...
- bzoj 2038 小z的袜子 莫队例题
莫队,利用可以快速地通过一个问题的答案得到另一问题的答案这一特性,合理地组织问题的求解顺序,将已解决的问题帮助解决当前问题,来优化时间复杂度. 典型用法:处理静态(无修改)离线区间查询问题. 线段树也 ...
- [bzoj] 2038 小Z的袜子(hose) || 莫队
原题 给出一个序列,求给定[l,r]内有任意取两个数,有多大概率是一样的 简单的莫队,每次+-当前区间里有的这个颜色的袜子的个数,最后除以(r-l+1)*(r-l)/2即可. 记得约分. #inclu ...
随机推荐
- 切换jdk版本
切换JDK 开发中jdk版本需要是1.3.1,当前电脑中用的是jdk1.8 下载jdk1.3.1 可以在官网上下,但是我捣鼓半天,发现下载又慢又需要账号,所以在CSDN下了个 地址,可以下载第一个ex ...
- 开博客这么久以来,第一篇技术文章,python与c的接口对接
在博客园开博客已经有了蛮长时间了,但是从来只是看别人的文章,自己却从未写过一篇技术文章,深表惭愧.内心还是希望能够给大家提供一些帮助的,希望这第一篇技术博客,能够给大家一些帮助.闲话少叙,开始正文. ...
- zoom和transform:scale的区别
小tips: zoom和transform:scale的区别 这篇文章发布于 2015年11月3日,星期二,00:52,归类于 css相关. 阅读 7876 次, 今日 8 次 by zhangxin ...
- Tableau10.0学习随记-度量的聚合设置(取消度量汇总-展示所有数据)
度量的聚合与取消聚合 a.根据度量指标分析时,有的度量值在直接拖取后,所展示的结果如下图所示: b.此时,如果需要展示所有数据的散点图,则可以取消菜单中的“分析-聚合度量”选项,如下图所示: c.调整 ...
- Linux主机共享目录给Windows主机的方法
Linux主机共享目录可以通过samba来实现 首先,来看下百科上关于samba的介绍: Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Ser ...
- java map的默认排序问题
import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.Tre ...
- sql脚本多服务器操作
--创建链接服务器exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','IP' exec sp_addlinkedsrvlogin 'srv_lnk','f ...
- socketserver 分块记录
网络编程 Socket(TCP,IP)套接字 服务端 运行起来, 客户端 客户端 客户端 客户端 服务端: import socket sk = socket.socket() #绑定端口号 sk.b ...
- Laravel框架 mysql 数据库 —— 基本使用
增删改查 配置完数据库连接,就可以使用DB类进行查询了. 查询 $results = DB::select('select * from users where id = ?', array(1)); ...
- Fragment的startActivityForResult和Activity的startActivityForResult的区别
2016-08-30 18:22:33 前提:我们的APP要兼容Api level 11以前的,所以必须用FragmentActivity 1.对于Fragment的,我们很多时候都会在Activit ...