1.交换
【问题描述】
fateice 扔给了 fjzzq2002 一个长度为 n 的正整数序列,要让他排好序。
因为这太简单,所以 fjzzq2002 只能用规定的两种操作来将这个序列排成升序。
1. 将相邻的两个数调换位置,也就是𝑎𝑖, 𝑎𝑗变成𝑎𝑗, 𝑎𝑖。
2. 将连续的三个数调换位置,也就是𝑎𝑖, 𝑎𝑗, 𝑎𝑘变成𝑎𝑘, 𝑎𝑗, 𝑎𝑖。
其中, 𝑖, 𝑗(, 𝑘)必须满足条件(相邻/连续)。
由于使用操作 1 很累,所以 fjzzq2002 想要尽可能少的使用操作 1,你需要求出将这个
序列排成单调上升最少需要的操作 1 的次数。数据保证序列中不存在相同的两个数。
【输入格式】
输入文件名为 swap.in。
第一行,一个数 n,表示序列长度。
第二行, n 个互不相同的正整数,表示这个正整数序列。
【输出格式】
输出文件名为 swap.out
一行,一个数,表示答案。
输入:
4
1 4 2 3
输出:
1
【数据规模与约定】
对于 30% 的数据, 1 ≤ 𝑛 ≤ 10;
对于 60% 的数据, 1 ≤ 𝑛 ≤ 10^3;
对于 100% 的数据, 1 ≤ 𝑛 ≤ 10^5, 1 ≤ 𝑎𝑖 ≤ 10^9。
1 |
|
找规律题…..
操作二暗示奇数编号可以在奇数编号随意移动,偶数一样。所以排序记录每个数之前的位置。如果当前位置的奇偶性与之前不符,ans++,最后ans/=2;
2.city
【问题描述】
在不远的未来,城市都是一层一层的排列的。
所有城市的上方有一个出发点,所有城市的下方有一个终点,旅行者们可以从出发点出
发穿越所有层城市到达终点。
这些城市有 m 层,从高往低为 1 到 m 层,每层都有 n 个城市。从出发点到第一层的第
i 个城市的花费为𝐴𝑖;从第 m 层的第 i 个城市到终点的花费为𝐶𝑖;在第 t 层到第 t+1 层穿越
时,当到达第 t+1 层的第 i 个城市时,花费为𝐵𝑖。
当旅行者到达终点时候,结算他总共的花费。为了吸引旅游者,所以花费对 p 取模。作
为一个旅游者的 fateice,当然需要使得花费最小(即为 0)。所以,请你求出 fateice 有多少
种走法使得花费为 0。
因为答案很大,所以良心出题人只要你输出答案对109 + 7取模后的值即可。
【输入格式】
输入文件名为 city.in。
第一行,三个数, 𝑛, 𝑚, 𝑝,分别表示城市层数,每层城市数和结算花费时候的取模。
第二行, n 个数𝐴𝑖,含义如题所示。
第三行, n 个数𝐵𝑖,含义如题所示。
第四行, n 个数𝐶𝑖,含义如题所示。
【输出格式】
输出文件名为 city.out。
仅一行,一个数,输出答案对109 + 7取模后的值。
输出:
2 3 13
6 4
1 2
4 3
输入:
2
【数据规模与约定】
对于 30% 的数据, 1 ≤ 𝑛 ≤ 5;
对于 60% 的数据, 1 ≤ 𝑛 ≤ 10^3;
对于另外 10% 的数据, 𝐵𝑖 = 1。
对于 100% 的数据, 1 ≤ 𝑛 ≤ 10^6,2 ≤ 𝑚 ≤ 10^5,2 ≤ 𝑝 ≤ 100,0 ≤ 𝐴𝑖,𝐵𝑖, 𝐶𝑖 ≤ 𝑝。
DP(但数据太大只能拿35分qwq),复杂度o(nmp)
1 |
|
正解(DP用矩乘优化)o(p^3nlogm)
1 |
|
新加 一大佬的代码(比std还神!!!)
注意::
矩阵乘法没有交换律,写时要慎重,一旦写错很难发现,前车之鉴,qwq;
3.最长公共子序列
【问题描述】
fateice 有一个长度为 n 的正整数序列 A, fjzzq2002 有一个长度为 m 的正整数序列 B。
良心出题人给了一个长度为 k 的正整数序列 C。
定义一个 A 和 B 的公共子序列是“完美的”,当且仅当这个公共子序列包含了正整数序列
C。换句话说, C 是这个公共子序列的一个子串(连续)。
求 A 和 B 最长的“完美的”公共子序列的长度。
【输入格式】
输入文件名为 lcs.in。
第一行,一个数 n,表示 fateice 的序列长度。
第二行, n 个正整数,描述 fateice 的序列。
第三行,一个数 m,表示 fjzzq2002 的序列长度。
第四行, m 个正整数,描述 fjzzq2002 的序列。
第五行,一个数 k,表示良心出题人的序列长度。
第六行, k 个正整数,描述良心出题人的序列。
【输出格式】
输出文件名为 lcs.out。
一行,一个正整数,表示 A 和 B 最长的“完美的“公共子序列的长度。如果不存在这样的
序列输出“-1”,如果 k=0 且不存在这样的序列输出 0。
输入:
4 1
2 3 5
4 1
3 4 5
2 3
5
输出:
3
1 |
|
接近正解的错误代码qwq(并没正解考虑的那么周全qwq)
1 |
|
题解:
先处理出a和b的最长公共子序列,再倒着处理一遍。用na[i]来表示a从i开始匹配到c所需到的最小的编号。nb[i]表示b从i开始匹配到c所需到的最小的编号。ans=max(f[i-1][j-1]+k+g[na[i]+1][nb[i]+1],ans)。
本文作者:
syrsteven
最后更新: 2023年09月02日 04:06:21
本文链接: http://syrsteven.github.io/post/aad8cb40.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可,转载请注明出处!
最后更新: 2023年09月02日 04:06:21
本文链接: http://syrsteven.github.io/post/aad8cb40.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可,转载请注明出处!