题面

题解

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

首先,这个数列肯定是有循环节的,而且循环节的长度\(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\)一样的方法计算就行了

  1. //minamoto
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define ll long long
  5. #define inf 0x3f3f3f3f
  6. #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
  7. #define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
  8. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  9. template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
  10. using namespace std;
  11. const int N=1e6+5;
  12. 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];
  13. inline bool in(R int x){return x>=l&&x<=r;}
  14. void qwq(){
  15. for(p=1;!pos[t];t=(A*t*t+B*t+C)%D,++p)v[p]=t,pos[t]=p;
  16. sz=p-pos[t],k=(n-p+1)/sz+1;
  17. 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;
  18. --p,len=0,b[0]=-inf;
  19. fp(i,1,p){
  20. if(v[i]>=b[len])b[++len]=v[i],cmax(Pre[v[i]],len);
  21. else{
  22. int g=upper_bound(b+1,b+1+len,v[i])-b;
  23. b[g]=v[i],cmax(Pre[v[i]],g);
  24. }
  25. }
  26. p=1,h=t;
  27. fp(fff,1,sz)for(R int i=1;i<=sz;++i,t=(A*t*t+B*t+C)%D,++p)v[p]=-t;
  28. 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;
  29. --p,len=0;
  30. reverse(v+1,v+p+1),b[0]=-inf;
  31. fp(i,1,p){
  32. if(v[i]>=b[len])b[++len]=v[i],cmax(suf[-v[i]],len);
  33. else{
  34. int g=upper_bound(b+1,b+1+len,v[i])-b;
  35. b[g]=v[i],cmax(suf[-v[i]],g);
  36. }
  37. }
  38. k-=sz+sz;
  39. fp(i,1,D-1)cmax(Pre[i],Pre[i-1]);
  40. fd(i,D-2,0)cmax(suf[i],suf[i+1]);
  41. h=(A*t*t+B*t+C)%D;
  42. for(;h!=t;h=(A*h*h+B*h+C)%D)cmax(res,k+Pre[h]+suf[h]);
  43. cmax(res,k+Pre[t]+suf[t]);
  44. printf("%lld\n",res);
  45. }
  46. int main(){
  47. // freopen("testdata.in","r",stdin);
  48. freopen("lis.in","r",stdin);
  49. freopen("lis.out","w",stdout);
  50. scanf("%lld%d%d%d%d%d",&n,&t,&A,&B,&C,&D);
  51. if(n<=D*D*2+D+D+D){
  52. b[0]=-inf;
  53. fp(i,1,n){
  54. if(t>=b[len])b[++len]=t,dp[i]=len;
  55. else{
  56. int k=upper_bound(b+1,b+1+len,t)-b;
  57. b[k]=t,dp[i]=k;
  58. }
  59. t=(A*t*t+B*t+C)%D;
  60. }printf("%d\n",len);
  61. }else qwq();
  62. return 0;
  63. }

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. Java基础--HashCode

    如果一个类的对象要用做hashMap的key,那么一定要注意覆盖该类的equals和hashCode方法. equals()是基类Object的方法,用于判断对象是否有相同地址及是否为同一对象 pub ...

  2. LINUX必须记住的指令

    写在前面: 1,<你一定要知道的关于Linux文件目录操作的12个常用命令>是楼主收集的关于Linux文件目录操作最常用的命令,包括文件或目录的新建.拷贝.移动.删除.查看等,是开发人员操 ...

  3. 2018年长沙理工大学第十三届程序设计竞赛 Dzzq的离散数学教室1

    Dzzq的离散数学教室1 链接:https://www.nowcoder.com/acm/contest/96/D来源:牛客网 zzq的离散数学教室1 时间限制:C/C++ 1秒,其他语言2秒 空间限 ...

  4. win10/server2019 系统安装 详解

    https://www.microsoft.com/zh-cn/software-download/windows10 https://go.microsoft.com/fwlink/?LinkId= ...

  5. iphone配置实用工具iPhone Configuration Utility

    下载地址 http://support.apple.com/kb/DL1466 安装完毕后,在设备->控制台,可以很方便看到报错信息

  6. 开发环境入门 linux基础(部分)虚拟内存,rpm和yum安装

    虚拟内存,rpm和yum安装 文本中查找 /内容 替换:扩展模式下(:)%s /替换目标/要替换的文件/ (只替换第一个)(后边加g全部替换) :set u添加行号 raid  lvm逻辑卷 df - ...

  7. Datapump tips

    同时导出多个schema下的表 $ expdp system/manager dumpfile=test.dmp logfile=test.log directory=TESTDIR schemas= ...

  8. 冷扑大师AI简史:你用德扑来游戏,人家用来发Science

    前言 人类又输了...... 创新工场组织的一场“人工智能和顶尖牌手巅峰表演赛中”,机器人AI冷扑大师赢了人类代表队龙之队 792327 记分牌,最后 200 万奖励归机器人所有. 在围棋项目上人类的 ...

  9. 12-01Js表单验证和JsWindow

    一.表单验证form 1.创建一个新的表单: <form id="id是唯一的,不可重复" name=“可重复”,method="post/get",ac ...

  10. 1.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:

    转自:https://www.cnblogs.com/ssslinppp/p/4528892.html [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://w ...