在此说一下本渣对莫队算法思想的一些浅薄理解

莫队算法的思想就是对真个区间的分块,然后按照每块来分别进行计算,这样最终的复杂度可以达到n*sqrt(n)

小Z的袜子是一道非常经典的题目.:题目链接http://acm.hust.edu.cn/vjudge/contest/view.action?cid=29469#problem/A

我们先对整个区间分块,然后按照左区间所在的块进行排序,如果左区间在相同的块内,则按照右区间进行排序.

如此相当于对每个左区间在相同块内的询问,我们只要右区间从最小迭代到最大即可.也就是说我们把算法的复杂度的锅让区间的左端点来背 = =,恩......

当然了,既然使用如上算法,那么显然我们要进行离线处理.

具体代码如下:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cmath>
#include <set> using namespace std; int n, m, a[100010], num[100010], unit;
struct N { //存询问的信息
int l, r, id;
bool operator < (const N &rhs) const { //先按照左端点是否所在块进行排序,然后按照右端点排序
if (l / unit == rhs.l / unit) return r < rhs.r;
else return l / unit < rhs.l / unit;
}
} q[100010];
pair<long long, long long>ans[100010]; //储存答案
long long gcd(long long x, long long y) {
if (y == 0) return x;
return gcd(y, x % y);
} int main() {
//freopen("in.in", "r", stdin);
//freopen("out.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 0; i < m; i++) {
scanf("%d %d", &q[i].l, &q[i].r);
q[i].id = i;
}
unit = sqrt(n);
sort(q, q + m);
int l = 1,r = 0;
long long tmp = 0;
memset(num,0,sizeof(num));
for(int i=0;i<m;i++){ //迭代求答案过程
while(r < q[i].r){
r++;
tmp -= (long long)num[a[r]] * (num[a[r]] - 1);
num[a[r]]++;
tmp += (long long)num[a[r]] * (num[a[r]] - 1);
}
while(r > q[i].r){
tmp -= (long long)num[a[r]] * (num[a[r]] - 1);
num[a[r]]--;
tmp += (long long)num[a[r]] * (num[a[r]] - 1);
r--;
}
while(l < q[i].l){
tmp -= (long long)num[a[l]] * (num[a[l]] - 1);
num[a[l]]--;
tmp += (long long)num[a[l]] * (num[a[l]] - 1);
l++;
}
while(l > q[i].l){
l--;
tmp -= (long long)num[a[l]] * (num[a[l]] - 1);
num[a[l]]++;
tmp += (long long)num[a[l]] * (num[a[l]] - 1);
}
ans[q[i].id].first = tmp;
ans[q[i].id].second = (long long)(q[i].r - q[i].l + 1) * (q[i].r - q[i].l);
}
for(int i=0;i<m;i++){
if(ans[i].first + ans[i].second == 0) { printf("0/1\n"); continue; }
long long tmp = gcd(ans[i].second,ans[i].first);
printf("%lld/%lld\n",ans[i].first/tmp,ans[i].second/tmp);
}
return 0;
}

莫队算法 sqrt(n)分块思想的更多相关文章

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

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

  2. Luogu 1494 - 小Z的袜子 - [莫队算法模板题][分块]

    题目链接:https://www.luogu.org/problemnew/show/P1494 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天 ...

  3. 【BZOJ】4358: permu 莫队算法

    [题意]给定长度为n的排列,m次询问区间[L,R]的最长连续值域.n<=50000. [算法]莫队算法 [题解]考虑莫队维护增加一个数的信息:设up[x]表示数值x往上延伸的最大长度,down[ ...

  4. [BZOJ2038]小Z的袜子(莫队算法)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 分析:莫队算法 莫队算法是一种思想…… 处理问题:不带修改的区间询问 使用要求:[l-1 ...

  5. 【BZOJ】2038: [2009国家集训队]小Z的袜子(hose)(组合计数+概率+莫队算法+分块)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2038 学了下莫队,挺神的orzzzz 首先推公式的话很简单吧... 看的题解是从http://for ...

  6. XOR and Favorite Number(莫队算法+分块)

    E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  7. 【莫队算法】【权值分块】bzoj3920 Yuuna的礼物

    [算法一] 暴力. 可以通过第0.1号测试点. 预计得分:20分. [算法二] 经典问题:区间众数,数据范围也不是很大,因此我们可以: ①分块,离散化,预处理出: <1>前i块中x出现的次 ...

  8. 【BZOJ】4129: Haruna’s Breakfast 树分块+带修改莫队算法

    [题意]给定n个节点的树,每个节点有一个数字ai,m次操作:修改一个节点的数字,或询问一条树链的数字集合的mex值.n,m<=5*10^4,0<=ai<=10^9. [算法]树分块+ ...

  9. BZOJ 3809 Gty的二逼妹子序列 莫队算法+分块

    Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们 ...

随机推荐

  1. 学习java设计模式有用吗?懂这六个原则,编程更轻松

    学习java设计模式有用吗?懂这六个原则,编程更轻松 1.开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭.在程序需要进行拓展的时候,不能去修改原有的代码,实 ...

  2. Python--MySql(主键的创建方式、存储引擎、存储过程、索引、pymsql)

    主键的创建方式 1. create table stud( id int not null unique, name ) ); mysql> desc stud; +-------+------ ...

  3. Windows最值得安装的小众软件

    用电脑这么久,也琢磨出自己的一些使用心得.今天和大家分享几个Windows效率工具.数量不多,但每个都是精品. ▌软件下载-卫星公众好「悦享软件」,在后台会话框中回复关键字:h108 1.Ditto ...

  4. 阿里云Redis 配置

    查看路径whereis redis 1.修改配置文件 vim /etc/redis.conf 这三个配置是必须的 修改内容,把 daemonize no 修改为:daemonize yes requi ...

  5. 51NOD 1005

    1005 大数加法  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出2个大整数A,B,计算A+B的结果.   Input 第1行:大数A 第2行:大 ...

  6. UVA

    A network is composed of N computers connected by N - 1 communication links such that any two comput ...

  7. Jmeter脚本如何在Linux通过no GUI的方式运行 命令行传递参数

    本文主要介绍Jmeter脚本如何在Linux通过no GUI的方式运行.总共分三部分: 1.Linux下JDK的安装及环境变量的配置 2.Linux下Jmeter的安装及环境变量的配置 3.运行结果的 ...

  8. CSS实现进度条

    进度条经常运用于网页,即使我们意识到不是所有的东西都将瞬间被加载完成,这些进度条用于提醒使用者关于网页上具体的任务进程,譬如上传,下载,加载应用程序等. 以前如果想要创建一个进度条的动画效果,没有使用 ...

  9. Spark on YARN--WordCount、TopK

    原文地址:http://blog.csdn.net/cklsoft/article/details/25568621 1.首先利用http://dongxicheng.org/framework-on ...

  10. Neo4j parameter

    Neo4j browser: $ :help param Set a parameter Set a parameter to be sent with queries. The :param nam ...