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 ...
随机推荐
- div的作用
<div></div>主要是用来设置涵盖一个区块为主,所谓的区块是包含一行以上的数据,所以在<div></div>的开始之前与结束后,浏览都会自动换行, ...
- linux命令-fdisk分区
fdisk -l 查看分区状况,也可查看指定分区 Disk /dev/sda: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 26 ...
- myeclipse10启动service窗口报异常
1:找到与之对应的tomcat: 2:删掉“.metadata/.plugins/org.eclipse.core.runtime/.settings/ com.genuitec.eclipse.as ...
- js对象简单、深度克隆(复制)
javascript的一切实例都是对象,只是对象之间稍有不同,分为原始类型和合成类型.原始类型对象指的是字符串(String).数值(Number).布尔值(Boolean),合成类型对象指的是数组( ...
- windows xp版本的chrome浏览器去哪里下载呢?
http://www.265.com/chrome-download/?slice 265没记错的话应该是GOOGLE的一个导航网站吧,所以可信度是比较高的.
- java中是如何解决编码问题的,比如char类型的对象是如何存储的呢?
主题句:每个编码形式将字符从字符集转换为编码数据. 说白了一个代码点就是一个Unicode字符.代码单元就是代码点的集合. 字符视图 要了解字符集标准,您必须能区分三种不同的字符视图: 字符集(字符的 ...
- loj10241 取石子游戏1
传送门 分析 我们发现如果在某个人取完之后还剩k+1个石子,则这个人必胜.所以我们可以将n个石子转化为n-k-1个,然后不断递归的转化下去.最后我们可以得到对于n个石子的胜负只与谁先取到n%(k+1) ...
- bzoj2751 容易题
传送门 题目 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值,我 ...
- Luogu 3942 将军令
之前写那个(Luogu 2279) [HNOI2003]消防局的设立的时候暴力推了一个树形dp,然后就导致这个题不太会写. 贪心,先把树建出来,然后考虑按照结点深度排个序,每次取出还没有被覆盖掉的深度 ...
- java反射中,Class.forName和classloader的区别
http://blog.csdn.net/qq_27093465/article/details/52262340