【Luogu4396】[AHOI2013]作业(莫队)】的更多相关文章

[AHOI2013]作业 (莫队+分块) 题面 给定了一个长度为n的数列和若干个询问,每个询问是关于数列的区间[l,r],首先你要统计该区间内大于等于a,小于等于b的数的个数,其次是所有大于等于a,小于等于b的,且在该区间中出现过的数值的个数. 分析 为简化时间复杂度分析,假设n,m在同一个数量级 不完美解法 首先第一问可以用可持久化线段树解决,第二问考虑莫队,莫队的时候用一个树状数组维护数值的出现情况,区间移动的时候,如果出现一个新的权值,就在树状数组上单点更新.反之则单点删除.关键部分代码如…
3236: [Ahoi2013]作业 Time Limit: 100 Sec  Memory Limit: 512 MBSubmit: 1113  Solved: 428[Submit][Status][Discuss] Description Input Output Sample Input 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 Sample Output 2 2 1 1 3 2 2 1 HINT N=100000,M=1000000 Sourc…
莫队..用两个树状数组计算.时间复杂度应该是O(N1.5logN). 估计我是写残了...跑得很慢... ------------------------------------------------------------------------- #include<bits/stdc++.h>   using namespace std;   #define lowbit(x) ((x) & -(x))   const int maxn = 100009; const int m…
[BZOJ3809]Gty的二逼妹子序列 Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们规定妹子们的美丽度全都在[1,n]中. 给定一个长度为n(1<=n<=100000)的正整数序列s(1<=si<=n),对于m(1<=m<=1000000)次询问“l,r,a,b”,每次输出sl...sr中,权值∈[a,b]的权值的…
题意: 询问区间权值在$[a,b]$范围内种类数和个数 莫队 权值分块维护种类数和个数$O(1)-O(\sqrt{N})$ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define pii pair<int, int> #define MP mak…
题目描述 输入 输出 样例输入 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 样例输出 2 2 1 1 3 2 2 1 提示 N=100000,M=1000000 莫队+树状数组: 先考虑每次询问没有权值区间限制的情况,将询问离线排序,用一个数组记录答案,莫队即可. 但现在每次询问有了查询的权值区间,显然一个数组无法记录答案,我们用树状数组来记录答案. 对于第一问直接用树状数组即可,对于第二问先用数组记录每个权值是否出现过再用树状数组维护即可. 莫队时间复杂…
题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1.5})\)次修改和\(O(n)\)次查询. 注意这两个需求并不平衡,所以在搭配数据结构时常使用分块而不是线段树. (转自莫队复杂度分析 by Meiku Kazami) 1.莫队+树状数组 /* 每个[l,r]的询问中又多了[a,b]值的限制.原先now是所有种类的个数,所以用 莫队+树状数组做 两…
Description Input Output Sample Input 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 Sample Output 2 2 1 1 3 2 2 1 HINT N=100000,M=1000000 Solution 首先有一个比较显然的做法就是用莫队加树状数组……然而这样的话复杂度是$n\sqrt nlog$. 因为树状数组的修改和查询都是$log$的,所以我们用一个修改$O(1)$,查询$O(\sqrt n)$的分块代替树状…
题目传送门:洛谷P4396. 题意简述: 给定一个长度为\(n\)的数列.有\(m\)次询问,每次询问区间\([l,r]\)中数值在\([a,b]\)之间的数的个数,和数值在\([a,b]\)之间的不同的数的个数. 题解: 第一问可以用主席树维护,但是第二问呢? 考虑离线处理询问,用莫队算法. 问题转化为加入一个数,删除一个数,统计数值在一个区间中的数的个数. 离散化后可以用树状数组维护,但是复杂度多个log,变成了\(O(n\sqrt{n}\log n)\). 考虑对数值也分块,先离散化,然后…
原文地址:http://www.cnblogs.com/GXZlegend/p/6805252.html bzoj3809 题目描述 Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们规定妹子们的美丽度全都在[1,n]中. 给定一个长度为n(1<=n<=100000)的正整数序列s(1<=si<=n),对于m(1<=m<=1000000)次询问“…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3809 https://lydsy.com/JudgeOnline/problem.php?id=3236 几乎是双倍经验. 题解 对于第一道题目: 如果没有 \(a, b\) 这个区间的限制,那么这道题就是 bzoj1878 [SDOI2009]HH的项链. 这道题虽然有 \(log\) 的做法,不过很多人应该都是拿这道题作为莫队的入门题的. 考虑如果带上范围限制怎么做. 一种显然的做法就是…
传送门 解题思路 莫队+树状数组.把求\([a,b]\)搞成前缀和形式,剩下的比较裸吧,用\(cnt\)记一下数字出现次数.时间复杂度\(O(msqrt(n)log(n)\),莫名其妙过了. 代码 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int MAXM…
#include<cmath> #include<cstdio> #include<algorithm> #include<string> #include<cstring> #include<iostream> #define REP(i,a,n)for(int i=a;i<=n;++i) #define CLR(d,a)memset(d,a,sizeof(d)); using namespace std; void SetI…
BZOJ 3236 AHOI 2013 作业 内存限制:512 MiB 时间限制:10000 ms 标准输入输出     题目类型:传统 评测方式:文本比较 题目大意: 此时己是凌晨两点,刚刚做了Codeforces的小A掏出了英语试卷.英语作业其实不算多,一个小时刚好可以做完.然后是一个小时可以做完的数学作业,接下来是分别都是一个小时可以做完的化学,物理,语文......小A压力巨大.woc他竟然一个小时搞完语文卷子 这是小A碰见了一道非常恶心的数学题,给定了一个长度为n的数列和若干个询问,每…
题目大意:给出一些数,问在一个区间中不同的数值有多少种,和在一个区间中不同的数值有多少个. 思路:因为没有改动,所以就想到了莫队算法.然后我写了5K+的曼哈顿距离最小生成树,然后果断T了.(100s的时限啊,刷status都要刷疯了..,结果最后加了手写读入也没能A). 后来果断放弃,写了分块版的莫队算法. 84sAC...这题卡的..貌似莫队并非正解. 其有用分块来写莫队就非常easy了.仅仅须要将全部询问的区间排序.左端点所在块作为第一键值,右端点作为第二季键值排序,之后就能够转移了.理论上…
莫队+树状数组 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #define N 100055 #define M 1000066 using namespace std; int gy[N],be[N],c[M],cc[M],n,m,nn,maxn,tot,num[N]; struct Query{ int l,…
[Luogu4396][AHOI2013]作业(莫队) 题面 洛谷 题解 模板题 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; #define MAX 300300 inline int read() { int x=0;bool t=false;char ch=getchar(); while((ch<'0'||ch>'9')&&ch…
<题面> 卡常终究比不上算法的优化…… 这是莫队的有点小坑的题, 首先不一定能想到,想到不一定打对,打对不一定打好. 首先你会发现,这个题的时限是很长的- $n$和$m$也是很大的. 于是我们可以计算一个时间复杂度,顺便搞一个块长. 首先有$\Theta (M)$的询问,设块长为$L$, 于是左端点移动,不跨块,移动不超过$L$ 右端点移动$N$ 然后就有左面的总共移动$M \times L $ 右面的移动$\frac{N}{L}\times N$这里应该就是说,每次要挪一个 $N$,而左端点…
BZOJ_3809_Gty的二逼妹子序列 && BZOJ_3236_[Ahoi2013]作业 _莫队+分块 Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b]的妹子的美丽度的种类数. 为了方便,我们规定妹子们的美丽度全都在[1,n]中. 给定一个长度为n(1<=n<=100000)的正整数序列s(1<=si<=n),对于m(1<=m<=10000…
传送门 Description 此时己是凌晨两点,刚刚做了Codeforces的小A掏出了英语试卷.英语作业其实不算多,一个小时刚好可以做完.然后是一个小时可以做完的数学作业,接下来是分别都是一个小时可以做完的化学,物理,语文......小A压力巨大. 这是小A碰见了一道非常恶心的数学题,给定了一个长度为n的数列和若干个询问,每个询问是关于数列的区间表示数列的第\(l\)个数到第\(r\)个数),首先你要统计该区间内大于等于\(a\),小于等于\(b\)的数的个数,其次是所有大于等于\(a\),…
---题面--- 题解: 题目要求统计一个区间内数值在[a, b]内的数的个数和种数,而这个是可以用树状数组统计出来的,所以可以考虑莫队. 考虑区间[l, r]转移到[l, r + 1],那么对于维护个数的树状数组就直接加即可. 对于维护种数的树状数组,我们额外维护一个数组num,表示数a在区间内出现了多少次,如果是新出现的,那么就加入树状数组. 如果要删除一个数并且这个数在区间内只出现了一次,那么就删除这个数.注意不论什么情况都要实时维护num数组. 然后莫队即可. Gty的二逼妹子序列是洛谷…
这个题正解是莫队+树状数组,但是我个人非常不喜欢树状数组这种东西,所以决定用分块来水这个题.直接在莫队维护信息的时候,维护单点同时维护块内信息就行了. 莫队就是这几行核心代码: void add(int x) { ++f[bl[x]];//维护块 ++cnt[x];//维护点 ) g[bl[x]]++; } void del(int x) { --f[bl[x]]; --cnt[x]; if(!cnt[x]) g[bl[x]]--; } void moqueue() { ,r = ; duke(…
题目传送门 题目描述 此时已是凌晨两点,刚刚做了$Codeforces$的小$A$掏出了英语试卷.英语作业其实不算多,一个小时刚好可以做完.然后是一个小时可与做完的数学作业,接下来是分别都是一个小时可以做完的化学,物理,语文……小$A$压力巨大.    这时小$A$碰到了一道非常恶心的数学题,给定了一个长度为$n$的数列和若干个询问,每个询问是关于数列的区间$[l,r]$(表示数列的第$1$个数到第$r$个数),首先你要统计该区间内大于等于$a$,小于等于$b$的书的个数,其次是所有大于等于$a…
题目链接: BZOJ - 3236   BZOJ - 3809 算法一:莫队 首先,单纯的莫队算法是很好想的,就是用普通的第一关键字为 l 所在块,第二关键字为 r 的莫队. 这样每次端点移动添加或删除一个数字,用树状数组维护所求的信息就是很容易的.由于这里有 logn复杂度,所以这样移动端点的复杂度还是挺高的. 于是 BZOJ-3236 的时限 100s,我的代码跑了 98s,险过...... Paste一个BZOJ-3236的纯莫队代码: #include <iostream> #incl…
正解:莫队 解题报告: 传送门! 天呐太久没做莫队了连板子都认不出来了,,,所以复健下做下莫队的题目QAQ 就很板子鸭,和莫队板子比好像只有一个离散化,,,?就不讲了QAQ 等下直接放代码QAQ over…
莫队显然.然后维护转移的时候如果用树状数组,则很容易TLE.所以用权值分块维护转移. 总复杂度O(m*sqrt(n)). #include<cstdio> #include<algorithm> #include<cmath> using namespace std; int Num,CH[12],f,c; inline void R(int &x){ c=0;f=1; for(;c<'0'||c>'9';c=getchar())if(c=='-')…
题目: 洛谷4396 BZOJ3236(权限) 这题似乎BZOJ上数据强一些? 分析: 这题真的是--一言难尽 发现题面里没说权值的范围,怕出锅就写了离散化.后来经过面向数据编程(以及膜神犇代码)知道最大权值\(1e5\)(下文用\(M\)表示最大权值.注意如果没有这个限制,把所有数的权值和询问中提到的权值一起离散化后\(M\)也可以达到\(n+2m=2.1e6\)),如果没这个限制我很想知道正解应该怎么写--下面再细说 首先看到这种询问某个区间内在某个区域内值的数量的题,显然能想到把询问离线下…
分析 第一问随便搞,直接说第二问. 令原数列为\(seq\),\(pre_i\)为\(seq_i\)这个值上一个出现的位置,于是可以简化询问条件为: \(l \leq i \leq r\) \(a \leq seq_i \leq b\) \(pre_i < l\) 这是一个显然的三维数点问题.发现第三维\(pre_i\)只有最大值的限制,所以我们可以把所有询问按\(l\)升序排序,所有点按\(pre_i\)升序排序,用一个指针从左往右扫所有询问,然后不断向数据结构插入符合第三维要求的点,剩下的两…
莫队:一种非常优雅的暴力,时间复杂度一般情况下是n*根号n,还是很优秀的. 今天水了三道莫队题,对普通莫队有了些了解 1.莫队l和r为指针,维护当前区间的某些信息,一般可以是当前区间不同权值的个数,(或许可以再加些限制) 2.莫队指针移动时的操作一定是O(1)最多O(log(n)), 3.当减值时先减当前的再加,加则反. T1 水题,维护当前区间sum[i]*sum[i]的和,在进行操作即可 1 #include<iostream> 2 #include<cstdio> 3 #in…
3236: [Ahoi2013]作业 Time Limit: 100 Sec  Memory Limit: 512 MBSubmit: 1393  Solved: 562[Submit][Status][Discuss] Description Input Output Sample Input 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 Sample Output 2 2 1 1 3 2 2 1 HINT N=100000,M=1000000 Sourc…