题意

题目链接

给出长度为\(n\)的序列,每次询问区间\([l, r]\),要求最大化

\(max |x − y| : L_i ≤ x, y ≤ R_i and A_x = A_y\)

Sol

标算神仙的一批看不懂。

维护好每个数出现的左右位置之后直接上不删除莫队就行了

#include<bits/stdc++.h>

const int MAXN = 1e5 + 10, INF = 1e9 + 7;
using namespace std;
template<typename A, typename B> inline bool chmax(A &x, B y) {
if(y > x) {x = y; return 1;}
else return 0;
}
template<typename A, typename B> inline bool chmin(A &x, B y) {
if(y < x) {x = y; return 1;}
else return 0;
}
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, K, M, a[MAXN], l[MAXN], r[MAXN], tl[MAXN], tr[MAXN], belong[MAXN], block, cnt, ans[MAXN];
struct query {
int l, r, id;
bool operator < (const query &rhs) const {
return belong[l] == belong[rhs.l] ? r < rhs.r : belong[l] < belong[rhs.l];
}
};
vector<query> q[MAXN];
int solve(int l, int r) {
for(int i = l; i <= r; i++) tl[a[i]] = INF, tr[a[i]] = 0;
int ans = 0;
for(int i = l; i <= r; i++) {
int x = a[i];
chmin(tl[x], i), chmax(tr[x], i);
chmax(ans, tr[x] - tl[x]);
}
return ans;
}
int update(int x) {
chmax(tr[a[x]], x);
chmin(tl[a[x]], x);
return tr[a[x]] - tl[a[x]];
}
int update2(int x) {
int v = a[x];
chmax(r[v], x);
chmin(l[v], x);
return max(tr[v] - l[v], r[v] - l[v]);
}
void LxlDuLiu(vector<query> v, int id) {
int base = id * block, ll = base, rr = ll - 1, pre = 0, now = 0;
memset(tr, 0, sizeof(tr)); memset(r, 0, sizeof(r));
memset(tl, 0x3f, sizeof(tl)); memset(l, 0x3f, sizeof(l)); for(auto &x : v) {
//memset(l, 0x3f, sizeof(l)); memset(r, 0, sizeof(r));
while(rr < x.r) chmax(now, update(++rr));
pre = now;
while(ll > x.l) chmax(now, update2(--ll));
chmax(ans[x.id], now);
while(ll < base) r[a[ll]] = 0, l[a[ll]] = INF, ll++;
now = pre;
}
}
int main() {
// freopen("a.in", "r", stdin);
//freopen("b.out", "w", stdout); N = read(); K = read(); M = read(); block = sqrt(N); int mx = 0;
for(int i = 1; i <= N; i++) a[i] = read(), belong[i] = (i - 1) / block + 1, chmax(mx, belong[i]);
for(int i = 1; i <= M; i++) {
int l = read(), r = read();
if(belong[l] == belong[r]) ans[i] = solve(l, r);
else q[belong[l]].push_back({l, r, i});
}
for(int i = 1; i <= mx; i++) sort(q[i].begin(), q[i].end());
for(int i = 1; i <= mx; i++)
LxlDuLiu(q[i], i);
for(int i = 1; i <= M; i++) printf("%d\n", ans[i]); return 0;
}

codechef QCHEF(不删除莫队)的更多相关文章

  1. BZOJ4358: permu(带撤销并查集 不删除莫队)

    题意 题目链接 Sol 感觉自己已经老的爬不动了.. 想了一会儿,大概用个不删除莫队+带撤销并查集就能搞了吧,\(n \sqrt{n} logn\)应该卡的过去 不过不删除莫队咋写来着?....跑去学 ...

  2. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

  3. 【BZOJ2038】【2009国家集训队】小Z的袜子(hose) 分块+莫队

    Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜 ...

  4. bzoj 3809 Gty的二逼妹子序列(莫队算法,块状链表)

    [题意] 回答若干个询问,(l,r,a,b):区间[l,r]内权值在[a,b]的数有多少[种]. [思路] 考虑使用块状链表实现莫队算法中的插入与删除. 因为权值处于1..n之间,所以我们可以建一个基 ...

  5. bzoj 3289 Mato的文件管理(莫队算法+BIT)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3289 [题意] 回答若干个询问:[l,r]区间内的逆序对个数. [思路] 莫队算法,B ...

  6. bzoj 3781 小B的询问(莫队算法)

    [题意] 若干个询问sigma{ cnt[i]^2 } cnt[i]表示i在[l,r]内的出现次数. [思路] 莫队算法,裸题. 一个cnt数组即可维护插入与删除. [代码] #include< ...

  7. bzoj 2038 [2009国家集训队]小Z的袜子(hose)(莫队算法)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2038 [题意] 给定一个有颜色的序列,回答若干个询问:区间内任选两个颜色相同的概率. ...

  8. Bzoj 3809: Gty的二逼妹子序列 莫队,分块

    3809: Gty的二逼妹子序列 Time Limit: 35 Sec  Memory Limit: 28 MBSubmit: 868  Solved: 234[Submit][Status][Dis ...

  9. [BZOJ 3236] [Ahoi2013] 作业 && [BZOJ 3809] 【莫队(+分块)】

    题目链接: BZOJ - 3236   BZOJ - 3809 算法一:莫队 首先,单纯的莫队算法是很好想的,就是用普通的第一关键字为 l 所在块,第二关键字为 r 的莫队. 这样每次端点移动添加或删 ...

随机推荐

  1. Akka-Cluster(0)- 分布式应用开发的一些想法

    当我初接触akka-cluster的时候,我有一个梦想,希望能充分利用actor自由分布.独立运行的特性实现某种分布式程序.这种程序的计算任务可以进行人为的分割后再把细分的任务分派给分布在多个服务器上 ...

  2. google的android工具常用下载路径

    android的bug工具在网上搜的时候,经常被索引到垃圾网站,今天找到了一个网站下载android工具 都是最新的,十分不错,就做个分享吧. Google 提供了 Windows.macOS 以及 ...

  3. Testing - 软件测试知识梳理 - 自动化测试

    软件开发的过程是一个持续集成和改进的过程,而每一次的改进都可能引进新bug,因此当软件的一部,或者全部修改时,都需要对软件产品重新进行测试. 其目的是要验证修改后的产品是符合需求的,而当没有自动化测试 ...

  4. postgresql-删除重复数据

      greenplum最终的方法是: delete from test where (gp_segment_id, ctid) not in (select gp_segment_id, min(ct ...

  5. 21-json pickle shelve XML

    我们把对象从内存中变成可存储或传输的过程称之为序列化 在python中叫picking 在其他语言中也被称之为 serialization marshalling flattening等等 序列化之后 ...

  6. Win10上安装TensorFlow(官方文档翻译)

    一.推荐两个网站 TensorFlow官方文档:https://www.tensorflow.org/install/install_windows TensorFlow中文社区:http://www ...

  7. windows下更新node环境

    https://github.com/Kenshin/gnvm 下载gnvm.exe程序 使用where node命令查看node所在目录,并将下载好的gnvm.exe程序复制到目录中 输入gnvm  ...

  8. 全网最详细的实用的搜索工具Listary和Everything对比的区别【堪称比Everything要好】(图文详解)

    不多说,直接上干货! 引言 无论是工作还是科研,我们都希望工作既快又好,然而大多数时候却迷失在繁杂的重复劳动中,久久无法摆脱繁杂的事情.   你是不是曾有这样一种想法:如果我有哆啦A梦的口袋,只要拿出 ...

  9. 常用的npm指令总结

    一.安装指令,通常是全局安装 npm install <package name> -g 二.移除全局安装包 npm uninstall <package name> -g 三 ...

  10. ACM 要学

    初期: 一.基本算法: (1)枚举. (poj1753,poj2965)  (2)贪心(poj1328,poj2109,poj2586)  (3)递归和分治法.  (4)递推.  (5)构造法.(po ...