CodeChef:Chef and Problems

题目大意

有一个长度为n的序列$a_1,a_2,……,a_n$,每次给出一个区间[l,r],求在区间内两个相等的数的最远距离($max(j-i,满足a_i==a_j且l\le i,j \le r)$)

思路:

分块将序列分成sqrt(n)块
预处理出每个数在每个块之后出现的最早位置和在每个块之前出现的最晚位置O(msqrt(n))
然后就可以按块进行区间DP,求出所有块之间的最大值 O(nsqrt(n))

答案就是max(f[L][R](两个数都在[L,R]里面的答案)O(1)
两个数都在[L,R]外面的答案,O(sqrt(n))
一个数在[L,R]里面,一个在外面的答案 O(sqrt(n)) )

总复杂度O(nsqrt(n))

具体实现看代码

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define maxn 100005
#define maxs 350
#define inf 0x3fffff
int block[maxn],a[maxn],size,f[maxs][maxs],pre[maxn][maxs],nex[maxn][maxs],mi[maxn];
int main(){
// freopen("1.in","r",stdin);
int n,m,q,l,r;scanf("%d%d%d",&n,&m,&q);size=sqrt(n);
for(int i=;i<=n;i++)scanf("%d",a+i),block[i]=(i-)/size+;
//预处理出每个数在每个块之后出现的最早位置和在每个块之前出现的最晚位置O(msqrt(n))
for(int i=;i<=n;i++)nex[a[i]][block[i]]=i;
for(int i=n;i>=;i--)pre[a[i]][block[i]]=i;
for(int i=;i<=m;i++){
pre[i][block[n]+]=inf;
for(int j=block[n];j>=;j--){
if(!pre[i][j])pre[i][j]=inf;
pre[i][j]=min(pre[i][j],pre[i][j+]);
}
for(int j=;j<=block[n];j++){
nex[i][j]=max(nex[i][j],nex[i][j-]);
}
}
//按块进行区间DP,求出所有块之间的最大值
for(int i=block[n];i>=;i--){
for(int j=i;j<=block[n];j++){
f[i][j]=max(f[i][j-],f[i+][j]);
for(int k=(i-)*size+,l=i*size;k<=l;k++){
f[i][j]=max(f[i][j],nex[a[k]][j]-k);
}
}
}
for(int i=;i<q;i++){
scanf("%d%d",&l,&r);
int L=block[l]+,R=block[r]-,ans=f[L][R];
//求出左端点在[L,R]外,右端点在[L,R]里面的答案
for(int j=l;block[j]==block[l];j++)if(!mi[a[j]])mi[a[j]]=j,ans=max(ans,nex[a[j]][R]-j);
for(int j=r;block[j]==block[r];j--){
ans=max(ans,j-(mi[a[j]]?mi[a[j]]:j));//求出两个端点都在[L,R]外的答案
ans=max(ans,j-pre[a[j]][L]);//求出右端点在[L,R]外,左端点在[L,R]里面的答案
}
for(int j=l;block[j]==block[l];j++)mi[a[j]]=;
printf("%d\n",ans);
}
return ;
}

CodeChef:Chef and Problems(分块)的更多相关文章

  1. CodeChef Chef and Churu [分块]

    题意: 单点修改$a$ 询问$a$的区间和$f$的区间和 原来普通计算机是这道题改编的吧... 对$f$分块,预处理$c[i][j]$为块i中$a_j$出现几次,$O(NH(N))$,只要每个块差分加 ...

  2. codechef Chef and Problems

    终于补出这道:一直耽搁到现在 找到一个代码可读性很好的分块temp; 题意:给一个长度为n 的数组 A,Q次询问,区间相等数的最大范围是多少? 数据范围都是10e5; 当然知道分块了: 传统分块看各种 ...

  3. Chef and Problems(from Code-Chef FNCS) ( 回 滚 )

    题目: 题意:给定序列,求[l,r]区间内数字相同的数的最远距离. 链接:https://www.codechef.com/problems/QCHEF #include<bits/stdc++ ...

  4. 【xsy2111】 【CODECHEF】Chef and Churus 分块+树状数组

    题目大意:给你一个长度为$n$的数列$a_i$,定义$f_i=\sum_{j=l_i}^{r_i} num_j$. 有$m$个操作: 操作1:询问一个区间$l,r$请你求出$\sum_{i=l}^{r ...

  5. 【Codechef-Hard】Chef and Churu 分块

    题目链接: https://www.codechef.com/problems/FNCS Solution 大力分块.. 对序列分块,维护块内前缀和.块的前缀和,修改时暴力维护两个前缀和,询问单点答案 ...

  6. CODECHEF Chef and Churus 解题报告

    [CODECHEF]Chef and Churus Description 有一个长度为\(n\)的数组\(A\),有\(n\)个函数,第\(i\)个函数的值为\(\sum_{j=l_i}^{r_i} ...

  7. Codechef TRIPS Children Trips (分块、倍增)

    题目链接: https://www.codechef.com/problems/TRIPS 感觉CC有点毒瘤啊.. 题解: 首先有一个性质可能是因为太傻所以网上没人解释,然而我看了半天: 就是正序和倒 ...

  8. codechef Chef and The Right Triangles 题解

    Chef and The Right Triangles The Chef is given a list of N triangles. Each triangle is identfied by ...

  9. codechef Chef And Easy Xor Queries

    做法:我们考虑前缀异或和,修改操作就变成了区间[i,n]都异或x 查询操作就变成了:区间[1,x]中有几个k 显然的分块,每个块打一个tag标记表示这个块中所有的元素都异或了tag[x] 然后处理出这 ...

随机推荐

  1. python中的OrderedDict

    该类型存放顺序和添加顺序一致,比如逐个赋值,但和dict直接转化过去的顺序不一定一样. d1 = collections.OrderedDict() d1['b'] = 'B'd1['a'] = 'A ...

  2. vue 挂载点 实例 模板

    挂载点:vue实例 里面的el属性 对应的 id 所在的dom节点 模板:指的是挂载点内部的内容           模板可以写在挂载点内部           也可以写在属性里面 demo < ...

  3. The Counting Problem

    The Counting Problem 询问区间\([a,b]\)中\(1\sim 9\)出现的次数,0 < a, b < 100000000. 解 显然为数位递推,考虑试填法,现在关键 ...

  4. 树形dp经典换根法——cf1187E

    假设以u为根时结果是tot,现在转换到了以u的儿子v为根,那么结果变成了tot-size[v]+(sizetot-size[v]) 根据这个转移方程,先求出以1为根的tot,然后dfs一次转移即可 # ...

  5. Xadmin+layUi Net框架

    1.引用xadmin  layui 2.autofac+dapper+mvc 3.效果展示 4.github https://github.com/sulin888/LsProject 登录密码:Ad ...

  6. day 64 Django基础十之Form和ModelForm组件

    Django基础十之Form和ModelForm组件   本节目录 一 Form介绍 二 Form常用字段和插件 三 From所有内置字段 四 字段校验 五 Hook钩子方法 六 进阶补充 七 Mod ...

  7. java编程规约一

    提高开发效率,比较重视代码规范,尤其是可扩展性和可维护性,以及可读性.如果你是一个刚进公司的开发者,最好先问问前辈是否有 内部的开发规范,花点时间过一遍.即使提交代码没有review的步骤,自己心里应 ...

  8. SWT图形用户界面之配置

    1.在eclipse的plugins目录下找到org.eclipse.swt.win32.win32.x86_64_3.111.0.v20190605-1801.jar文件 其中3.111.0是ecl ...

  9. 第四周课堂笔记3th

    1.函数的嵌套 作用域,说的是变量 全局作用域:内置命名空间,全局命名空间  全局空间不可以引用局部空间 局部作用域: 局部命名空间  开辟的临时空间前提是调用了函数 全局作用域在整个文件中被使用 L ...

  10. Homebrew(brew)安装MySQL@5.7及配置

    查找并确定自己需要安装的版本 brew search mysql ==> Formulae automysqlbackup mysql-connector-c mysql@5.5 mysql m ...