bzoj 4358 Permu - 莫队算法 - 链表
考虑使用莫队算法。
每次插入一个数$x$,对值域的影响可以分成4种情况:
- $x - 1$, $x + 1$都不存在。
- 只有$x - 1$存在,等价于在一段后面添加一个数
- 只有$x + 1$存在,等价于在一段前面添加一个数
- $x - 1$和$x + 1$都存在,等价于把两段拼起来
所以只有端点处的信息有用。我们考虑维护端点处的信息。
为了方便区分存在和不存在,我们维护开区间。
每个端点的$pre$指向这一段开头的前一个位置,每个端点的$suf$指向这一段结尾的后一个位置。
然后讨论一下就能更新了。
同时发现在保证顺序的情况下资瓷删除。(不能也没有关系)
然后让莫队回滚一下就做完了。时间复杂度$O(m\sqrt{n})$。
Code
/**
* bzoj
* Problem#4358
* Accepted
* Time: 3600ms
* Memory: 2664k
*/
#include <bits/stdc++.h>
using namespace std;
typedef bool boolean; const int cs = ; typedef class Query {
public:
int l, r, id, res; boolean operator < (Query b) const {
if ((l >> ) != (b.l >> ))
return (l >> ) < (b.l >> );
return r < b.r;
}
}Query; int n, m;
int *ar;
int *suf, *pre;
Query* qs; inline void init() {
scanf("%d%d", &n, &m);
ar = new int[(n + )];
suf = new int[(n + )];
pre = new int[(n + )];
qs = new Query[(m + )];
for (int i = ; i < n; i++)
scanf("%d", ar + i);
for (int i = ; i < m; i++) {
scanf("%d%d", &qs[i].l, &qs[i].r);
qs[i].l--, qs[i].r--, qs[i].id = i;
}
} boolean exist(int x) {
return pre[x] != suf[x];
} void insert(int x, int& res) {
boolean sgnpre = exist(x - ), sgnsuf = exist(x + );
if (!sgnpre && !sgnsuf) {
pre[x] = x - ;
suf[x] = x + ;
res = max(res, );
} else if (sgnpre && !sgnsuf) {
int front = pre[x - ];
pre[x] = front, suf[x] = x + ;
suf[front + ] = x + ;
res = max(res, x - front);
} else if (sgnsuf && !sgnpre) {
int rear = suf[x + ];
pre[x] = x - , suf[x] = rear;
pre[rear - ] = x - ;
res = max(res, rear - x);
} else {
int front = pre[x - ], rear = suf[x + ];
pre[x] = front, suf[x] = rear;
suf[front + ] = rear, pre[rear - ] = front;
res = max(res, rear - front - );
}
} void remove(int x) {
boolean sgnpre = exist(x - ), sgnsuf = exist(x + );
if (!sgnpre && !sgnsuf)
pre[x] = suf[x] = x;
else if (sgnpre && !sgnsuf) {
int front = pre[x];
pre[x] = suf[x] = suf[front + ] = x;
} else if (sgnsuf && !sgnpre) {
int rear = suf[x];
pre[x] = suf[x] = pre[rear - ] = x;
} else {
int front = pre[x], rear = suf[x];
pre[x] = suf[x] = x;
suf[front + ] = pre[rear - ] = x;
}
} inline void solve() {
sort(qs, qs + m);
Query* q = qs, *ped = qs + m;
for (int sid = ; q != ped; sid++) {
int ed = cs * (sid + ), mdzzr = ed - ;
for (int i = ; i <= n + ; i++)
pre[i] = suf[i] = i;
int cures = ;
for ( ; q != ped && (q->l >> ) == sid; q++) {
if ((q->r >> ) == sid) {
q->res = ;
for (int i = q->l; i <= q->r; i++)
insert(ar[i], q->res);
for (int i = q->r; i >= q->l; i--)
remove(ar[i]);
} else {
while (mdzzr < q->r)
insert(ar[++mdzzr], cures);
int nres = cures;
for (int i = ed - ; i >= q->l; i--)
insert(ar[i], nres);
q->res = nres;
for (int i = q->l; i < ed; i++)
remove(ar[i]);
}
}
}
for (int i = ; i < m; i++)
while (qs[i].id != i)
swap(qs[i], qs[qs[i].id]);
for (int i = ; i < m; i++)
printf("%d\n", qs[i].res);
} int main() {
init();
solve();
return ;
}
bzoj 4358 Permu - 莫队算法 - 链表的更多相关文章
- 【BZOJ】4358: permu 莫队算法
[题意]给定长度为n的排列,m次询问区间[L,R]的最长连续值域.n<=50000. [算法]莫队算法 [题解]考虑莫队维护增加一个数的信息:设up[x]表示数值x往上延伸的最大长度,down[ ...
- bzoj 4358: permu 莫队
第一步先莫队分块. 对于每一块l~r,初始右端点设为r+1,然后每个询问先将右端点往右移,然后处理询问在l~r之间的部分,最后用一个栈再把l~r的复原. 具体来说是维护两个数组now1和now2,一个 ...
- BZOJ 3757 苹果树 ——莫队算法
挺好的一道题目,怎么就没有版权了呢?大数据拍过了,精神AC.... 发现几种颜色这性质比较垃圾,不可加,莫队硬上. %了一发popoqqq大神的博客, 看了一波VFK关于糖果公园的博客, 又找了wjm ...
- bzoj 2038(莫队算法)
2038: [2009国家集训队]小Z的袜子(hose) 时间限制: 20 Sec 内存限制: 259 MB 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来 ...
- Codeforces 765F Souvenirs - 莫队算法 - 链表 - 线段树
题目传送门 神速的列车 光速的列车 声速的列车 题目大意 给定一个长度为$n$的序列,$m$次询问区间$[l, r]$内相差最小的两个数的差的绝对值. Solution 1 Mo's Algorith ...
- BZOJ 4358 坑 莫队+线段树 死T
这是一个坑 竟然卡nsqrt(n)logn T死 等更 //By SiriusRen #include <cmath> #include <cstdio> #include & ...
- bzoj 3809 Gty的二逼妹子序列(莫队算法,块状链表)
[题意] 回答若干个询问,(l,r,a,b):区间[l,r]内权值在[a,b]的数有多少[种]. [思路] 考虑使用块状链表实现莫队算法中的插入与删除. 因为权值处于1..n之间,所以我们可以建一个基 ...
- bzoj 2038 A-小Z的袜子[hose] - 莫队算法
作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从 ...
- 【BZOJ】4129: Haruna’s Breakfast 树分块+带修改莫队算法
[题意]给定n个节点的树,每个节点有一个数字ai,m次操作:修改一个节点的数字,或询问一条树链的数字集合的mex值.n,m<=5*10^4,0<=ai<=10^9. [算法]树分块+ ...
随机推荐
- 不规则的JSON解析(一)
现有如下数据结构: { "orderId":"000001", "goodsId[0]":"001", &q ...
- python2.7.X 升级至Python3.6.X
安装Python3 项目是在py3环境下进行编码的,正好yczhang默认的py版本是2,我们还需要安装py3才能让程序run起来,在此之前,需要安装开发工具包,因为要编译安装Python [root ...
- Codeforces Round 504
(交互题真神奇,,,我自己瞎写了一发目测样例都没过去就AC了...) (只出了两题的竟然没掉下蓝名真是可怕) A:我的代码太不美观了,放个同学的(因为我是c++63分的蒟蒻所以根本不知道那些函数怎么用 ...
- 无网络 使用pip安装mxnet
# 在有网络的同系统机器上运行以下命令:pip download mxnet# 目前mxnet版本为1.3.0,执行后当前目录得到以下文件: # . # ├── certifi--py2.py3-no ...
- Ubuntu12.04下解决sudo apt-get update警告Duplicate sources.list entry
sudo apt-get update,会提示如下警告: W: Duplicate sources.list entry http://archive.canonical.com/ubuntu/ pr ...
- WdatePicker日历添加事件,在任意月改变时处理日期事件
原由 在做系统时根据要求有时候需要屏蔽掉某些特殊的日期,像周日或者法定假日,以及一些调班的日期:使用WdatePicker可以屏蔽掉周日和大多数法定假日,但像清明或者调班的日期则不好处理. 想法 1: ...
- DELPHI中完成端口(IOCP)的简单分析(4)
DELPHI中完成端口(IOCP)的简单分析(4) 在我以前写的文章中,一直说的是如何接收数据.但是对于如何发送数据却一点也没有提到.因为从代码量上来说接收的代码要比发送多很多.今天我就来写一下如 ...
- 1、js比较日期的大小
① html <div class="ptb10"><span>共享开始时间:</span><input type="text& ...
- Django中一个项目使用多个数据库
在django项目中, 一个工程中存在多个APP应用很常见. 有时候希望不同的APP连接不同的数据库,这个时候需要建立多个数据库连接. 参考:http://blog.csdn.net/songfree ...
- mybatis BindingException: Invalid bound statement (not found)
错误截图 解决措施 此异常的原因是由于mapper接口编译后在同一个目录下没有找到mapper映射文件而出现的. 通常我们在配置SqlSessionFactory时会有如配置 <!-- 配置Sq ...