莫队算法学习笔记【BZOJ2038:小Z的袜子】【SPOJ3267:D-query】
很久以前傻乎乎地看来源奇怪的资料的时候被各种曼哈顿弄晕了。
然后现在学会的是分块方法。另新创一个分块方法。
让我们考虑这样一个区间询问问题……
它有如下的性质:
0,n个数,Q个询问。
1,它没有修改操作,这意味着我们可以按我们喜欢的次序跟询问玩耍。实际上后面会讲到我们完全可以按任意次序玩耍。
2,如果我们知道区间询问 [L , R] 对应的值,我们可以轻易求出 [L±1 , R] 和 [L , R±1] 的值。
(其实如果限制增加,比如只能求 [L+1 , R] 和 [L , R-1] 的值,同样不影响问题的解决,——这是我口胡的,没写过,日后再说。我不知道在传统莫队中是怎样的,在新算法中可行。)
3,若2中操作对应复杂度为P,而你需要用O(P*n^1.5)(明明是)O(P*n*Q^0.5)的复杂度来解决问题,那么莫队算法就是你需要的了。
离线方法:将n个数分成sqrt(n)块(一堆这么说的人什么心态)sqrt(Q)块
询问按区间排序,以L所在块序号为第一关键字,R为第二关键字,进行排序。(传统莫队就是如此搞法,YY一下就好了)
不过不知道这个做法怎么流传开的,感觉毫无优点吗……尤其是复杂度这么误导真的好吗。
大部分此类区间题Q总是大于N的(大很多!……)。然后正确的曼哈顿树求法最坏是n*sqrt(m),分块也可以做到这个复杂度,但无脑分块直接成了m*sqrt(n)……
总有一天要出摸你赛把你们卡光光……
(
但是话说回来……随机数据里sqrt(n)块好像还要快一点……
随机数据里明显是把块弄得越大越好吗……
)
先说【SPOJ3267:D-query】,毕竟是要做这道才会的。
不过能想用莫队A这题的也不多。
题目描述
输入
第一行:一个整数n,表示数列的长度。
第二行:n个整数a1,a2,a3,···,an(1 <= ai <= 10^6),数与数之间用一个空格隔开。
第三行:一个整数q(<= 200000),表示询问的次数。
接下来q行,每行两个整数i,j(1 <= i <= j <= n <= 30000),表示要询问的区间。
输出
对于每一询问,输出在这个区间内不同的数字个数。
样例输入
样例输出
无特别。
#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>using namespace std;#define rep(i,j,n) for(int i=j;i<=n;i++)char c;template<class T> inline void read(T&x){for(c=getchar();c<'0'||c>'9';c=getchar());for(x=0;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';};struct E{int x,y,l,list;}d[200010];int next[30010],prev[30010],p[1000010],ans[200010];int n,nn,x,T;bool cmp(E x,E y){return x.l<y.l||(x.l==y.l&&x.y<y.y);}int main(){ read(n);memset(next,63,n<<2); rep(i,1,n){ read(x);if(!p[x])p[x]=i;else prev[i]=p[x],next[p[x]]=i,p[x]=i; } read(T);nn=int(sqrt(n));//块长……理论上的话……改成n/sqrt(m)比较好 rep(i,1,T){read(d[i].x);read(d[i].y);d[i].l=(d[i].x+nn-1)/nn;d[i].list=i;} sort(d+1,d+T+1,cmp); int ll,lr,now; rep(ii,1,T){ if(d[ii].l!=d[ii-1].l){ now=0; rep(i,d[ii].x,d[ii].y) if(prev[i]<d[ii].x) now++; ans[d[ii].list]=now; }else{ if(d[ii-1].x<d[ii].x){ ll=d[ii-1].x;lr=d[ii].x-1; rep(i,ll,lr) if(next[i]>d[ii-1].y) now--; }else{ ll=d[ii].x;lr=d[ii-1].x-1; rep(i,ll,lr) if(next[i]>d[ii-1].y) now++; } ll=d[ii-1].y+1;lr=d[ii].y; rep(i,ll,lr) if(prev[i]<d[ii].x) now++; ans[d[ii].list]=now; } } rep(i,1,T) printf("%d\n",ans[i]);}莫队算法学习笔记【BZOJ2038:小Z的袜子】【SPOJ3267:D-query】的更多相关文章
- 【序列莫队】BZOJ2038- [2009国家集训队]小Z的袜子(hose)
[题目大意]给出1-N只袜子的颜色,多次询问L-R中选出一双同色袜子的概率. [思路] 裸莫队.基本的莫队步骤:①分组(每组大小为根号sqrt(n),共sqrt(n)组)②排序(左边界分组,右边界在组 ...
- E. XOR and Favorite Number 莫队 2038: [2009国家集训队]小Z的袜子(hose)
一直都说学莫队,直到现在才学,训练的时候就跪了 T_T,其实挺简单的感觉.其实训练的时候也看懂了,一知半解,就想着先敲.(其实这样是不好的,应该弄懂再敲,以后要养成这个习惯) 前缀异或也很快想出来 ...
- BZOJ2038 小Z的袜子 (莫队算法)
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=2038 专题练习: http://acm.hust.edu.cn/vjudge/conte ...
- BZOJ-2038 小Z的袜子(hose) 莫队算法
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MB Submit: 5573 Solved: 2568 [Subm ...
- [BZOJ2038]小Z的袜子(莫队算法)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2038 分析:莫队算法 莫队算法是一种思想…… 处理问题:不带修改的区间询问 使用要求:[l-1 ...
- bzoj2038 小Z的袜子(hose)——莫队算法
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 就是莫队算法: 先写了个分块,惨WA: #include<iostream> ...
- 洛谷 P1972 [SDOI2009]HH的项链【莫队算法学习】
P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含 ...
- BZOJ2038小Z的袜子(hose)
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 2343 Solved: 1077[Subm ...
- Bzoj2038 小Z的袜子(hose)
Time Limit: 20000MS Memory Limit: 265216KB 64bit IO Format: %lld & %llu Description 作为一个生活散漫 ...
随机推荐
- PHP几个防SQL注入攻击自带函数区别
SQL注入攻击是黑客攻击网站最常用的手段.如果你的站点没有使用严格的用户输入检验,那么常容易遭到SQL注入攻击.SQL注入攻击通常通过给站点数据库提交不良的数据或查询语句来实现,很可能使数据库中的纪录 ...
- 关于ASP.NET MVC中的视图生成
在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Model 用来表示处理的数据. 从控制器到视图 ...
- PreparedStatement可以有效地防止sql被注入
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import jav ...
- prototype原型属性
<script type="text/javascript"> /* 需求:想把getMax与searchEle方法添加 到数组对象中. functoin Array( ...
- [JavaScript] JavaScript作用域深度解析
JavaScript作用域 JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里. -- JS权威指南 在JS里,一切皆对象,函数也是. 一.有什么用 什么时候会用到它? ...
- unity中的[xxxxxx]特性(Attributes)
[SerializeField] 在Inspector版面中显示非public属性,并且序列化:若写在public前面,等于没写. [Obsolete("调用提示信息")] [No ...
- PCB Layout爬电距离、电气间隙的确定
爬电距离的确定:首先需要确定绝缘的种类:基本绝缘:一次电路与保护地工作绝缘 ① :一次电路内部:二次电路内部工作绝缘 ② :输入部分(输入继电器之前)内部,二次电路与保护地加强绝缘:一次电路与二次电路 ...
- ZOJ 2760 How Many Shortest Path
题目大意:给定一个带权有向图G=(V, E)和源点s.汇点t,问s-t边不相交最短路最多有几条.(1 <= N <= 100) 题解:从源点汇点各跑一次Dij,然后对于每一条边(u,v)如 ...
- WIN7笔记本显示连接不可用
如图所示,找不到任何无线网络 解决方法: 不小心把无线关掉而已,笔记本键盘上F5~F12找看看有没有无线标志,有的话要先按下 Fn键不放,再按下那个有无线标志的Fn键.
- HDOJ 1194 Beat the Spread!(简单题)
Problem Description Superbowl Sunday is nearly here. In order to pass the time waiting for the half- ...