[CSP-S模拟测试]:凤凰院凶真(LCIS)

题目描述

$\alpha$世界线。
凤凰院凶真创立了反抗$SERN$统治的组织“瓦尔基里”。为了脱离$\alpha$线,他需要制作一个世界线变动率测量仪。
测量一个世界线相对于另一个世界线的变动率,实质上就是要求出这两个世界线的最长公共合法事件序列。
一个世界线的事件逻辑序列是一个正整数序列,第$k$个数表示第$k$个事件发生的时间。
对于一个世界线,一个合法的事件序列是事件逻辑序列的一个子序列,满足时间严格递增。
现在,对于两个不同的世间线$\alpha,\beta$,求出最长的一个事件序列,满足这个序列在$\alpha,\beta$世界线中均是合法的。这个序列也就是之前提到过的最长公共合法事件序列。


输入格式

第一行一个整数$n$,表示$\alpha$世界线的事件个数。
第二行$n$个整数$a_1,a_2,...,a_n$,表示$\alpha$世界线的事件逻辑序列。
第三行一个整数$m$,表示$\beta$世界线的事件个数。
第四行$m$个整数$b_1,b_2,...,b_m$,表示$\beta$世界线的事件逻辑序列。


输出格式

第一行一个整数$k$,表示最长公共合法事件序列的长度。
第二行$k$个整数,表示最长公共合法事件序列。如果有多解,输出任意一个。


样例

样例输入:

5
1 4 2 5 1
4
1 1 2 4

样例输出:

2
1 4


数据范围与提示

无论执迷过去
还是叹息未来
皆是不准有丝毫误算的必然
所以本题将捆绑测试。也就是说,只有你通过一个子任务内的所有测试点,才能获得该子任务的全部分数,否则得$0$分。

对于$100\%$的数据,$1\leqslant n,m\leqslant 5,000,1\leqslant a_i,b_i\leqslant 2^{30}$。


题解

发现是一道裸的$LCIS$,只不过我们需要在转移的时候记录一下是从哪里转移过来的就好了。

当然要是你闲的慌的话也可以打个三维偏序……

没什么好说的了……

时间复杂度:$\Theta(n^2)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[5001],b[5001];
int dp[5001][5001];
pair<int,int> pre[5001][5001];
void get(int x,int y)
{
	if(!x)return;
	get(pre[x][y].first,pre[x][y].second);
	printf("%d ",b[y]);
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
		scanf("%d",&b[i]);
	for(int i=1;i<=n;i++)
	{
		int val=0;
		pair<int,int> pv=make_pair(0,0);
		for(int j=1;j<=m;j++)
		{
			if(a[i]==b[j]){dp[i][j]=val+1;pre[i][j]=pv;}
			else{dp[i][j]=dp[i-1][j];pre[i][j]=pre[i-1][j];}
			if(b[j]<a[i])
				if(val<dp[i-1][j])
				{
					pv=make_pair(i-1,j);
					val=dp[i-1][j];
				}
		}
	}
	int now=0;
	for(int i=1;i<=m;i++)if(dp[n][i]>dp[n][now])now=i;
	printf("%d\n",dp[n][now]);
	get(n,now);
	return 0;
}


rp++

原文地址:https://www.cnblogs.com/wzc521/p/11625131.html

时间: 2024-08-29 22:54:44

[CSP-S模拟测试]:凤凰院凶真(LCIS)的相关文章

csps-s模拟测试60嘟嘟噜,天才绅士少女助手克里斯蒂娜,凤凰院凶真题解

题面:https://www.cnblogs.com/Juve/articles/11625190.html 嘟嘟噜: 约瑟夫问题 第一种递归的容易re,但复杂度较有保证 第二种适用与n大于m的情况 第三种O(n)用于n不太大或m大于n时 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define int lon

【CSP模拟赛】凤凰院凶真(最长公共上升子序列)

题目描述 α世界线.凤凰院凶真创立了反抗SERN统治的组织“瓦尔基里”.为了脱离α线,他需要制作一个世界线变动率测量仪. 测量一个世界线相对于另一个世界线的变动率,实质上就是要求出这两个世界线的最长公共合法事件序列. 一个世界线的事件逻辑序列是一个正整数序列,第k个数表示第k个事件发生的时间.对于一个世界线,一个合法的事件序列是事件逻辑序列的一个子序列,满足时间严格递增. 现在,对于两个不同的世间线α,β求出最长的一个事件序列,满足这个序列在α,β世界线中均是合法的.这个序列也就是之前提到过的最

凤凰院凶真 解题报告

凤凰院凶真 Description \(α\) 世界线. 凤凰院凶真创立了反抗 \(SERN\) 统治的组织 "瓦尔基里". 为了脱离 \(α\) 线, 他需要制作一个世界线 变动率测量仪. 测量一个世界线相对于另一个世界线的变动率, 实质上就是要求出这两个世界线的最长公共合 法事件序列. 一个世界线的事件逻辑序列是一个正整数序列, 第 \(k\) 个数表示第 \(k\) 个事件发生的时间. 对于一个世界线, 一个合法的事件序列是事件逻辑序列的一个子序列, 满足时间严格递增. 现在,

10.5「嘟嘟噜」&#183;「天才绅士少女助手克里斯蒂娜」&#183;「凤凰院凶真」

又是一部番???? A. 嘟嘟噜 以为是个神仙题,就只打了个约瑟夫问题,然后QJ了M==2的分, 事实上因为M很小,可以让让轮数跳转,瞎算算就出来了. B. 天才绅士少女助手克里斯蒂娜 考试一开始看错题了,样例过不了异常崩溃........ 1h过去了,我读错题了(一脸震惊) 然后...好像是线段树,但不会维护....... 好像式子能拆开,wc这怎么维护??? after 10min 好像可以维护了... C. 凤凰院凶真 没时间想了,事实上是一个裸的最长公共上升子序列 考虑DP,f[i][j

csp-s模拟测试60

csp-s模拟测试60       2019-10-05 RT. 又颓又垃圾. 状态低迷,题都交不上去. 交了也是爆零,垃圾玩家没有什么可说的,就是垃圾. A. 嘟嘟噜 $mlogn$的毒瘤做法. 贴一个不一样的毒瘤做法. 1 //ans=(ans+m)%i 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 #define re re

[CSP-S模拟测试60]题解

回去要补一下命运石之门了…… A.嘟嘟噜 给定报数次数的约瑟夫,递推式为$ans=(ans+m)\% i$. 考虑优化,中间很多次$+m$后是不用取模的,这种情况就可以把加法变乘法了.问题在于如何找到下一次需要取模的位置. 解不等式$ans+km \ge i+k$即可,需要处理一下边界. 据说可以证明复杂度是$O(m \log n)$的,但我不是很会. //考场代码 稍丑 #include<bits/stdc++.h> using namespace std; typedef long lon

2016年上半年软考真题在线模拟测试,提前知晓你的成绩

2016年上半年软考于5月21日结束了,考试完想知道结果的急切心理,几乎每个经历过上学时代的人都能深刻体验到.如果你想知道你考的怎么样,如果你想要提前知道你的成绩,如果你想知道你哪个地方出错了,如果你想知道你哪个地方知识掌握的不够想要更深入的去理解,那就来希赛软考学院吧!希赛软考学院提供2016年上半年软考真题在线模拟测试,有标准的参考答案,有专业老师的解析视频,让你提前知晓你的成绩,让你再次巩固学习. 希赛授课专家介绍 张友生,计算机应用技术博士,软考培训教程系列丛书主编,考试指定教材<系统分

css Hack,用IE11模拟测试的,条件注释要找真IE去测,模拟的无效

<!DOCTYPE html> <!--[if lt IE 7 ]> <html class="ie6 ie"> <![endif]--> <!--[if IE 7 ]> <html class="ie7 ie"> <![endif]--> <!--[if IE 8 ]> <html class="ie8 ie"> <![endif]

模拟测试(vj)

做这份模拟测试,已经崩溃了,英文看不懂,题意理解错.到结束了只a了第一题,人生陷入了低谷,于是花了一天的时间终于把不会的弄明白了,在这里写一份总结~ T1,简单的模拟,如果打枪打中一支鸟,将这个位置设为0,并向两边扩散,注意这个位置一定要有鸟. 代码~ #include<bits/stdc++.h> using namespace std; int a[30000]; int n,m; int main() { cin>>n; for(int i=1;i<=n;i++) ci