NOIP 模拟 $29\; \rm 最长不下降子序列$
题解 \(by\;zj\varphi\)
观察这个序列,发现模数很小,所以它的循环节很小。
那么可以直接在循环节上做最长上升子序列,但是循环节中的逆序对会对拼接后的答案造成影响。
没有必要找逆序对个数,直接将循环节大小个拼接在一起即可。
Code
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?(-1):*p1++
struct nanfeng_stream{
template<typename T>inline nanfeng_stream &operator>>(T &x) {
ri f(1);x=0;register char ch(gc());
while(!isdigit(ch)) {if (ch=='-') f=0;ch=gc();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
return x=f?x:-x,*this;
}
}cin;
}
using IO::cin;
namespace nanfeng{
#define FI FILE *IN
#define FO FILE *OUT
template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
typedef long long ll;
static const int N=1e5+7;
int num[N*10],vis[N],dp[N*10],dpt[N],dpf[N],nm[N],suf[N],bg,lea,sl,len,cnt,t0,a,b,c,d;
ll n;
struct BIT{
#define lowbit(x) ((x)&-(x))
int c[N];
inline void init() {memset(c,0,sizeof(int)*300);}
inline void update(int x,int k) {for (ri i(x);i<=d;i+=lowbit(x)) c[i]=cmax(c[i],k);}
inline int query(int x) {
int res(0);
for (ri i(x);i;i-=lowbit(i)) res=cmax(res,c[i]);
return res;
}
}B;
inline int main() {
//FI=freopen("nanfeng.in","r",stdin);
//FO=freopen("nanfeng.out","w",stdout);
cin >> n >> t0 >> a >> b >> c >> d;
vis[num[p(cnt)]=t0]=1;
while(1) {
p(cnt);
num[cnt]=(a*num[cnt-1]*num[cnt-1]+b*num[cnt-1]+c)%d;
if (vis[num[cnt]]) {len=cnt-vis[num[cnt]];break;}
vis[num[cnt]]=cnt;
}
bg=vis[num[cnt]]-1;
if (n<=(int)1e6) {
ri ans(0);
for (ri i(cnt+1);i<=n;p(i)) num[i]=(a*num[i-1]*num[i-1]+b*num[i-1]+c)%d;
for (ri i(1);i<=n;p(i)) {
dp[i]=B.query(num[i]+1)+1;
B.update(num[i]+1,dp[i]);
ans=cmax(ans,dp[i]);
}
printf("%d\n",ans);
} else {
for (ri i(1);i<=len;p(i)) nm[i]=num[bg+i];
for (ri i(2);i<=len;p(i))
for (ri j(1);j<=len;p(j)) nm[(i-1)*len+j]=nm[j];
ll aln=(n-bg)/len-len,ans(0);
sl=(int)(n-(aln+len)*len-bg);
for (ri i(1);i<=sl;p(i)) suf[i]=nm[i];
for (ri i(1);i<=bg;p(i)) {
dpf[i]=B.query(num[i]+1)+1;
B.update(num[i]+1,dpf[i]);
}
lea=len*len;
for (ri i(0);i<=bg;p(i)) {
B.init();
ri res(0),mn(INT_MAX);
B.update(num[i]+1,dpf[i]);
ans=cmax(ans,(ll)dpf[i]);
for (ri j(1);j<=lea;p(j)) {
if (nm[j]<num[i]) continue;
dp[j]=B.query(nm[j]+1)+1;
B.update(nm[j]+1,dp[j]);
res=cmax(res,dp[j]);
}
for (ri j(lea-len+1);j<=lea;p(j))
if (dp[j]==res) mn=cmin(mn,nm[j]);
B.init();
if (res) ans=cmax(ans,aln+res),B.update(mn+1,res);
else mn=num[i];
for (ri j(1);j<=sl;p(j)) {
if (suf[j]<mn) continue;
dpt[j]=B.query(suf[j]+1)+1;
B.update(suf[j]+1,dpt[j]);
ans=cmax(ans,aln+dpt[j]);
}
}
printf("%lld\n",ans);
}
return 0;
}
}
int main() {return nanfeng::main();}
NOIP 模拟 $29\; \rm 最长不下降子序列$的更多相关文章
- 【tyvj】P1049 最长不下降子序列
时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数 第二行n个数 输出格式 最长不下降子序列的长度 测 ...
- SPOJ 4053 - Card Sorting 最长不下降子序列
我们的男主现在手中有n*c张牌,其中有c(<=4)种颜色,每种颜色有n(<=100)张,现在他要排序,首先把相同的颜色的牌放在一起,颜色相同的按照序号从小到大排序.现在他想要让牌的移动次数 ...
- [TYVJ] P1049 最长不下降子序列
最长不下降子序列 描述 Description 求最长不下降子序列的长度 输入格式 InputFormat 第一行为n,表示n个数第二行n个数 输出格式 OutputFormat 最长不下降子 ...
- [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批就餐的奶牛占据,中间的 ...
- 10.26最后的模拟DAY2 改造二叉树[中序遍历+严格递增的最长不下降子序列]
改造二叉树 [题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他 ...
- 网络流 之 P2766 最长不下降子序列问题
题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...
- 【题解】Luogu P2766 最长不下降子序列问题
原题传送门 实际还是比较套路的建图 先暴力dp一下反正数据很小 第一小问的答案即珂以求出数列的最长不下降子序列的长度s 考虑第二问如何做: 将每个点拆点 从前向后连一条流量为1的边 如果以它为终点的最 ...
- P2766 最长不下降子序列问题
题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...
随机推荐
- Redhat 6.9 升级SSH到OpenSSH_8.6p1完整文档
这个文章是转载,原文连接在这个:https://www.cnblogs.com/xshrim/p/6472679.html 这个问题遇到过,下面可以解决 ----------------------- ...
- MySQL | 使用Xtrabackup进行备份和备份恢复
备份 进行备份前需要先创建备份用户,直接使用 root 用户进行备份也行,但是这样不太规范. create user backup@'localhost' identified by '123456' ...
- MIT6.828 Lab4 Preemptive Multitasking(下)
Lab4 Preemptive Multitasking(下) lab4的第二部分要求我们实现fork的cow.在整个lab的第一部分我们实现了对多cpu的支持和再多系统环境中的切换,但是最后分析的时 ...
- Python获取list中指定元素的索引
在平时开发过程中,经常遇到需要在数据中获取特定的元素的信息,如到达目的地最近的车站,橱窗里面最贵的物品等等.怎么办?看下面 方法一: 利用数组自身的特性 list.index(target), 其中a ...
- Java基础00-循环语句7
1. for循环语句 1.1 循环结构 1.2 for循环语句的格式 执行流程图: 1.3 案例 (1)输出数据 (2)求和 (3)求偶数和 (4)水仙花 public static void mai ...
- P4494 [HAOI2018]反色游戏
P4494 [HAOI2018]反色游戏 题意 给你一个无向图,图上每个点是黑色或者白色.你可以将一条边的两个端点颜色取反.问你有多少种方法每个边至多取反一次使得图上全变成白色的点. 思路 若任意一个 ...
- TCP协议与HTTP协议区别
一.TCP协议与HTTP协议区别 1.直观认识 TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页 ...
- SAML 2.0 实例分析 idp向sp发送响应(4)
当idp与user建立起联系后,idp向sp发送响应 <samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol ...
- python里面的MD5加密 ---# hashlib包的使用
在应用程序的接口里,常用到签名:其中签名里用到MD5加密,这里用hashlib实现 hashlib 概念:Hash,译做"散列",也有直接音译为"哈希"的.把任 ...
- tomcat与springmvc 结合 之---第19篇(下,补充) springmvc 加载.xml文件的bean标签的过程
writedby 张艳涛,上一篇写了springmvc对<mvc:annoXXXX/>标签的解析过程,其实是遗漏重要的细节,因为理解的不深入吧 今天接着解析<bean>标签 & ...