Bzoj2038/洛谷P1494 小Z的袜子(莫队)
题面
题解
考虑莫队算法,首先对询问进行分块(分块大小为$sqrt(n)$),对于同一个块内的询问,按照左端点为第一关键字,右端点为第二关键字排序。我们统计这个区间内相同的颜色有多少个,假设某种颜色$i$有$j$个,则贡献就是$j\times(j-1)$,最后记得化成既约分数。
#include <set>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using std::min; using std::max;
using std::swap; using std::sort;
typedef long long ll;
using std::set;
template<typename T>
void read(T &x) {
int flag = 1; x = 0; char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') flag = -flag; ch = getchar(); }
while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); x *= flag;
}
const int N = 5e4 + 10, M = 5e4 + 10;
int n, m, c[N], siz, blo, t, l, r, v[N];
struct Ques { int x, y, z; } q[M], b[M];
inline bool cmp1 (Ques a, Ques b) { return a.x < b.x; }
inline bool cmp2 (Ques a, Ques b) { return a.y < b.y; }
ll up[M], down[M], _gcd, tmp;
template<typename T>
T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }
void modify (int st, int ed, int flag) {
for(int i = st; i < ed; ++i) {
tmp -= 1ll * v[c[i]] * (v[c[i]] - 1);
v[c[i]] += flag;
tmp += 1ll * v[c[i]] * (v[c[i]] - 1);
}
}
int main () {
#ifdef OFFLINE_JUDGE
freopen("233.in", "r", stdin);
freopen("233.out", "w", stdout);
#endif
read(n), read(m);
for(int i = 1; i <= n; ++i) read(c[i]);
for(int i = 1; i <= m; ++i)
read(q[i].x), read(q[i].y), q[i].z = i;
sort(&q[1], &q[m + 1], cmp1);
siz = sqrt(n), blo = (n / siz) + (n % siz != 0);
for(int i = 0, j = 1; i < blo; ++i) {
t = 0;
while(j <= m && q[j].x > i * siz && q[j].x <= (i + 1) * siz) b[++t] = q[j++];
sort(&b[1], &b[t + 1], cmp2);
l = b[1].x, r = b[1].x - 1, tmp = 0;
memset(v, 0, sizeof v);
for(int k = 1; k <= t; ++k) {
if(b[k].x == b[k].y) {
up[b[k].z] = 0, down[b[k].z] = 1;
continue;
}
if(l < b[k].x) modify(l, b[k].x, -1);
else if(l > b[k].x) modify(b[k].x, l, 1);
if(r < b[k].y) modify(r + 1, b[k].y + 1, 1);
else if(r > b[k].y) modify(b[k].y + 1, r + 1, -1);
up[b[k].z] = tmp, down[b[k].z] = b[k].y - b[k].x + 1;
l = b[k].x, r = b[k].y;
}
}
for(int i = 1; i <= m; ++i) {
if(!down[i] || !up[i]) { puts("0/1"); continue; }
down[i] = down[i] * (down[i] - 1);
tmp = gcd(up[i], down[i]);
printf("%lld/%lld\n", up[i] / tmp, down[i] / tmp);
}
return 0;
}
Bzoj2038/洛谷P1494 小Z的袜子(莫队)的更多相关文章
- BZOJ2038 [2009国家集训队]小Z的袜子 莫队+分块
作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从 ...
- [日常摸鱼]bzoj2038[2009国家集训队]小Z的袜子-莫队算法
今天来学了下莫队-这题应该就是这个算法的出处了 一篇别人的blog:https://www.cnblogs.com/Paul-Guderian/p/6933799.html 题意:一个序列,$m$次询 ...
- P1494 小Z的袜子 莫队
题干 就是将$add$和$del$函数里的$ans$变化变成组合数嘛, 先预处理出$x$只相同袜子一共有$f[x] = 1+2+...+$$(x-1)$种组合, 要注意,由于$f[x]$是一直加到$x ...
- 洛谷P1494 小Z的袜子
题意:在[l, r]之中任选两个数,求它们相同的概率. 解: 莫队入门. 概率这个很好搞,就是cnt * (cnt - 1) / 2. 然后发现每次挪指针的时候,某一个cnt会+1或-1.这时候差值就 ...
- 洛谷P1494小Z的袜子 [国家集训队] 莫队
正解:莫队 解题报告: 这是,传送门qwq 昂大概是莫队板子题? 首先可以推出来答案是(∑C(2,color[i]))/C(2,r-l+1)趴?挺显然的不解释了qwq 然后显然除数直接做就成,考虑怎么 ...
- 小Z的袜子 & 莫队
莫队学习 & 小Z的袜子 引入 莫队 由莫涛巨佬提出,是一种离线算法 运用广泛 可以解决广大的离线区间询问题 莫队的历史 早在mt巨佬提出莫队之前 类似莫队的算法和莫队的思想已在Codefor ...
- P1494 [国家集训队]小Z的袜子/莫队学习笔记(误
P1494 [国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小\(Z\)每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小\(Z\)再也无法忍受这恼人的找袜子过程,于是他 ...
- BZOJ 2038 [2009国家集训队]小Z的袜子 莫队
2038: [2009国家集训队]小Z的袜子(hose) 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Descriptionw ...
- 【国家集训队2010】小Z的袜子[莫队算法]
[莫队算法][国家集训队2010]小Z的袜子 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程, ...
随机推荐
- JAVA中反射机制六(java.lang.reflect包)
一.简介 java.lang.reflect包提供了用于获取类和对象的反射信息的类和接口.反射API允许对程序访问有关加载类的字段,方法和构造函数的信息进行编程访问.它允许在安全限制内使用反射的字段, ...
- 说说ASP.NET的IsPostBack
学习asp.net,就不能不谈IsPostBack属性,顾名思义,这是是否回发的意思,多用于判断是不是第一次打开 一.IsPostBack介绍 Page.IsPostBack是一个标志:当前请求是否第 ...
- macbook 安装任意来源
sudo spctl --master-disable Comand+r Csrutil disable Reboot
- laravel前台html代码不显示
后天向前台传输变量,如果能取到变量数据,还有代码,但是不显示图片 可以把{{}}换成{!! !!}试试.
- linux平台 PHP 实现 word转pdf的艰难历程...
1.网上搜索资料 无非是 openoffice + PHP的com组件 然而试了很多次 都不可靠 2.后来找到 openoffice + jodconverter(需java环境) 一.安装openo ...
- RabbitMQ使用简记
RabbitMQ是什么 MQ全称为Message Queue, 即消息队列.MQ是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们 ...
- 【洛谷 P2764】 最小路径覆盖问题(最大流)
题目链接 首先有\(n\)条路径,每条路径就是一个点,然后尽量合并,答案就是点数-合并数. 套路拆点,源连入,出连汇,原有的边入出连. 最大流就是最大合并数,第一问解决. 然后怎么输出方案? 我是找到 ...
- LintCode题解之子树
思路: 最简单的方法,依次遍历比较就可以了. AC代码: /** * Definition of TreeNode: * public class TreeNode { * public int va ...
- MyBatis数据库字段和实体对象属性名不一致的解决方案
数据库和对象的属性名不一致是很常见的问题,这个时候依从表字段到对象属性名的按名称匹配映射已经搞不定这个了,下面是几种解决方案. 1. 开启驼峰转换 如果数据库中的字段名与对象只是简单的不一致的话,比如 ...
- javascript经典小游戏代码集合
http://www.jb51.net/Special/349.htm