莫队/se 优雅的暴力
莫队算法
发明者:队爷莫涛
基于分块的一种暴力算法, 复杂度最慢可以被卡到\(n^2\)正常情况下的复杂度大约在\(O(n\sqrt{n})\)左右分块的大小对复杂的影响很大其中最优分块的大小为\(\dfrac {s}{\sqrt{m}}\) 最优复杂度为\(O(n\sqrt{m})\)
用处:维护区间信息
具体做法
- 对求的\(l-r\)区间进行排序,根据\(l\)和\(r\)所在块的位置,进行排序
- 对排序后的\(l-r\)的区间进行维护,观察维护的数据具有什么特点
注意:
- 4个\(while\)循环不能乱,根据先后关系进行确定(24中全排列,6中正确)
- 莫队比较卡常,注意写小常数
例题
这个就是概率问题 - 例子1 eg:3 3 4 5 6 4
\(ans = \dfrac{2}{6} \times \dfrac{1}{5} + \dfrac{2}{6} \times \dfrac{1}{5} = \dfrac{2}{15}\)
莫队的过程就是
l = 1 ,r = 0 ,son = 0
l = 1 ,r = 1 ,son = 0
l = 1 ,r = 2 ,son = 2 * ( 2 - 1 ) / 2
l = 1 ,r = 3 ,son = 2 * ( 2 - 1 ) / 2
l = 1 ,r = 4 ,son = 2 * ( 2 - 1 ) / 2
l = 1 ,r = 5 ,son = 2 * ( 2 - 1 ) / 2
l = 1 ,r = 6 ,son = 2 * ( 2 - 1 ) / 2 + 2 * (2 - 1) / 2
mo = 6 * (6 - 1) / 2
- 例子1 eg: 3 3 3 4 5 6 4
l = 1 ,r = 0 ,son = 0
l = 1 ,r = 1 ,son = 2 * ( 2 - 1 ) / 2
l = 1 ,r = 2 ,son = 3 * ( 3 - 1 ) / 2
l = 1 ,r = 3 ,son = 3 * ( 3 - 1 ) / 2
l = 1 ,r = 4 ,son = 3 * ( 3 - 1 ) / 2
l = 1 ,r = 5 ,son = 3 * ( 3 - 1 ) / 2
l = 1 ,r = 6 ,son = 3 * ( 3 - 1 ) / 2 + 2 * (2 - 1) / 2
mo = 7 * (7 - 1) / 2
过程中先删去前一个的贡献再加上后一个的贡献
Code
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#define orz puts("LKP AK IOI")
#define ll long long
using namespace std;
const int N = 5e4+100;
int read(){
int s = 0 ,f = 1; char ch = getchar();
while(ch < '0'||ch > '9'){if(ch == '-') f = -1 ; ch = getchar();}
while(ch >= '0'&&ch <= '9'){s = s * 10 + ch - '0'; ch = getchar();}
return s * f;
}
ll sqrtn , l = -1, r = 0, ans;
ll son[N], mo[N];
struct node {
int l, r, id;
bool operator < (const node &x) const {
if( l / sqrtn != x.l / sqrtn) return l < x.l;
if((l/sqrtn) & 1) return r < x.r;
return r > x.r;
}
}wa[N];
int cs[N],c[N];
ll ANS(ll x) {
return x < 2 ? 0: x * (x - 1) ;
}
void del(int pos) {
ll temp = --cs[c[pos]];
ans -= ANS(temp+1); ans += ANS(temp);
}
void add(int pos) {
ll temp = ++cs[c[pos]];
ans -= ANS(temp-1); ans += ANS(temp);
}
ll gcd(ll a,ll b) {
return b == 0 ? a : gcd(b, a%b);
}
bool cmp(node a,node b) {
if(a.l/sqrtn == b.l/sqrtn) return a.r < b.r;
return a.l < b.l;
}
int main(){
int n = read() ,m = read() ;
for(int i = 1 ; i <= n ; i++) c[i] = read();
for(int i = 1 ; i <= m ;i++) wa[i].l = read() , wa[i].r = read() , wa[i].id = i;
sqrtn = sqrt(0.5+n );
sort(wa+1,wa+1+m);
//sort(wa+1 , wa+1+m, cmp);
//orz;
for(int i = 1 ; i <= m ;i++) {
while (l < wa[i].l) del(l),l++;
while (l > wa[i].l) l--,add(l);
while (r < wa[i].r) r++,add(r);
while (r > wa[i].r) del(r),r--;
son[wa[i].id] = ans;
mo[wa[i].id] = ANS(r-l+1);
}
for(int i = 1; i <= m ;i++) {
if(son[i] == 0) {
cout<<"0/1\n";
continue;
}
ll temp = gcd(son[i],mo[i]);
printf("%lld/%lld\n",son[i]/temp,mo[i]/temp);
}
return 0;
}
莫队/se 优雅的暴力的更多相关文章
- 莫队 [洛谷2709] 小B的询问[洛谷1903]【模板】分块/带修改莫队(数颜色)
莫队--------一个优雅的暴力 莫队是一个可以在O(n√n)内求出绝大部分无修改的离线的区间问题的答案(只要问题满足转移是O(1)的)即你已知区间[l,r]的解,能在O(1)的时间内求出[l-1, ...
- XOR and Favorite Number(莫队算法+分块)
E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...
- 【国家集训队2010】小Z的袜子(莫队)
题面 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把 ...
- bzoj 3339 莫队
题意: 求任意一个区间的SG函数. 想到线段树,但是线段树合并很麻烦. 线段树——分块. 分块的一个应用就是莫队算法. 怎么暴力递推呢? 从一个区间到另一个区间,Ans 取决于 Ans 和 加入和删除 ...
- 美团codem 数列互质 - 莫队
题目描述 给出一个长度为 nnn 的数列 a1,a2,a3,...,an{ a_1 , a_2 , a_3 , ... , a_n }a1,a2,a3,...,an,以及 mm ...
- BZOJ 3339 & 莫队+"所谓的暴力"
题意: 给一段数字序列,求一段区间内未出现的最小自然数. SOL: 框架显然用莫队.因为它兹瓷离线. 然而在统计上我打了线段树...用&维护的结点...400w的线段树...然后二分查找... ...
- BZOJ 2038 小z的袜子 & 莫队算法(不就是个暴力么..)
题意: 给一段序列,询问一个区间,求出区间中.....woc! 贴原题! 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过 ...
- D. Powerful array 莫队算法或者说块状数组 其实都是有点优化的暴力
莫队算法就是优化的暴力算法.莫队算法是要把询问先按左端点属于的块排序,再按右端点排序.只是预先知道了所有的询问.可以合理的组织计算每个询问的顺序以此来降低复杂度. D. Powerful array ...
- Bzoj 2038: [2009国家集训队]小Z的袜子(hose) 莫队,分块,暴力
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 5763 Solved: 2660[Subm ...
随机推荐
- MybatisPlus学习(四)条件构造器Wrapper方法详解
文章目录 1.条件构造器 2.QueryWrapper 2.1.eq.ne 2.2.gt.ge.lt.le 2.3.between.notBetween 2.4.like.notLike.likeLe ...
- springclud中附件上传
package org.springblade.desk.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import ...
- webpack相关的问题
随着现代前端开发的复杂度和规模越来越庞大,已经不能抛开工程化来独立开发了,如react的jsx代码必须编译后才能在浏览器中使用:又如sass和less的代码浏览器也是不支持的. 而如果摒弃了这些开发框 ...
- DNS主从服务器配置实现
主服务器-centos7-IP:192.168.184.201 从服务器-centos7-IP:192.168.184.202 客户端-ubuntu1804-IP:192.168.184.150 ①客 ...
- CentOS 7 最小化安装及优化
CentOS 7 最小化安装及优化 目录 CentOS 7 最小化安装及优化 一.下载镜像文件 官方网站 国内镜像源 一.VMware 配置虚拟网络 二.VMware 新建虚拟机 三.CentOS 7 ...
- Sql语句模糊查询字符串的两种写法
Sql语句模糊查询有两种写法,一种是在jdbcTemplate的查询方法参数里拼接字符串%,一种是在Sql语句里拼接%字符串. public class IsNameDaoImpl implement ...
- TurtleBot3 Waffle (tx2版华夫)(6)
重要提示:请在配网通信成功后进行操作,配网后再次开机需要重新验证通信: 重要提示:[Remote PC]代表PC端.[TurtelBot]代表树莓派端: 操作步骤如下: 1)[Remote PC] 启 ...
- Spark学习进度-Spark环境搭建&Spark shell
Spark环境搭建 下载包 所需Spark包:我选择的是2.2.0的对应Hadoop2.7版本的,下载地址:https://archive.apache.org/dist/spark/spark-2. ...
- 使用GitHub Actions自动编译部署hexo博客
前言 使用hexo博客也挺久的,最开始是本地hexo clean && hexo g,最后hexo d推送到服务器.后来是本地hexo clean && hexo g, ...
- 【剑指 Offer】03.1.不修改数组找出重复的数字
找出数组中重复的数字. 在一个长度为 n + 1 的数组 nums 里的所有数字都在 1-n 的范围内.所以数组中至少有一个是重复的.请找出数组中任意一个重复的数字. 示例 1: 输入: [2, 3, ...