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 ...
随机推荐
- springboot+springcloud config
参考:sorry,全找不到了,当时没记录,最后后知后觉觉得应该记录,所以后面的都有在asfood父项目中的doc文件夹下记录,望见谅. 1. springconfig server 1.1. pom. ...
- struts2获得需要的文件或者访问路径
在struts2中,上传文件的时候遇到一个很好用但是失效的方法,找到如下替代.并且测试了一下request可以得到的相关路径. 得到request对象: HttpServletRequest requ ...
- Python:常用正则表达式(一)
文章转载于:http://www.cnblogs.com/Akeke/(博主:Akeke) https://www.cnblogs.com/Akeke/p/6649589.html (基于JavaSc ...
- Hybrid App混合模式移动应用开发(AngularJS+Cordova+Ionic)
以前公司开发了某手机APP是通过jquerymobile来实现的,发现它对手机上的原生设备无能为力.于是在下一个项目到来之际,通过筛选最终决定使用cordova+Ionic.看起来简单,但是因为他们各 ...
- 基于OpenCV的火焰检测(二)——RGB颜色判据
上文跟大家分享了在做火焰检测中常用到的图像预处理方法,从这一篇博文开始,我将向大家介绍如何一步一步地检测出火焰区域.火焰提取要用 到很多判据,今天我要向大家介绍的是最简单的但是很有效的判据--RGB判 ...
- select *和select 全部
select *和select 全部字段 在查询上效果是一样的,速度也是一样的. 不过理论上来说select *反而会快点. 因为 1.select 全部字段在数据传输上消耗会更多,如果几百个字段这个 ...
- ARRINC424—MORA(GRID)格式
每一整数经.纬度为一格,每格MORA值3位数字,表示百英尺.无法获知MORA值得网格一UNK表示. 经纬网格起始点坐标,每个网格从左下角开始计数,每经纬度一度切分一个网格.每行数据代表某一维度上往东或 ...
- nginx isis
Nginx+IIS简单的部署 随着互联网项目用户访问量不断上升,单点web服务器是无法满足大型高并发高负载的业务处理的,为了给web服务器做负载均衡方案,打算采用Nginx搭建负载均衡服务器,把用 ...
- NSURLConnection基本用法(苹果原生)
一.NSURLConnection的常用类 (1)NSURL:请求地址 (2)NSURLRequest/NSMutableURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSUR ...
- vmstat详细说明
下面是关于Unix下vmstat命令的详细介绍,收录在这里,以备日后参考 vmstat是用来实时查看内存使用情况,反映的情况比用top直观一些.作为一个CPU监视器,vmstat命令比iostat命令 ...