4358: permu
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的更多相关文章
- bzoj 4358 Permu - 莫队算法 - 链表
题目传送门 需要高级权限的传送门 题目大意 给定一个全排列,询问一个区间内的值域连续的一段的长度的最大值. 考虑使用莫队算法. 每次插入一个数$x$,对值域的影响可以分成4种情况: $x - 1$, ...
- bzoj 4358 permu
比较容易想到莫队算法+线段树,但是这样时间复杂度是O(nsqrtnlogn)无法通过,考虑如果不进行删除操作,只有添加操作的话那么并查集就可以实现了,于是可以设定sqrtn块,每个块范围为(i-1)* ...
- bzoj 4358: permu 莫队
第一步先莫队分块. 对于每一块l~r,初始右端点设为r+1,然后每个询问先将右端点往右移,然后处理询问在l~r之间的部分,最后用一个栈再把l~r的复原. 具体来说是维护两个数组now1和now2,一个 ...
- 【BZOJ】4358: permu 莫队算法
[题意]给定长度为n的排列,m次询问区间[L,R]的最长连续值域.n<=50000. [算法]莫队算法 [题解]考虑莫队维护增加一个数的信息:设up[x]表示数值x往上延伸的最大长度,down[ ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- HDU 4358 Boring counting(莫队+DFS序+离散化)
Boring counting Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 98304/98304 K (Java/Others) ...
- 【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时才可以 ...
- bnu 4358 左手定则 (搜索)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=4358 [题意]:给定起始位置和方向和目的地,按照左转.前进.右转.后退的优先级递减,也就是说能左转就 ...
- 【HDOJ】4358 Boring counting
基本思路是将树形结构转线性结构,因为查询的是从任意结点到叶子结点的路径.从而将每个查询转换成区间,表示从该结点到叶子结点的路径.离线做,按照右边界升序排序.利用树状数组区间修改.树状数组表示有K个数据 ...
随机推荐
- Java新建Web应用与配置Tomcat流程
1. 新版本IDEA新建Web应用后没有web.xml文件,需要通过下图方式添加 2. IDEA中的web文件夹相当于eclipse里的WebRoot文件夹,在里面新建WEB-INF文件夹,再创建cl ...
- [20180705]关于hash join 2.txt
[20180705]关于hash join 2.txt --//昨天优化sql语句,执行计划hash join right sna,加入一个约束设置XX字段not null,逻辑读从上万下降到50.- ...
- 11-OpenLDAP主从同步
OpenLDAP主从同步 阅读视图 部署环境 OpenLDAP服务器初始化 配置主服务器同步策略 配置从服务器 OpenLDAP主从同步验证 故障诊断 1. 部署环境 本文以两台服务器为蓝本演示其同步 ...
- vue-cli在控制台创建vue项目时乱码的问题
新装的win10系统,使用vue-cli在控制台创建项目时出现乱码,请问如何处理? 解决: 打开cmd,在控制台输入CHCP 65001,按回车键即可将编码格式设成utf-8,再创建就不会乱码了. 执 ...
- IE浏览器打不开网页的解决方法
前阵子一下子安装了很多软件,后来使用IE游览器的时候,莫名其妙的打不开网页,虽然用其他浏览器(比如谷歌.火狐)可以正常浏览网页,但是由于很多软件内嵌页面都会调用Windows的IE浏览器来加载,所以I ...
- box-shadow的动效制作
突然发现原来box-shadow的功能很强大,还能做动效,下面整理下box-shadow几个效果 案例1:hover效果 <a href="/app/list">WEB ...
- 【BZOJ2820】YY的GCD
[BZOJ2820]YY的GCD Description 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的( ...
- Spark机器学习中ml和mllib中矩阵、向量
1:Spark ML与Spark MLLIB区别? Spark MLlib是面向RDD数据抽象的编程工具类库,现在已经逐渐不再被Spark团队支持,逐渐转向Spark ML库,Spark ML是面向D ...
- A - Divisors POJ - 2992 (组合数C的因子数)数学—大数
题意:就是求组合数C的因子的个数! 先说一下自己THL的算法,先把组合数求出来,然后将这个大数分解,得到各个素数的个数,再利用公式!用最快的大数分解算法 分析一下时间复杂度! n1/4但是分析一下 ...
- dirty_background_ration 与 /proc/sys/vm/dirty_ratio
wappiness的值的大小对如何使用swap分区是有着很大的联系的.swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用s ...