我的第二道莫队题,对莫队又有了自己的看法。

在第一题的基础上之上,觉得莫队有个很关键的地方在于 莫队所维护的值是什么,怎么推出维护的公式来。

这道题就是这样,一开始还没自己推出公式来,也有几个坑点。

题目链接:https://www.luogu.org/problemnew/show/P1494

题目大意:给出区间值,询问给定的【l, r】区间内抽到两只颜色一样的概率是多少。

思路:

1.首先很重要的推出公式来,设颜色相同的数量分别为a, b, c...那么对于给定的区间【l, r】,概率为 (a * (a  - 1) / 2+ b * (b - 1) / 2 + c * (c - 1) / 2 + ...) / ((r - l + 1) * (r - l) / 2),化简为 (a ^ 2 + b ^ 2 + c ^2 + ... - (r - l + 1)) / ((r - l + 1) * (r - l)),因此cnt维护区间内的值的数量,再推出如何维护平方和的值就行了。

2.计算的数据会爆int,需要用long long ,并且计算的式子要 * 1ll 来转化成long long型,才不会WA。

3.区间 l == r, 分子分母小于等于0时,直接记录 0 / 1

代码如下:

 #include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
const int MAXN = ; int arr[MAXN];
int cnt[MAXN]; //区间内出现次数 struct Qurey
{
int l, r, id;
int pos; //所属的块
}q[MAXN]; struct ANS
{
long long fz, fm;
}ans[MAXN]; bool cmp(Qurey a, Qurey b)
{
if(a.pos == b.pos)
return a.r < b.r;
else
return a.pos < b.pos;
} long long gcd(long long a, long long b)
{
long long c;
while(b)
{
c = a % b;
a = b;
b = c;
}
return a;
} int main()
{
int n, m;
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i ++)
scanf("%d", &arr[i]);
int fk = sqrt(n);
for(int i = ; i <= m; i ++)
{
scanf("%d%d", &q[i].l, &q[i].r);
q[i].id = i;
q[i].pos = (q[i].l - ) / fk + ;
}
sort(q + , q + + m, cmp);
int left = , right = ;
long long sum = ;
for(int i = ; i <= m; i ++)
{
if(q[i].l == q[i].r)
{
ans[q[i].id].fz = ;
ans[q[i].id].fm = ;
continue;
}
while(left > q[i].l)
{
left --;
cnt[arr[left]] ++;
sum += *1ll* cnt[arr[left]] - ;
}
while(right < q[i].r)
{
right ++;
cnt[arr[right]] ++;
sum += *1ll* cnt[arr[right]] - ;
}
while(left < q[i].l)
{
cnt[arr[left]] --;
sum -= *1ll* cnt[arr[left]] + ;
left ++;
}
while(right > q[i].r)
{
cnt[arr[right]] --;
sum -= *1ll* cnt[arr[right]] + ;
right --;
}
long long fz = sum - (right - left + );
long long fm = 1ll*(right - left + ) * (right - left);
if(fz <= || fm <= )
{
ans[q[i].id].fz = ;
ans[q[i].id].fm = ;
continue;
}
long long temp = gcd(fz, fm);
fz /= temp, fm /= temp;
ans[q[i].id].fz = fz, ans[q[i].id].fm = fm;
}
for(int i = ; i <= m; i ++)
{
printf("%lld/%lld\n", ans[i].fz, ans[i].fm);
}
return ;
}

P1494 小Z的袜子 【普通莫队】的更多相关文章

  1. Bzoj2038/洛谷P1494 小Z的袜子(莫队)

    题面 Bzoj 洛谷 题解 考虑莫队算法,首先对询问进行分块(分块大小为\(sqrt(n)\)),对于同一个块内的询问,按照左端点为第一关键字,右端点为第二关键字排序.我们统计这个区间内相同的颜色有多 ...

  2. 小Z的袜子(题解)(莫队)

    小Z的袜子(题解)(莫队) Junlier良心莫队 题目 luoguP1494 [国家集训队]小Z的袜子 code #include<bits/stdc++.h> #define lst ...

  3. 【洛谷】1494:[国家集训队]小Z的袜子【莫队】

    P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… ...

  4. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

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

  5. Bzoj 2038: [2009国家集训队]小Z的袜子(hose) 莫队,分块,暴力

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

  6. BZOJ2038: [2009国家集训队]小Z的袜子(hose) -- 莫队算法 ,,分块

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

  7. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )

    莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) --------------------------- ...

  8. 小Z的袜子(莫队分块)题解

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

  9. HYSBZ - 2038 小Z的袜子 (莫队算法)

    A1206. 小Z的袜子 时间限制:1.0s   内存限制:512.0MB   总提交次数:744   AC次数:210   平均分:44.44 将本题分享到:        查看未格式化的试题    ...

  10. kyeremal-bzoj2038-[2009国家集训队]-小z的袜子(hose)-莫队算法

    id=2038">bzoj2038-[2009国家集训队]-小z的袜子(hose) F.A.Qs Home Discuss ProblemSet Status Ranklist Con ...

随机推荐

  1. 报错Too many connections

    com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establish ...

  2. 【Python之路】特别篇--微信Web网页版通信的全过程分析

    文章所使用Python版本为py3.5 1.微信服务器返回一个会话ID 微信Web版本不使用用户名和密码直接登录,而是采用二维码登录,所以服务器需要首先分配一个唯一的会话ID,用来标识当前的一次登录. ...

  3. springboot热部署如果不行

    如果热部署不行先看一眼 Project——>Build Automatically 看这个有没有打对勾,这是热部署的依赖

  4. Syn Flood 攻击

    什么是SYN Flood攻击? SYN Flood (SYN洪水) 是种典型的DoS (Denial of Service,拒绝服务) 攻击.效果就是服务器TCP连接资源耗尽,停止响应正常的TCP连接 ...

  5. I am coming..

    It's so great to start the blog here since it's been a long time that I want to start such kind of l ...

  6. 利用Python+Redis实现分布式锁

    class MyDLock(object): def __init__(self, lockID,timeout): self.connection = redis.Redis(host=cfg.RE ...

  7. Java中基本数据类型

    在数据类型中,最常用也是最基础的数据类型,被称作基本数据类型.可以使用这些类型的值来代表一些简单的状态. Java 语言的基本数据类型总共有以下8 种,下面是按照用途划分出的4 个类别: 定点类型: ...

  8. 预处理、const、static与sizeof-内联函数与宏有什么区别

    1:二者的区别如下: (1)内联函数在编译时展开,宏在预编译时展开. (2)在编译的时候,内联函数可以直接被镶嵌到目标代码中,而宏只是一个简单的文本替换. (3)内联函数可以完成诸如类型检测.语句是否 ...

  9. Nginx之编写HTTP模块

    1. 常用数据结构 1.1 ngx_str_t typedef struct { /* * 字符串的有效长度 */ size_t len; /* * 有效字符串的起始地址,该字符串通常并不以'\0'结 ...

  10. antd源码分析之——标签页(tabs 2.Tabs关键组件功能实现)

    由于ant Tabs组件结构较复杂,共分三部分叙述,本文为目录中第二部分(高亮) 目录 一.组件结构 antd代码结构 rc-ant代码结构 1.组件树状结构 2.Context使用说明 3.rc-t ...