codechef Chef and Problems
终于补出这道:一直耽搁到现在
找到一个代码可读性很好的分块temp;
题意:给一个长度为n 的数组 A,Q次询问,区间相等数的最大范围是多少?
数据范围都是10e5;
当然知道分块了;
传统分块看各种累;
找了一份很好的tmp<新技能get;
#include<bits/stdc++.h> using namespace std;
const int N =;
const int S =; int a[N],res[S][N],occ[N];
int ans[N];
//一种很神奇的分块写法
//想办法 在其他题目扩展 struct query
{
int L,R,id;
bool operator <(const query& a)const
{
return R<a.R;
}
}q[N]; int main()
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
int s=sqrt(n);
for (int i=;i<n;i++) scanf("%d",&a[i]); for (int i=;i*s<n;i++)//预处理0-->sqrt(n)个块,每块的宽度这里并不一定相同
{ //这里是从i*s-->n 都计算出区间的最大值
for (int j=;j<=m;j++) occ[j]=-;
int now=;
for (int j=i*s;j<n;j++)
{
if (occ[a[j]]==-) occ[a[j]]=j;
else now=max(now,j-occ[a[j]]);
res[i][j]=now;
}
} for (int i=;i<k;i++)
scanf("%d%d",&q[i].L,&q[i].R),q[i].id=i,q[i].L--,q[i].R--;
sort(q,q+k);//按询问R排序 for (int i=;i<=m;i++)
occ[i]=-; int r=; for (int i=;i<k;i++)
{
while (r<q[i].R)//q[i].L<q[i].R;
{
++r;
occ[a[r]]=r;//预处理出前几个
} int tmp=res[q[i].L/s+][q[i].R];//计算已经可以分块的数据
for (int j=q[i].L;j<(q[i].L/s+)*s&&j<=q[i].R;j++)
tmp=max(tmp,occ[a[j]]-j);//利用询问的单调询问开始不足一块的数据
ans[q[i].id]=tmp;
} for (int i=;i<k;i++) printf("%d\n",ans[i]);
return ;
}
codechef Chef and Problems的更多相关文章
- CodeChef:Chef and Problems(分块)
CodeChef:Chef and Problems 题目大意 有一个长度为n的序列$a_1,a_2,……,a_n$,每次给出一个区间[l,r],求在区间内两个相等的数的最远距离($max(j-i,满 ...
- Chef and Problems(from Code-Chef FNCS) ( 回 滚 )
题目: 题意:给定序列,求[l,r]区间内数字相同的数的最远距离. 链接:https://www.codechef.com/problems/QCHEF #include<bits/stdc++ ...
- CODECHEF Chef and Churus 解题报告
[CODECHEF]Chef and Churus Description 有一个长度为\(n\)的数组\(A\),有\(n\)个函数,第\(i\)个函数的值为\(\sum_{j=l_i}^{r_i} ...
- 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 ...
- Codechef Chef and Triangles(离散化+区间并集)
题目链接 Chef and Triangles 先排序,然后得到$m - 1$个区间: $(a[2] - a[1], a[2] + a[1])$ $(a[3] - a[2], a[3] + a[2]) ...
- CodeChef Chef and Churu [分块]
题意: 单点修改$a$ 询问$a$的区间和$f$的区间和 原来普通计算机是这道题改编的吧... 对$f$分块,预处理$c[i][j]$为块i中$a_j$出现几次,$O(NH(N))$,只要每个块差分加 ...
- codechef Chef And Easy Xor Queries
做法:我们考虑前缀异或和,修改操作就变成了区间[i,n]都异或x 查询操作就变成了:区间[1,x]中有几个k 显然的分块,每个块打一个tag标记表示这个块中所有的元素都异或了tag[x] 然后处理出这 ...
- 2019.02.14 codechef Chef at the Food Fair(线段树+泰勒展开)
传送门 题意:现在有nnn个位置,每个位置上有一个值aia_iai. 要求支持如下两种操作: 区间乘vvv 求区间的(1−ai)(1-a_i)(1−ai)之积 思路: 考虑转换式子: Ans=∏i ...
- 【A* 网络流】codechef Chef and Cut
高嘉煊讲的杂题:A*和网络流的练手题 题目大意 https://s3.amazonaws.com/codechef_shared/download/translated/SEPT16/mandarin ...
随机推荐
- TCP/IP各种数据包结构体
下面这些TCP/IP数据包是我在进行Socket及Wipcap网络编程过程中曾经用到过的数据包结构体, 这些东西平时看起来不起眼,真正用到的时候就会觉得非常有用...... 以太帧头格式结构体,共14 ...
- ios坐标系统
在写程序的时候发现,iOS下的坐标.位置很容易弄乱,特别是在不同的坐标系统中,必须完成弄明白一些概念才能做相应的变化,例如CoreImage和UIView的坐标系统就截然不同,一个是以屏幕的左上角为原 ...
- 欧拉函数φ(x)简要介绍及c++实现
我还是很喜欢数论,从此吃喝不问,就此沉沦. 欧拉函数φ(x)的值为在[1,x)的区间内与x互质的数的个数 通式: 其中p1, p2……pn为x的所有质因数,x是不为0的整数.φ(1)=1. 注意 ...
- MySql的基操勿六
2018/12/6 星期四 19:34:07 authot by dabaine 数据库注释; -- 这就是注释 /*.....*/ 这也是注释 创建库; create databse [if not ...
- Linux 永久修改主机名hostname
前言: 由于最近用3台机器,经常切换导致有容易区别的需求. 故想修改主机名. 实验环境:Ubuntu 17 教程: 1. 使用hostname 命令先临时修改 sudo hostname your_n ...
- vs实用插件
Live Share 强烈推荐的一款插件,能在VS程序中打开文件并且显示他的效果.非常非常实用!,具体功能介绍在你搜索该插件时候有说明,非常非常好用的一款插件! 后续插件推荐转载参考与其他博主 1.C ...
- python基础知识13-迭代器与生成器,导入模块
异常处理作业讲解 file = open('/home/pyvip/aaa.txt','w+') try: my_dict = {'name':'adb'} file.write(my_dict['a ...
- PAT Basic 1013
1013 数素数 令P~i~表示第i个素数.现任给两个正整数M <= N <= 10^4^,请输出P~M~到P~N~的所有素数. 输入格式: 输入在一行中给出M和N,其间以空格分隔. 输出 ...
- myeclipse 改变模版
一.修改Servlet的默认模板代码 使用MyEclipse创建Servlet时,根据默认的Servlet模板生成的Servlet代码如下: 1 package gacl.servlet.study; ...
- 【01】git下载和安装的完整过程
[03]下载地址: 有许多种安装方式,主要分为两种,一种是通过编译源代码来安装:另一种是使用为特定平台预编译好的安装包. Git 各平台安装包下载地址为:http://git-scm.com/down ...