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. delphi 流程单打印

    1.添加声明 f_count1: double; 2.得到拆分页数量 // Modified by 884 2018-04-20 14:50:18 AM0057 with aqTpCount do b ...

  2. delphi 还原窗口

    1.格局还原procedure TFrmStyleProp.btnNewClick(Sender: TObject); //声明var iniFile : TIniFile; idx : intege ...

  3. (转)JNI入门教程之HelloWorld篇 .

    转: http://blog.csdn.net/mingjava/article/details/180946 本文讲述如何使用JNI技术实现HelloWorld,目的是让读者熟悉JNI的机制并编写第 ...

  4. Android问题集锦An error occurred while automatically activating bundle com.android.ide.eclipse.adt .

    这是Eclipse的问题,重启之后问题依旧. 在坛子里找到这个办法,果然好用. 命令行到eclipse路径运行:eclipse.exe -clean

  5. 关于Async与Await的FAQ

    =============C#.Net 篇目录============== 环境:VS2012(尽管System.Threading.Tasks在.net4.0就引入,在.net4.5中为其增加了更丰 ...

  6. sql数据库还原,出现媒体簇的结构不正确,SQLServer无法处理此媒体簇的解决方法

    问题: sql数据库还原,出现媒体簇的结构不正确,SQL Server无法处理此媒体簇. 异常如下图. 造成问题的原因: 我的电脑上安装了sql2005和sql2008,问题就在于我用sql2008的 ...

  7. low版九九乘法表

    # while循环实现九九乘法表num_one = 1while num_one <= 9: num_two = 1 while num_two <= num_one: print(&qu ...

  8. spring的mvc对于页面日期格式进行传值到后台

    对于spring的mvc 日期格式从页面传入后台是个问题.string类型和整形都能友好传入.但是对于日期类型date却不能传入.回报403参数不对的错误. 看例子: @RequestMapping( ...

  9. SecureCRT 64位 破解版和安装,以及解决乱码问题

    链接:https://pan.baidu.com/s/1q1DEmohK7ISNJ7UbJkN3jw 提取码:yea3 复制这段内容后打开百度网盘手机App,操作更方便哦 securecrt 破解版是 ...

  10. 提问(prompt 消息对话框)用于询问一些需要与用户交互的信息。弹出消息对话框(包含一个确定按钮、取消按钮与一个文本输入框)

    提问(prompt 消息对话框) prompt弹出消息对话框,通常用于询问一些需要与用户交互的信息.弹出消息对话框(包含一个确定按钮.取消按钮与一个文本输入框). 语法: prompt(str1, s ...