传送门: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的袜子的更多相关文章

  1. bzoj 2038 小Z的袜子(hose)(莫队算法)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 11542  Solved: 5166[Sub ...

  2. (原创)BZOJ 2038 小Z的袜子(hose) 莫队入门题+分块

    I - 小Z的袜子(hose) 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z ...

  3. BZOJ - 2038 小Z的袜子(普通莫队)

    题目链接:小Z的袜子 题意:$n$只袜子,$m$个询问,每次回答有多大概率在$[L,R]$区间内抽到两只颜色相同的袜子 思路:普通莫队,如果两个询问左端点在一个块内,则按询问右端点排序,否则按照所在块 ...

  4. BZOJ 2038 小z的袜子 & 莫队算法(不就是个暴力么..)

    题意: 给一段序列,询问一个区间,求出区间中.....woc! 贴原题! 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过 ...

  5. BZOJ 2038 小Z的袜子(hose) 莫队算法模板题

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2038 题目大意: 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中 ...

  6. BZOJ 2038 小z的袜子(莫队)

    Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...

  7. BZOJ 2038 小Z的袜子(hose)(分组)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2038 题意:给出n个袜子.m个询问,每个询问一个区间[L,R],询问这个区间中任意拿出两 ...

  8. bzoj 2038 小z的袜子 莫队例题

    莫队,利用可以快速地通过一个问题的答案得到另一问题的答案这一特性,合理地组织问题的求解顺序,将已解决的问题帮助解决当前问题,来优化时间复杂度. 典型用法:处理静态(无修改)离线区间查询问题. 线段树也 ...

  9. [bzoj] 2038 小Z的袜子(hose) || 莫队

    原题 给出一个序列,求给定[l,r]内有任意取两个数,有多大概率是一样的 简单的莫队,每次+-当前区间里有的这个颜色的袜子的个数,最后除以(r-l+1)*(r-l)/2即可. 记得约分. #inclu ...

随机推荐

  1. 关于如何在cenos7.0上实现mysql数据库远程连接

    设置mysql允许别的客户机控制的权限 mysql -uroot -p #此处为本地linux帐号密码 select user,host from mysql.user; #查看mysql表对应use ...

  2. 使用VC6.0创建和运行C程序的方法

    使用VC6.0可以有快捷的方式创建C程序,对于初学者,建议按照如下方式创建.先创建一个工作区,然后创建工程,最后在工程中创建源文件文件.理解工作区.工程与文件之间的关系.

  3. Eclipse中10个最有用的快捷键组合

    Eclipse中10个最有用的快捷键组合 (转) 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到提升. ...

  4. leetcode6

    好吧,今天晚上赶项目确实是做不了三道题目了,最近项目在网络编程方面有些进步,学到了东西,有时间再积累下来,很深的体会就是,和别人一起写代码,虽然蛋疼但是比自己一个人写要好点,不过发现自己对链表和排序什 ...

  5. JavaScript 开发的45个经典技巧

    JavaScript是一个绝冠全球的编程语言,可用于Web开发.移动应用开发(PhoneGap.Appcelerator).服务器端开发(Node.js和Wakanda)等等.JavaScript还是 ...

  6. alert弹层无法取消问题解决办法

    最近做H5移动端开发的时候,js代码写了个alert,在Android手机上能正常运行,但是在IOS上运行弹出之后却无法取消掉, 而且页面卡死,点不了任何东西,这种情况是非常不好的,用户体验非常糟糕. ...

  7. 思维导图MindManager的文件格式与例图

    思维导图软件很多,能够画出思维导图的软件更多.作为流传较广而又比较成熟的思维导图软件,MindManager有专门的文件格式.如果读者想多借鉴导图,就应该了解MindManager的文件格式. Min ...

  8. 算法-MergeSort

    #include <iostream> #include <vector> #include <iterator> using namespace std; ; v ...

  9. js④

    for循环代码执行顺序 1.执行小括号里面的第一个语句 2.判断小括号里面第二个语句的布尔值,如果为false,就会结束掉整个for循环,如果为true,就会执行大括号里面的语句块; 3.每次执行完大 ...

  10. Python开发入门与实战21-订阅事件(subscribe)

    21. 订阅事件(subscribe) 新用户关注微信公众平台,将产生一个订阅事件,即subscribe事件,在新用户关注公众平台后为新用户提供一些简明扼要的公众号说明 事件推送(event): 接收 ...