2018.07.01 洛谷小B的询问(莫队)
P2709 小B的询问
题目描述
小B有一个序列,包含N个1~K之间的整数。他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数。小B请你帮助他回答询问。
输入输出格式
输入格式:
第一行,三个整数N、M、K。
第二行,N个整数,表示小B的序列。
接下来的M行,每行两个整数L、R。
输出格式:
M行,每行一个整数,其中第i行的整数表示第i个询问的答案。
输入输出样例
输入样例#1:
6 4 3
1 3 2 1 1 3
1 4
2 6
3 5
5 6
输出样例#1:
6
9
5
2
说明
对于全部的数据,1<=N、M、K<=50000
这是本蒟蒻第一次写莫队算法,但是由于题目太水,直接过掉。
这里简单说一下莫队算法吧。
莫队算法其实就是一种优雅的暴力,对于随机的数据,常规的暴力其实表现是不错的,但是常规的暴力并没有复杂度的保证,那么我们知道,常规的暴力最坏情况是O(1)" role="presentation" style="position: relative;">O(1)O(1)预处理,O(n)" role="presentation" style="position: relative;">O(n)O(n)查询,原因是询问区间的左右端点的移动次数没有保证,那么为了使它们的移动次数有保证,我们要借用分块的思想,将询问的左端点分块,让块的编号作为第一关键字,右端点作为第二关键字排序,这样在块内部每次移动最多O(sqrt(n))" role="presentation" style="position: relative;">O(sqrt(n))O(sqrt(n)),块与块之间每次最多也移动O(sqrt(n))" role="presentation" style="position: relative;">O(sqrt(n))O(sqrt(n)),因此我们处理询问的复杂度就有了保障。总时间复杂度为O(n∗sqrt(n))" role="presentation" style="position: relative;">O(n∗sqrt(n))O(n∗sqrt(n))。
这题的代码:
#include<bits/stdc++.h>
#define N 50005
using namespace std;
int n,m,k,sig,a[N],sum[N],cnt[N],tl=0,tr=0,ans=0;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
return ans;
}
struct Node{int l,r,id,pos;}q[N];
inline bool cmp(Node a,Node b){return a.pos==b.pos?a.r<b.r:a.pos<b.pos;}
int main(){
n=read(),m=read(),k=read(),sig=sqrt(n);
for(int i=1;i<=n;++i)a[i]=read();
for(int i=1;i<=m;++i)q[i].l=read(),q[i].r=read(),q[i].id=i,q[i].pos=(q[i].l-1)/sig+1;
sort(q+1,q+m+1,cmp);
for(int i=1;i<=m;++i){
int ql=q[i].l,qr=q[i].r;
while(tl<ql){ans-=2*cnt[a[tl]]-1,--cnt[a[tl]],++tl;}
while(tl>ql){--tl,++cnt[a[tl]],ans+=2*cnt[a[tl]]-1;}
while(tr<qr){++tr,++cnt[a[tr]],ans+=2*cnt[a[tr]]-1;}
while(tr>qr){ans-=2*cnt[a[tr]]-1,--cnt[a[tr]],--tr;}
sum[q[i].id]=ans-1;
}
for(int i=1;i<=m;++i)printf("%d\n",sum[i]);
return 0;
}
2018.07.01 洛谷小B的询问(莫队)的更多相关文章
- 2018.07.01洛谷P2617 Dynamic Rankings(带修主席树)
P2617 Dynamic Rankings 题目描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i ...
- 2018.07.17 洛谷P1368 工艺(最小表示法)
传送门 好的一道最小表示法的裸板,感觉跑起来贼快(写博客时评测速度洛谷第二),这里简单讲讲最小表示法的实现. 首先我们将数组复制一遍接到原数组队尾,然后维护左右指针分别表示两个即将进行比较的字符串的头 ...
- 洛谷P2709 小B的询问 莫队做法
题干 这个是用来学莫队的例题,洛谷详解 需要注意的一点,一定要分块!不然会慢很多(直接TLE) 其中分块只在排序的时候要用,并且是给问题右端点分块 再就是注意add与del函数里的操作,增加数量不提, ...
- 洛谷P2709 小B的询问 莫队
小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小 ...
- Bzoj2120/洛谷P1903 数颜色(莫队)
题面 Bzoj 洛谷 题解 考虑对操作离线后分块处理询问操作(莫队算法),将询问操作按照编号分块后左端点第一关键字,右端点第二关键字排序(分块大小为\(n^{\frac 23}\)),对于每一个询问操 ...
- 洛谷 P4887 -【模板】莫队二次离线(第十四分块(前体))(莫队二次离线)
题面传送门 莫队二次离线 mol ban tea,大概是这道题让我第一次听说有这东西? 首先看到这类数数对的问题可以考虑莫队,记 \(S\) 为二进制下有 \(k\) 个 \(1\) 的数集,我们实时 ...
- Bzoj 3781: 小B的询问 莫队,分块,暴力
3781: 小B的询问 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 426 Solved: 284[Submit][Status][Discuss ...
- BZOJ3781:小B的询问(莫队)
Description 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L ...
- 小B的询问 莫队分块
题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重 ...
随机推荐
- VBox 安装 macOS 10.12
安装步骤⑴ 下载及解压 macOS 10.12 Sierra Final by TechReviews.rar ⑵ 下载及双击安装 VirtualBox-5.1.6-110634-Win.exe ,默 ...
- Java8Stream
判断一个操作是惰性求值还是及早求值很简单:只需看它的返回值.如果返回值是 Stream,那么是惰性求值.其实可以这么理解,如果调用惰性求值方法,Stream 只是记录下了这个惰性求值方法的过程,并没有 ...
- auto semicolon insertion 自动分号补齐的坑
今天发现js自动分号补齐的坑,来看如下两段代码: function Hello(){ return { name: ’JavaScript’ }; } alert(Hello()); //输出unde ...
- 解决windows 下mysql 表名自动转成小写的问题
由于web用的是mvc,数据库用的是mysql.为了方便开发,在windows7下面也安装了个mysql,今天在创建表的时候,遇到了个棘手的问题.所有的表名都转成了小写,这不是我要的,作为处女座,是不 ...
- 第六章 图(b1)邻接矩阵
- 百度BAE的一些使用心得
休眠会释放单元资源停止收费,那就不用被百度收费了
- np.random.seed()
124.np.random.seed()的作用 陈容喜 关注 2018.01.11 21:36 字数 3 阅读 4460评论 0喜欢 6 今天看到一段代码时遇到了np.random.seed(),搞不 ...
- keras—神经网络CNN—CIFAR_10图像识别
1 from keras.datasets import cifar10 from keras.utils import np_utils import matplotlib.pyplot as pl ...
- Excel Sheet Column Title (STRING - TYPE CONVERTION)
QUESTION Given a positive integer, return its corresponding column title as appear in an Excel sheet ...
- [leetcode]139. Word Break单词能否拆分
Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine ...