jzoj4915. 【GDOI2017模拟12.9】最长不下降子序列 (数列)
题面
题解
调了好几个小时啊……话说我考试的时候脑子里到底在想啥……
首先,这个数列肯定是有循环节的,而且循环节的长度\(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】最长不下降子序列 (数列)的更多相关文章
- NOIP 模拟 $29\; \rm 最长不下降子序列$
题解 \(by\;zj\varphi\) 观察这个序列,发现模数很小,所以它的循环节很小. 那么可以直接在循环节上做最长上升子序列,但是循环节中的逆序对会对拼接后的答案造成影响. 没有必要找逆序对个数 ...
- 10.26最后的模拟DAY2 改造二叉树[中序遍历+严格递增的最长不下降子序列]
改造二叉树 [题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他 ...
- 8.3考试总结(NOIP模拟19)[最长不下降子序列·完全背包问题·最近公共祖先]
一定要保护自己的梦想,即使牺牲一切. 前言 把人给考没了... 看出来 T1 是一个周期性的东西了,先是打了一个暴力,想着打完 T2 T3 暴力就回来打.. 然后,就看着 T2 上头了,后来发现是看错 ...
- [Swust OJ 585]--倒金字塔(LIS最长不下降子序列)
题目链接:http://acm.swust.edu.cn/problem/585/ Time limit(ms): 3000 Memory limit(kb): 65535 SWUST国的一支科学 ...
- [Usaco2008 Feb]Eating Together麻烦的聚餐[最长不下降子序列]
Description 为了避免餐厅过分拥挤,FJ要求奶牛们分3批就餐.每天晚饭前,奶牛们都会在餐厅前排队入内,按FJ的设想所有第3批就餐的奶牛排在队尾,队伍的前端由设定为第1批就餐的奶牛占据,中间的 ...
- 【动态规划】【二分】【最长不下降子序列】洛谷 P1020 导弹拦截
最长不下降子序列的nlogn算法 见 http://www.cnblogs.com/mengxm-lincf/archive/2011/07/12/2104745.html 这题是最长不上升子序列,倒 ...
- 【24题】P2766最长不下降子序列问题
网络流二十四题 网络流是个好东西,希望我也会. 网络流?\(orz\ zsy!!!!!\) P2766 最长不下降子序列问题 考虑我们是如何\(dp\)这个\(LIS\)的. 我们是倒着推,设置\(d ...
- 最长不下降子序列 nlogn && 输出序列
最长不下降子序列实现: 利用序列的单调性. 对于任意一个单调序列,如 1 2 3 4 5(是单增的),若这时向序列尾部增添一个数 x,我们只会在意 x 和 5 的大小,若 x>5,增添成功,反之 ...
- [**P2766** 最长不下降子序列问题](https://www.luogu.org/problemnew/show/P2766)
P2766 最长不下降子序列问题 考虑我们是如何\(dp\)这个\(LIS\)的. 我们是倒着推,设置\(dp(i)\)代表以\(i\)为起点的\(LIS\)是多少.转移太显然了 \[ dp(i)=m ...
- 动态规划 ---- 最长不下降子序列(Longest Increasing Sequence, LIS)
分析: 完整 代码: // 最长不下降子序列 #include <stdio.h> #include <algorithm> using namespace std; ; in ...
随机推荐
- Java基础--HashCode
如果一个类的对象要用做hashMap的key,那么一定要注意覆盖该类的equals和hashCode方法. equals()是基类Object的方法,用于判断对象是否有相同地址及是否为同一对象 pub ...
- LINUX必须记住的指令
写在前面: 1,<你一定要知道的关于Linux文件目录操作的12个常用命令>是楼主收集的关于Linux文件目录操作最常用的命令,包括文件或目录的新建.拷贝.移动.删除.查看等,是开发人员操 ...
- 2018年长沙理工大学第十三届程序设计竞赛 Dzzq的离散数学教室1
Dzzq的离散数学教室1 链接:https://www.nowcoder.com/acm/contest/96/D来源:牛客网 zzq的离散数学教室1 时间限制:C/C++ 1秒,其他语言2秒 空间限 ...
- win10/server2019 系统安装 详解
https://www.microsoft.com/zh-cn/software-download/windows10 https://go.microsoft.com/fwlink/?LinkId= ...
- iphone配置实用工具iPhone Configuration Utility
下载地址 http://support.apple.com/kb/DL1466 安装完毕后,在设备->控制台,可以很方便看到报错信息
- 开发环境入门 linux基础(部分)虚拟内存,rpm和yum安装
虚拟内存,rpm和yum安装 文本中查找 /内容 替换:扩展模式下(:)%s /替换目标/要替换的文件/ (只替换第一个)(后边加g全部替换) :set u添加行号 raid lvm逻辑卷 df - ...
- Datapump tips
同时导出多个schema下的表 $ expdp system/manager dumpfile=test.dmp logfile=test.log directory=TESTDIR schemas= ...
- 冷扑大师AI简史:你用德扑来游戏,人家用来发Science
前言 人类又输了...... 创新工场组织的一场“人工智能和顶尖牌手巅峰表演赛中”,机器人AI冷扑大师赢了人类代表队龙之队 792327 记分牌,最后 200 万奖励归机器人所有. 在围棋项目上人类的 ...
- 12-01Js表单验证和JsWindow
一.表单验证form 1.创建一个新的表单: <form id="id是唯一的,不可重复" name=“可重复”,method="post/get",ac ...
- 1.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:
转自:https://www.cnblogs.com/ssslinppp/p/4528892.html [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://w ...