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 ...
随机推荐
- C++ lvalue,prvalue,xvalue,glvalue和rvalue详解(from cppreference)
General 每一个C++表达式(一个操作符和它的操作数,一个字面值,一个变量名等等)都代表着两个独立属性:类型+属性分类.在现代C++中 glvalue(泛左值) = lvalue (传统意义上的 ...
- ext笔记
命名 The top-level namespaces and the actual class names should be CamelCased. Everything else shoul ...
- 解析IPV4报文 和IPV6 报文的 checksum
解析IPV4报文和IPV6报文的checksum的算法: 校验和(checksum)算法,简单的说就是16位累加的反码运算: 计算函数如下: 我们在计算时是主机字节序,计算的结果封装成IP包时是网络字 ...
- 基于IMD的包过滤防火墙原理与实现
一.前言二.IMD中间层技术介绍三.passthru例程分析四.部分演示代码五.驱动编译与安装六. 总结 一.前言 前段时间,在安全焦点上看到了TOo2y朋友写的<基于SPI的数据报过滤原理与实 ...
- Luogu P2664 树上游戏 dfs+树上统计
题目: P2664 树上游戏 分析: 本来是练习点分治的时候看到了这道题.无意中发现题解中有一种方法可以O(N)解决这道题,就去膜拜了一下. 这个方法是,假如对于某一种颜色,将所有这种颜色的点全部删去 ...
- ubuntu 安装 php7.2
sudo apt-get install software-properties-common python-software-properties sudo add-apt-repository p ...
- 【ios】IOS返回3824错误
后台接口数据返回有NULL格式的数据
- A Fast and Easy to Use AES Library
http://www.codeproject.com/Articles/57478/A-Fast-and-Easy-to-Use-AES-Library Introduction EfAesLib i ...
- Python字符串操作详解
菜鸟学Python第五天 流程控制 for循环 while循环 VS for循环: while循环:称之为条件循环,循环的次数取决于条件何时为false for循环:称之为迭代器循环,循环的次数取决于 ...
- cocos2d心得关于精灵帧缓存
在cocos2d中,精灵帧缓存CCSpriteFrameCache是用来存储精灵帧的.它没有特别的属性,只存储了一些用来管理CCSpriteFrame的方法. 以一个例子来说明,一般在又纹理图集的程序 ...