P1494 小Z的袜子 【普通莫队】
我的第二道莫队题,对莫队又有了自己的看法。
在第一题的基础上之上,觉得莫队有个很关键的地方在于 莫队所维护的值是什么,怎么推出维护的公式来。
这道题就是这样,一开始还没自己推出公式来,也有几个坑点。
题目链接: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的袜子 【普通莫队】的更多相关文章
- Bzoj2038/洛谷P1494 小Z的袜子(莫队)
题面 Bzoj 洛谷 题解 考虑莫队算法,首先对询问进行分块(分块大小为\(sqrt(n)\)),对于同一个块内的询问,按照左端点为第一关键字,右端点为第二关键字排序.我们统计这个区间内相同的颜色有多 ...
- 小Z的袜子(题解)(莫队)
小Z的袜子(题解)(莫队) Junlier良心莫队 题目 luoguP1494 [国家集训队]小Z的袜子 code #include<bits/stdc++.h> #define lst ...
- 【洛谷】1494:[国家集训队]小Z的袜子【莫队】
P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 7687 Solved: 3516[Subm ...
- Bzoj 2038: [2009国家集训队]小Z的袜子(hose) 莫队,分块,暴力
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 5763 Solved: 2660[Subm ...
- BZOJ2038: [2009国家集训队]小Z的袜子(hose) -- 莫队算法 ,,分块
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 3577 Solved: 1652[Subm ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose) ( 莫队 )
莫队..先按sqrt(n)分块, 然后按块的顺序对询问排序, 同块就按右端点排序. 然后就按排序后的顺序暴力求解即可. 时间复杂度O(n1.5) --------------------------- ...
- 小Z的袜子(莫队分块)题解
小Z的袜子(hose) 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...
- HYSBZ - 2038 小Z的袜子 (莫队算法)
A1206. 小Z的袜子 时间限制:1.0s 内存限制:512.0MB 总提交次数:744 AC次数:210 平均分:44.44 将本题分享到: 查看未格式化的试题 ...
- kyeremal-bzoj2038-[2009国家集训队]-小z的袜子(hose)-莫队算法
id=2038">bzoj2038-[2009国家集训队]-小z的袜子(hose) F.A.Qs Home Discuss ProblemSet Status Ranklist Con ...
随机推荐
- 010_linuxC++之_运算符重载
(一)运算符重载:运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型. (二)实现类不同对象里中变量的相加 (三)程序 #include <iostream> ...
- luogu 4047 [JSOI2010]部落划分 最小生成树
最小生成树或者二分都行,但是最小生成树会好写一些~ Code: #include <bits/stdc++.h> #define ll long long #define N 100000 ...
- http communication process
- IVIEW组件Table中加入EChart柱状图
展示图如下: 主要利用了render函数和updated()钩子函数进行数据填充与渲染. 1.在Table的Colums中加入 1 { 2 title: '比例图', 3 align: 'center ...
- Dean and Schedule (URAL 2026)
Problem A new academic year approaches, and the dean must make a schedule of classes for first-year ...
- linux系统nginx下反向代理解析二级目录泛目录教程
解析规则1: location /目录名 { proxy_pass http://ip/目录名; } 解析规则2: location /目录名{ ...
- redis服务及其配置与应用(window 环境下)
一.redis简介:Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API(源自百度百科),个人更喜欢下面的解释:我们 ...
- python 二叉搜索树相关代码
class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None class Ope ...
- Leetcode题目55.跳跃游戏(贪心算法-中等)
题目描述: 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: ...
- sentinel控制台监控数据持久化【InfluxDB】
根据官方wiki文档,sentinel控制台的实时监控数据,默认仅存储 5 分钟以内的数据.如需持久化,需要定制实现相关接口. https://github.com/alibaba/Sentinel/ ...