4358: permu

链接

分析:

  不删除的莫队+可撤销的并查集。

  每次询问先固定左端点到一个块内,然后将这些右端点从小到大排序,然后询问的过程中,右端点不断往右走,左端点可能会撤销,但是移动区间不超过$\sqrt n$个,用带撤销的并查集维护。

  复杂度$O(n \sqrt n log n)$

代码:

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
#include<bitset>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
int bel[N], a[N], ans[N], fa[N], dep[N], B, Top, Mx, n;
bool vis[N];
struct Que{ int l, r, id; } ;
struct Node{ int x, d; } sk[N << ]; // N * 2 !!!
bool operator < (const Que &A,const Que &B) { return A.r < B.r; }
vector< Que > q[N]; int solve1(int x,int y) {
if (x == y) return ;
vector<int>vec;
for (int i = x; i <= y; ++i) vec.push_back(a[i]);
sort(vec.begin(), vec.end());
int res = , now = ;
for (int i = ; i < (int)vec.size(); ++i)
vec[i] == vec[i - ] + ? now ++ : now = , res = max(res, now); // !!!
return res;
}
int find(int x) {
return x == fa[x] ? x : find(fa[x]);
}
void Union(int x,int y) {
x = find(x), y = find(y);
if (x == y) return ;
if (dep[x] < dep[y]) swap(x, y);
Mx = max(Mx, dep[x] + dep[y]);
fa[y] = x;
sk[++Top] = (Node){x, dep[x]};
sk[++Top] = (Node){y, dep[y]};
dep[x] += dep[y];
}
void add(int x) {
vis[x] = ;
if (vis[x - ]) Union(x - , x);
if (vis[x + ]) Union(x, x + );
}
void solve(int now,vector<Que> &vec) {
Top = , Mx = ;
int pos = min(N, now * B) + , lastpos, lastmx, L = pos, R = pos - ;
for (int i = ; i <= n; ++i) fa[i] = i, dep[i] = , vis[i] = ;
for (int i = ; i < (int)vec.size(); ++i) {
Que v = vec[i];
while (R < v.r) add(a[++R]);
lastmx = Mx, lastpos = Top;
while (L > v.l) add(a[--L]);
ans[v.id] = Mx;
Mx= lastmx;
while (Top > lastpos) fa[sk[Top].x] = sk[Top].x, dep[sk[Top].x] = sk[Top].d, Top --;
while (L < pos) vis[a[L ++]] = ;
}
}
int main() {
n = read();int m = read(); B = sqrt(n);
for (int i = ; i <= n; ++i) a[i] = read(), bel[i] = (i - ) / B + ;
for (int i = ; i <= m; ++i) {
int x = read(), y = read();
if (bel[x] == bel[y]) ans[i] = solve1(x, y);
else q[bel[x]].push_back((Que){x, y, i});
}
for (int i = ; i <= bel[n]; ++i) sort(q[i].begin(), q[i].end()), solve(i, q[i]);
for (int i = ; i <= m; ++i) printf("%d\n", ans[i]);
return ;
}

4358: permu的更多相关文章

  1. bzoj 4358 Permu - 莫队算法 - 链表

    题目传送门 需要高级权限的传送门 题目大意 给定一个全排列,询问一个区间内的值域连续的一段的长度的最大值. 考虑使用莫队算法. 每次插入一个数$x$,对值域的影响可以分成4种情况: $x - 1$, ...

  2. bzoj 4358 permu

    比较容易想到莫队算法+线段树,但是这样时间复杂度是O(nsqrtnlogn)无法通过,考虑如果不进行删除操作,只有添加操作的话那么并查集就可以实现了,于是可以设定sqrtn块,每个块范围为(i-1)* ...

  3. bzoj 4358: permu 莫队

    第一步先莫队分块. 对于每一块l~r,初始右端点设为r+1,然后每个询问先将右端点往右移,然后处理询问在l~r之间的部分,最后用一个栈再把l~r的复原. 具体来说是维护两个数组now1和now2,一个 ...

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

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

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. HDU 4358 Boring counting(莫队+DFS序+离散化)

    Boring counting Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 98304/98304 K (Java/Others) ...

  7. 【DP】permu

    permu [Description] 给定两个1~N的全排列A,B.有两个指针q和p,一开始q.p都为0,可执行以下三种操作: 1.q+1:2.p+1:3.q+1且p+1(Aq+1≠Bp+1时才可以 ...

  8. bnu 4358 左手定则 (搜索)

    http://www.bnuoj.com/bnuoj/problem_show.php?pid=4358 [题意]:给定起始位置和方向和目的地,按照左转.前进.右转.后退的优先级递减,也就是说能左转就 ...

  9. 【HDOJ】4358 Boring counting

    基本思路是将树形结构转线性结构,因为查询的是从任意结点到叶子结点的路径.从而将每个查询转换成区间,表示从该结点到叶子结点的路径.离线做,按照右边界升序排序.利用树状数组区间修改.树状数组表示有K个数据 ...

随机推荐

  1. Linux vsftd配置文件

    vi /etc/vsftpd.conf listen=YES userlist_deny=NO userlist_enable=YES anonymous_enable=YES local_enabl ...

  2. 对JavaScript中闭包的理解

    在前端开发中闭包是一个很重要的知识点,是面试中一定会被问到的内容.之前我对闭包的理解主要是"通过闭包可以在函数外部能访问到函数内部的变量",对闭包运用的也很少,甚至自己写过闭包自己 ...

  3. TensorFlow实现梯度下降

    # -*- coding: utf-8 -*- """ Created on Mon Oct 15 17:38:39 2018 @author: zhen "& ...

  4. Spring RestTemplate 中文乱码问题

    1.原因 由于RestTemplate的默认构造方法初始化的StringHttpMessageConverter的默认字符集是ISO-8859-1,所以导致RestTemplate请求的响应内容会出现 ...

  5. 手把手教你搭建WEB服务器和FTP服务器

    注:本次教程的环境是在“Windows 10 PC中远程控制的Windows Server 2012 R2服务器”,你可以自己在自己电脑中安装虚拟机再安装Windows Server 2012 R2服 ...

  6. 两个列表lst1和lst2,计算两个列表的公共元素和非公共元素

    方法1: 列表推导式 lst1 = [1, 3, 7] lst2 = [3, 5, 4] a = [x for x in lst1 if x in lst2] b = [y for y in (lst ...

  7. win10锁屏或睡眠一段时间后弹不出登录框

    win10锁屏或睡眠一段时间后弹不出登录框 文:铁乐与猫 通常发生在win10更新到10周年版后发生,也就是会卡在登录状态,但不见输入登录框. 我出现这种情况的时候不是很严重,一般等久些也能出现,但问 ...

  8. D - Milking Time 动态规划

    Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that sh ...

  9. swift class的缺省基类(SwiftObject)与内存模型

    Hard Constraints on Resilience The root of a class hierarchy must remain stable, at pain of invalida ...

  10. CSS3渐变——径向渐变

    上节在<再说CSS3渐变——线性渐变>和大家一起学习了CSS3 Gradient中径向渐变最新语法(称得上是W3C的标准语法)相关知识以及其基本使用.今天我们在这一篇中主要和大家一起来了解 ...