题面

题解

调了好几个小时啊……话说我考试的时候脑子里到底在想啥……

首先,这个数列肯定是有循环节的,而且循环节的长度\(T\)不会超过\(D\)

那么就可以把数列分成三份,\(L+S+R\),其中\(L,R\)为左右两边剩下的,\(S\)为中间的循环数列。对于\(L\),算出\(pre_i\)表示最后一个数小于等于\(i\)的最长的子序列的长度,对于\(R\)算出\(suf_i\)表示最开始的一个数大于等于\(i\)的最长的子序列的长度。然后用中间出现过的每一个数以及\(pre\)和\(suf\)更新答案就好了

然后中间的部分要怎么计算呢?

通过观察可以发现,设中间的\(LIS\)长度为\(len\),那么这个\(LIS\)最多只有\(L-1\)对两两不一样的。而且如果这个数列是长成\(xu+F+v\)的形式,就是\(x\)个\(u\)加上一串\(F\)加上一个\(v\),那么它也可以变成\(u+F+xv\)的形式,也就是说相等的数字无论与谁相等都是不会影响结果的

那么我们考虑把从\(S\)中选取的\(LIS\)分成三部分\(LL+k\times SS+RR\),其中\(k\times SS\)就是那段相等的部分。又因为每个周期中至少选择一个数,所以\(LL\)和\(RR\)最多包含\(T\)个周期,那么长度不会超过\(T^2\),用和之前算\(L\)和\(R\)一样的方法计算就行了

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define inf 0x3f3f3f3f
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
const int N=1e6+5;
int p,q,t,h,A,B,C,D,l,r,len,v[N],b[N],pos[155],Pre[155],suf[155];ll n,res,k,sz,dp[N];
inline bool in(R int x){return x>=l&&x<=r;}
void qwq(){
for(p=1;!pos[t];t=(A*t*t+B*t+C)%D,++p)v[p]=t,pos[t]=p;
sz=p-pos[t],k=(n-p+1)/sz+1;
fp(fff,1,sz-1)for(R int i=1;i<=sz;++i,t=(A*t*t+B*t+C)%D,++p)v[p]=t;
--p,len=0,b[0]=-inf;
fp(i,1,p){
if(v[i]>=b[len])b[++len]=v[i],cmax(Pre[v[i]],len);
else{
int g=upper_bound(b+1,b+1+len,v[i])-b;
b[g]=v[i],cmax(Pre[v[i]],g);
}
}
p=1,h=t;
fp(fff,1,sz)for(R int i=1;i<=sz;++i,t=(A*t*t+B*t+C)%D,++p)v[p]=-t;
for(R int i=1,j=(n-pos[t]+1)%sz;i<=j;++i,++p,h=(A*h*h+B*h+C)%D)v[p]=-h;
--p,len=0;
reverse(v+1,v+p+1),b[0]=-inf;
fp(i,1,p){
if(v[i]>=b[len])b[++len]=v[i],cmax(suf[-v[i]],len);
else{
int g=upper_bound(b+1,b+1+len,v[i])-b;
b[g]=v[i],cmax(suf[-v[i]],g);
}
}
k-=sz+sz;
fp(i,1,D-1)cmax(Pre[i],Pre[i-1]);
fd(i,D-2,0)cmax(suf[i],suf[i+1]);
h=(A*t*t+B*t+C)%D;
for(;h!=t;h=(A*h*h+B*h+C)%D)cmax(res,k+Pre[h]+suf[h]);
cmax(res,k+Pre[t]+suf[t]);
printf("%lld\n",res);
}
int main(){
// freopen("testdata.in","r",stdin);
freopen("lis.in","r",stdin);
freopen("lis.out","w",stdout);
scanf("%lld%d%d%d%d%d",&n,&t,&A,&B,&C,&D);
if(n<=D*D*2+D+D+D){
b[0]=-inf;
fp(i,1,n){
if(t>=b[len])b[++len]=t,dp[i]=len;
else{
int k=upper_bound(b+1,b+1+len,t)-b;
b[k]=t,dp[i]=k;
}
t=(A*t*t+B*t+C)%D;
}printf("%d\n",len);
}else qwq();
return 0;
}

jzoj4915. 【GDOI2017模拟12.9】最长不下降子序列 (数列)的更多相关文章

  1. NOIP 模拟 $29\; \rm 最长不下降子序列$

    题解 \(by\;zj\varphi\) 观察这个序列,发现模数很小,所以它的循环节很小. 那么可以直接在循环节上做最长上升子序列,但是循环节中的逆序对会对拼接后的答案造成影响. 没有必要找逆序对个数 ...

  2. 10.26最后的模拟DAY2 改造二叉树[中序遍历+严格递增的最长不下降子序列]

    改造二叉树 [题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他 ...

  3. 8.3考试总结(NOIP模拟19)[最长不下降子序列·完全背包问题·最近公共祖先]

    一定要保护自己的梦想,即使牺牲一切. 前言 把人给考没了... 看出来 T1 是一个周期性的东西了,先是打了一个暴力,想着打完 T2 T3 暴力就回来打.. 然后,就看着 T2 上头了,后来发现是看错 ...

  4. [Swust OJ 585]--倒金字塔(LIS最长不下降子序列)

    题目链接:http://acm.swust.edu.cn/problem/585/ Time limit(ms): 3000 Memory limit(kb): 65535   SWUST国的一支科学 ...

  5. [Usaco2008 Feb]Eating Together麻烦的聚餐[最长不下降子序列]

    Description 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的 ...

  6. 【动态规划】【二分】【最长不下降子序列】洛谷 P1020 导弹拦截

    最长不下降子序列的nlogn算法 见 http://www.cnblogs.com/mengxm-lincf/archive/2011/07/12/2104745.html 这题是最长不上升子序列,倒 ...

  7. 【24题】P2766最长不下降子序列问题

    网络流二十四题 网络流是个好东西,希望我也会. 网络流?\(orz\ zsy!!!!!\) P2766 最长不下降子序列问题 考虑我们是如何\(dp\)这个\(LIS\)的. 我们是倒着推,设置\(d ...

  8. 最长不下降子序列 nlogn && 输出序列

    最长不下降子序列实现: 利用序列的单调性. 对于任意一个单调序列,如 1 2 3 4 5(是单增的),若这时向序列尾部增添一个数 x,我们只会在意 x 和 5 的大小,若 x>5,增添成功,反之 ...

  9. [**P2766** 最长不下降子序列问题](https://www.luogu.org/problemnew/show/P2766)

    P2766 最长不下降子序列问题 考虑我们是如何\(dp\)这个\(LIS\)的. 我们是倒着推,设置\(dp(i)\)代表以\(i\)为起点的\(LIS\)是多少.转移太显然了 \[ dp(i)=m ...

  10. 动态规划 ---- 最长不下降子序列(Longest Increasing Sequence, LIS)

    分析: 完整 代码: // 最长不下降子序列 #include <stdio.h> #include <algorithm> using namespace std; ; in ...

随机推荐

  1. mycat sequence

    数据库方式原理在数据库中建立一张表,存放sequence名称(name),sequence当前值(current_value),步长(increment int类型每次读取多少个sequence,假设 ...

  2. iOS利用SDWebImage图片下载缓存

    一.我们先来了解一下SDWebImage的使用: 1.导入框架,引入头文件: #import "UIImageView+WebCache.h" 也可以直接使用CocoaPods来引 ...

  3. Ubuntu14.04LTS上安装Pip

    pip是一个安装和管理Python包的工具.在Pip的帮助下,你可以安装独特版本的包. 最重要的是,Pip可以通过一个“requirements”的工具来管理一个由包组成的列表和版本号. Pip很像e ...

  4. Win7无法访问Windows共享文件夹

    解决方法如下 On the Windows 7 machine: Run secpol.msc Drill down through Local Policies | Security Options ...

  5. Java堆初始大小的建议值

    摘自:<Java Performance>第三章 Initial Heap Space Size Configuration This section describes how to u ...

  6. 10-10C#基础---数据类型之间的转换

    10-10  C#基础数据类型转换(熟练掌握) 第一课 数据类型之间的转换 基本类型的转换:自动转换(隐式转换)和强制转换(显示转换) 装箱转换:允许值类型隐式转换成引用类型. 拆箱转换:允许将引用类 ...

  7. UML设计九种图例

    一.作为一种建模语言,UML的定义包括UML语义和UML表示法两个部分. UML语义:描述基于UML的精确元模型定义. UML表示法:定义UML符号的表示法,为开发者或开发工具使用这些图形符号和文本语 ...

  8. 部署和调优 1.6 vsftp部署和优化-2

    映射个虚拟用户 创建个用户,不让他登录 useradd virftp -s /sbin/nologin 创建存放虚拟用户用户和密码的文件 vim /etc/vsftpd/vsftpd_login 写入 ...

  9. MXF文件结构浅析

    MXF是英文Material eXchange Format(素材交换格式)的缩语.MXF是SMPTE(美国电影与电视工程师学会)组织定义的一种专业音视频媒体文件格式.MXF主要应用于影视行业媒体制作 ...

  10. MySQL中varchar类型排序

    -- +0后就转换INT类型排序 SELECT * FROM T_TEST ORDER BY (SORT + 0) DESC ;