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)如果允许在取出的序列中多次 ...
随机推荐
- angular小记
declarations:包装组件或指令等 providers:依赖注入 imports:导入其他模块 bootstrap:设置根组件 exports:导出组件或指令等 app.component.t ...
- QT从入门到入土(二)——对象模型(对象树)和窗口坐标体系
摘要 我们使用的标准 C++,其设计的对象模型虽然已经提供了非常高效的 RTTI 支持,但是在某些方面还是不够灵活.比如在 GUI 编程方面,既需要高效的运行效率也需要强大的灵活性,诸如删除某窗口时可 ...
- ECMAScript6.0
ECMAScript6.0相当于JavaScript的标准,它规定了浏览器脚本语言的标准,发布于2015年,目标是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言 N ...
- ACM金牌选手算法讲解《线性表》
哈喽,大家好,我是编程熊,双非逆袭选手,字节跳动.旷视科技前员工,ACM亚洲区域赛金牌,保研985研究生,分享算法与数据结构.计算机学习经验,帮助大家进大厂~ 公众号:『编程熊』 文章首发于: ACM ...
- iPhone X适配方案
iPhone X适配方案 https://github.com/Wscats/iPhone-X 绝对长度单位 英寸 厘米 毫米 磅 pc inch cm mm pt pica 相对长度单位 是网页设计 ...
- File类与常用IO流第二章过滤器
在第一章中,有一个练习使用递归搜索文件 1 public static void main(String[] args) { 2 File f=new File("E:\\aaa" ...
- python + mysql 实现输入数据
实例如下: import datetimeimport pymysqldef insert_into(): db = pymysql.connect("localhost",&qu ...
- Linux 安装 Nodejs 的两种方式
Linux 安装 Nodejs 的两种方式 目录 Linux 安装 Nodejs 的两种方式 一.压缩包安装 Nodejs 二.源码编译安装 Nodejs 一.压缩包安装 Nodejs 下载 Node ...
- debug:am、cmd命令源码分析
debug:am.cmd命令源码分析 目录 debug:am.cmd命令源码分析 am命令的实现 手机里的am am.jar cmd命令的实现 手机里的cmd cmd activity cmd.cpp ...
- 第1天 Mark Down 学习及DOS命令
Markdown学习 标题 "#加空格"几个#就表示几级标题 字体 helloworld!一两个两个*号 helloworld!一边一个*号 helloworld! 一边三个号 h ...