首页 > 其他分享 >P9572 Colorful Days♪ 题解

P9572 Colorful Days♪ 题解

时间:2023-08-19 20:04:14浏览次数:45  
标签:P9572 int 题解 wei Days 最长 序列 now s1

原题链接

题目大意:

有两个数组 \(S\), \(T\),你可以把 \(S\) 进行复制并接到其后面形成 \(S^k\),如 \(S\)=123,则 \(S^2\)=123123, \(S^3\)=123123123
让你求出 \(S^k\) 与 \(T\) 的最长公共子序列以及在最长公共子序列最长时\(k\)的最小值。
首先思考如果无视 \(k\) 最小的要求,最长公共子序列应该是多少。
设 \(T_i\) 表示 \(T\) 的第 \(i\) 个元素, 对于每个 \(T_i\),如果 \(S\) 中存在 \(T_i\),则将其放入子序列中一定更优,如果 \(S\) 中不存在 \(T_i\),则 \(T_i\) 一定不会在公共子序列中。
所以对于 \(S\) 和 \(T\) 都只保留共有元素,则剩下的 \(T\) 中每一个元素都应该在最长上升子序列中。
于是可以得出最长上升子序列,只需将其放入 \(S^k\) 即可。
求 \(k\) 的话可以对于每个元素,储存下它在 \(S\) 中每次出现的位置接着遍历 \(T\) 数组,用 \(now\) 表示上一个数字在 \(S\) 填的位置,于是只需找到这个元素最前面能填下的位置即可。
如果这个元素不管怎么填都在 \(now\) 后面,则向后面额外添加一个 \(S\),并将其放在最先能放下的地方。
查找可以放下的位置可以二分查找,总复杂度 \(O(nlogn+m)\)。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
int s1[N];
int a[N],b[N];
int c[N],d[N];
int top1,top2;
int n,m,c1,c2;
vector<int> wei[N];
signed main()
{
	cin>>n>>m>>c1>>c2;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		s1[a[i]]=1;
	}
	for(int i=1;i<=m;i++)
	{
		cin>>b[i];
		if(s1[b[i]])
		s1[b[i]]=2;
	}
	for(int i=1;i<=n;i++)
	{
		if(s1[a[i]]==2)
		{
			wei[a[i]].push_back(i);
		}
	}
	for(int i=1;i<=m;i++)
	{
		if(s1[b[i]]==2)
		d[++top2]=b[i];
	}
	int now=0,ans=1;
	for(int i=1;i<=top2;i++)
	{
		int nt=lower_bound(wei[d[i]].begin(),wei[d[i]].end(),now+1)-wei[d[i]].begin();
		if(now>=wei[d[i]][wei[d[i]].size()-1])
		{
			ans++;
			now=wei[d[i]][0];
		}
		else
		{
			now=wei[d[i]][nt];
		}
	}
	cout<<c1*top2<<' '<<c2*ans;
	return 0;
}

标签:P9572,int,题解,wei,Days,最长,序列,now,s1
From: https://www.cnblogs.com/tx-Elysia/p/17642955.html

相关文章

  • P4197 Peaks 题解
    P4197Peaks题解题目描述在Bytemountains有\(n\)座山峰,每座山峰有他的高度\(h_i\)。有些山峰之间有双向道路相连,共\(m\)条路径,每条路径有一个困难值,这个值越大表示越难走。现在有\(q\)组询问,每组询问询问从点\(v\)开始只经过困难值小于等于\(x\)的路径所能到达的......
  • P9571 Horizon Blue 题解
    原题链接题目大意:\(有三个操作,分别为\)\(操作1加入一条直线\)\(操作2查询与一条直线相交但不重合的直线条数\)\(操作3删除所有与一条直线相交或重合的直线\)\(注意:后面两个操作的直线并不需要加入\)\(显然,两条直线相交不重合,当且仅当其k值不同\)\(所以可以把所有直线按k......
  • 寻宝 题解
    寻宝题目大意存在\(n\)个点和两种有向边:一类边分\(m\)组,每组的边权相同,从\([s_l,s_r]\)中的所有点连向\([t_l,t_r]\)中的所有点。二类边存在于任意两点\(i,j\)间,从\(i\)连向\(j\)的二类边的边权为\(|i-j|\timesa_i\)。求从点\(1\)到\(n\)的最短路......
  • P9425 [蓝桥杯 2023 国 B] AB 路线 题解
    ~~应该能过官方数据吧~~---回归正题。我开始想过更简单的深搜,但是我怕无法记忆化,所以选择了广搜。和普通的广搜不同,此题的队列要存$3$个维度,分别是$x$,$y$,$z$,分别表示横坐标、纵坐标、目前的步数模$2k$的值。此时我们可以把每$2k$步进行分组,前$k$步走在```A```的格子......
  • 洛谷P5410 【模板】扩展 KMP(Z 函数)题解
    题目链接P5410【模板】扩展KMP(Z函数)-洛谷|计算机科学教育新生态(luogu.com.cn) 分析先考虑z数组设nx[i]为字符串b与b以b[i]开头的后缀最长公共前缀设i为当前需要求的位置当前i+nx[i]-1的最大值所对应的i为q p为i对应的位置当i大于q+nx[q......
  • arc139,arc140,arc141题解
    ARC139A-DATrailingZeros憨的。BMakeN感觉没有那么naive。首先用\(1\)去更新一下后面两个决策的价值。然后有一个较为显然的东西是说\(\text{lcm}\)为周期,周期内应该贪心取最大的。周期外由于范围很小,可以直接枚举一种决策的次数,取最小值即可。复杂度是正确的。CO......
  • Luogu P9510 『STA - R3』高维立方体 题解
    题目传送门没见过这玩意,写个题解记下。题目大意周知斐波那契数列定义为:\[\operatorname{fib}(n)=\left\{\begin{aligned}1&&n\le2\\\operatorname{fib}(n-1)+\operatorname{fib}(n-2)&&n>2\end{aligned}\right.\]然后定义(\(n\le0\)函数值为\(0\))\[f(n)......
  • CF-1860C Game on Permutation题解
    题意:在一条数轴上,Alice可以跳到在你所在点前面且值比当前所在点小的点。每回合可以向任意符合要求的点跳一次。当轮到Alice的回合同时不存在符合要求的点,Alice就赢了。Alice可以选择一个点作为起始点,然后作为后手(赛时这里把我坑了)。问有多少个点是必胜的点。\(n\leq3\times10^5......
  • P6429 [COCI2008-2009#1] JEZ 题解
    题目传送门:Click。某蒟蒻看见这道题,想了足足一个晚上,过后茅塞顿开,故作此篇。感谢神犇的题解。看题目数据范围:\(1\leqr,c\leq10^6,1\leqk\leq10^{12}\),显然打暴力\(\mathcal{O}(rc)\)的时间复杂度是行不通的。必须做到近似于\(mathcal{O}(r)\)的时间复杂度。观察题......
  • [AGC004F] Namori 题解
    这里给出一种与其他题解完全不同的实现方式。思路发现图要么是一棵树,要么是一颗基环树。树我们首先考虑树如何操作。我们可以\(\text{dfs}\)这颗树。对于每个点维护一个\(w,h\),表示这个点想要变成白色\(w\)次,想要变成黑色\(h\)次。容易发现每个点最初状态都为\(w=0......