【JZOJ4665】数列
description
analysis
水法又\(n\)方二十万……
可以先离散化,然后枚举起点,枚举向下扫
同一个数出现过或模数不相同就\(break\),注意\(k\)不够顶替还是有可能存在解不要退循环
每次一个\(memset\)会\(T\),可以像队列一样维护标记数组,尾进头出,注意和上次答案的重叠部分
正解是单调栈套线段树,但……口胡一下好了
用两个单调栈分别维护最大值最小值的位置,然后线段树上二分,直接用单调栈判断
时间做到\(O(n\log_2n)\) 没时间打所以鸽了
code
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 200005
#define fo(i,a,b) for (int i=a;i<=b;++i)
#define fd(i,a,b) for (int i=a;i>=b;--i)
using namespace std;
bool bz[MAXN];
int n,k,d,tot,mxx,pos,last;
struct node
{
int x,y,id;
}a[MAXN];
inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
inline bool cmp1(node a,node b){return a.x<b.x;}
inline bool cmp2(node a,node b){return a.id<b.id;}
int main()
{
freopen("T3.in","r",stdin);
n=read(),k=read(),d=read();
fo(i,1,n)a[i].x=read(),a[i].id=i;
sort(a+1,a+n+1,cmp1);
int i=1;while (i<=n)
{
a[i].y=++tot;
int j=i;while (j<n && a[j+1].x==a[i].x)a[++j].y=tot;
i=j+1;
}
sort(a+1,a+n+1,cmp2);
mxx=pos=1;
fo(i,1,n-mxx)
{
bz[a[i].y]=1;
int tmp=i,mx=a[i].x,mn=a[i].x;
fo(j,i+1,n)
{
if ((bz[a[j].y] && j>last) || (a[j].x%d)!=(a[i].x%d))
{
last=j-1;break;
}
bz[a[j].y]=1;
mx=max(mx,a[j].x),mn=min(mn,a[j].x);
if ((mx-mn)/d<=j-i+k)tmp=j;
}
if (tmp-i+1>mxx)pos=i,mxx=tmp-i+1;
bz[a[i].y]=0;
}
printf("%d %d\n",pos,pos+mxx-1);
return 0;
}
【JZOJ4665】数列的更多相关文章
- [JZOJ4665] 【GDOI2017模拟7.21】数列
题目 题目大意 给你一个数列,让你找到一个最长的连续子序列,满足在添加了至多KKK个数之后,能够变成一条公差为DDD的等差数列. 思考历程 一眼看上去似乎是一道神题-- 没有怎么花时间思考,毕竟时间都 ...
- C#求斐波那契数列第30项的值(递归和非递归)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- BZOJ1500[NOI2005]维修数列
Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...
- PAT 1049. 数列的片段和(20)
给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1 ...
- 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...
- fibonacci数列(五种)
自己没动脑子,大部分内容转自:http://www.jb51.net/article/37286.htm 斐波拉契数列,看起来好像谁都会写,不过它写的方式却有好多种,不管用不用的上,先留下来再说. 1 ...
- js中的斐波那契数列法
//斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...
- 洛谷 P1182 数列分段Section II Label:贪心
题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...
- 剑指Offer面试题:8.斐波那契数列
一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...
随机推荐
- pytest-mark跳过
import pytestimport sysenvironment='android' @pytest.mark.skipif(environment=="android",re ...
- 记一次vue 普通异步请求微信二进制二维码 乱码 问题解决然后渲染
后端压力大,前端分忧. /*用微信小程序token拿二维码*/ async fetchMINIQRcode({commit,state},params){ var instance = axios.c ...
- Mysql 查询视图出现The user specified as a definer ('root'@'%') does not exist的问题
今天服务器Mysql版本在5.7升级到8.0+之后,部分网站(老的)访问视图出现The user specified as a definer ('root'@'%') does not exist问 ...
- linux磁盘分区、挂载、查看
实战: 34 查看本机所有磁盘 fdisk -l 35 查看磁盘挂载情况 lsblk -f 36 39: ...
- pip3 常用操作
清华大学pip镜像 https://mirrors.tuna.tsinghua.edu.cn/help/pypi/ # 设置为默认 pip install pip -U pip config set ...
- CF 848E(动态规划+分治NTT)
传送门: http://codeforces.com/problemset/problem/848/E 题解: 假设0-n一定有一条边,我们得到了一个方案,那么显然是可以旋转得到其他方案的. 记最大的 ...
- php面向对象深入理解(一)
面向对象(Object Oriented Programming,OOP)的基础知识: 第一个例子: 类Test.class.php <?php class Test{ public $a= ...
- Android中的APK,TASK,PROCESS,USERID之间的关系
开发Android已经有一段时间了,今天接触到底层的东西,所以对于进程,用户的id以及Android中的Task,Apk之间的关系,要做一个研究,下面就是研究结果: apk一般占一个dalvik,一个 ...
- Optimal Marks SPOJ - OPTM
传送门 一个无向图,每个点有点权,某些点点权确定了,某些点由你来确定,边权为两个点的异或和,要使边权和最小. 这不是一道按位做最小割的大水题么 非常开心地打了,还非常开心地以为有spj,然后非常开心地 ...
- NX二次开发-UFUN创建圆柱UF_MODL_create_cyl1
NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_obj.h> #include <u ...