2024.9.17联考

JPGOJCZX / 2024-09-21 / 原文

T1

题目描述

给定一个含有 \(n\) 个字符串的序列 \(s\),其中每个字符串长度不超过 \(3\),且仅由小写字母组成,判断是否有一个它的子序列,满足子序列中的字符串首尾相接后形成的字符串是一个回文串。若存在,请求出最小的整数 \(X\),满足存在一个这样的子序列,它的最后一个字符串的下标为 \(X\);若不存在,输出 \(−1\)

输入格式

从文件 \(pali.in\) 中读入数据。

第一行一个整数 \(T\) 代表数据组数。

对每组数据,第一行一个整数 \(n\)

接下来 \(n\) 行每行一个长度不超过 \(3\),且仅由小写字母组成的字符串 \(s_i\)

输出格式

输出到文件 \(pali.out\) 中。

对每组数据输出一个整数,若存在满足条件的子序列,则输出 \(X\);若不存在,则输出 \(−1\)

输入样例

6
5
zx
ab
cc
zx
ba
2
ab
bad
4
co
def
orc
es
3
a
b
c
3
ab
cd
cba
2
ab
ab

输出样例

3
-1
-1
1
3
-1

数据规模

对于 \(100\%\) 数据,\(1 \leq T \leq 10, 1 \leq n \leq 10^5\)

测试点编号 \(n \leq\) 特殊性质
\(1 ∼ 2\) \(18\) /
\(3\) \(10^5\) 所有字符串长度为 \(1\)
\(4 ∼ 5\) \(10^5\) 所有字符串长度为 \(2\)
\(6 ∼ 7\) \(1000\) /
\(8 ∼ 10\) \(10^5\) /

完整代码

#include <bits/stdc++.h>
using namespace std;
int T, n;
map <string, bool> mp;
string s;
int main(){
	freopen("pali.in", "r", stdin);
	freopen("pali.out", "w", stdout);
	ios::sync_with_stdio(0);
	cin >> T;
	while(T--){
		mp.clear();
		cin >> n;
		bool flag = false;
		int ans;
		for(int i = 1; i <= n; i++){
			cin >> s;
			if(flag)
				continue;
			mp[s] = true;
			int len = s.length();
			string tmp = s;
			reverse(tmp.begin(), tmp.end());
			if(tmp == s){
				ans = i;
				flag = true;
			} else if(len == 3){
				if(mp[tmp]){
					ans = i;
					flag = true;
				}
				string t = "";
				for(int j = 0; j <= 1; j++)
					t += s[2 - j];
				if(mp[t]){
					ans = i;
					flag = true;
				}
			} else {
				if(mp[tmp]){
					ans = i;
					flag = true;
				}
				string t = "";
				for(int j = 0; j <= 1; j++)
					t += s[1 - j];
				if(mp[t]){
					ans = i;
					flag = true;
				}
				for(int j = 0; j < 26; j++){
					string tt = t + char('a' + j);
					if(mp[tt]){
						ans = i;
						flag = true;
						break;
					}
				}	
			}
		}
		if(!flag)
			cout << -1 << endl;
		else
			cout << ans << endl;
	}
	return 0;
}

T2

题目描述

给定一个 \(n \times n\) 的矩阵,定义一次操作为选择一个整数 \(i\),对于所有整数 \(j \in [1, n]\)
\(j \neq i\),交换 \(A_{j, i}\)\(A_{i, j}\)

求出在进行若干次操作后可达成的矩阵中,以 \(A_{1, 1}, A_{1, 2}, \dots, A_{1, n}, A_{2, 1}, A_{2, 2}, \dots, A_{n, n}\) 的形式排列后,字典序最小的矩阵。

输入格式

从文件 \(swap.in\) 中读入数据。

第一行一个整数 \(n\) 代表矩阵大小。

接下来 \(n\) 行每行 \(n\) 个整数,代表 \(A_{i, j}\)

输出格式

输出到文件 \(swap.out\) 中。

输出 \(n\) 行,每行 \(n\) 个整数,可达成的字典序最小的矩阵。

输入样例

3
2 8 6
7 5 1
4 9 3

输出样例

2 7 4
8 5 1
6 9 3

数据规模

对于 \(100\%\) 数据,\(n \leq 1000, 1 \leq A_{i, j} \leq 10^9\)

测试点编号 \(n \leq\)
\(1 ∼ 4\) \(5\)
\(5 ∼ 8\) \(20\)
\(9 ∼ 12\) \(200\)
\(13 ∼ 20\) \(1000\)

T3

题目描述

给定一张由 \(n\) 个点和 \(m\) 条边组成的无向联通图,点的编号从 \(1\)\(n\),点有点权,第 \(i\) 个点点权为 \(C_i\),对于任意 \(C_i\) 满足 \(Ci \in [−n, n]\),且 \(C_i\) 的奇偶性与 \(i\) 的度数的奇偶性相同。一个点的度数为与其相邻的边的个数。

现在你要为每一条边都赋一个边权,要求每个点所有相邻的边的边权和等于该点的点权,且边权的大小 \(w_i \in [−2n^2, 2n^2]\)

输入格式

从文件 \(graph.in\) 中读入数据。

第一行两个整数 \(n\)\(m\)

接下来一行 \(n\) 个整数 \(C_1, C_2, \dots, C_n\) 为点的点权。

接下来 \(m\) 行每行两个整数 \(u_i, v_i\) 表示第 \(i\) 条边链接 \(u_i\)\(v_i\)

保证原图中无重边无自环。

输出格式

输出到文件 \(graph.out\) 中。

一行输出 \(m\) 个整数 \(w_1, w_2, \dots, w_m\),为第 \(i\) 条边的边权。

输入样例

3 2
2 −1 3
3 1
2 1

输出样例

3 -1

数据规模

对于 \(100\%\) 数据,\(1 \leq n, m \leq 10^5\)

测试点编号 \(n \leq\) 特殊性质
\(1 ∼ 2\) \(3\) /
\(3 ∼ 4\) \(10^5\) 原图是树
\(5 ∼ 6\) \(10^5\) 原图是二分图
\(7 ∼ 10\) \(10^5\) \(m = n\)
\(11 ∼ 14\) \(10^5\) \(m = n + 5\)
\(15 ∼ 20\) \(10^5\) /

提示

除样例 \(1\) 外,其他样例的答案文件为空,选手可以通过下发的 \(checker.cpp\) 来检验自己输出结果的正确性。

T4

题目描述

给定一个大小为 \(3 \times n\) 的矩阵,你要从矩阵的左上角走到右下角,即要从 \((1, 1)\) 走到 \((3, n)\), 每步只能从 \((x, y)\) 走到 \((x + 1, y)\)\((x, y + 1)\)

矩阵的每个位置上都有一个数 \(A_{i, j}\),代表经过这个位置时所需要的收益。与此同时,矩阵第二行的格子初始是不可通行的,有 \(m\) 个开关,第 \(i\) 个开关有三个参数 \(l_i, r_i, v_i\) 打开后可以使第二行的 \([li, ri]\) 区间内的位置全部可以通行,但是要额外花费 \(v\) 的代价。一条路径的收益即为路上经过的所有位置的收益和,减去需要打开开关所需要的代价和。

现在要你求出从 \((1, 1)\) 走到 \((3, n)\) 所能获得的最大收益。

输入格式

从文件 \(seg.in\) 中读入数据。

第一行两个整数 \(n, m\)

接下来三行每行 \(n\) 个数 \(A_{i, j}\)

接下来 \(m\) 行每行 \(3\) 个数 \(li, ri, vi\),为第 \(i\) 个开关的信息。

输出格式

输出到文件 \(seg.out\) 中。

一行一个整数,代表能获得的最大收益。

输入样例

5 5
−6 4 −7 −6 10
−3 −6 3 −5 −8
−9 10 5 6 −1
2 4 10
4 4 4
1 1 7
1 3 9
2 3 7

输出样例

5

数据规模

对于 \(100\%\) 数据,\(1 \leq n, m \leq 5 \times 10^5,1 \leq li \leq ri \leq n,1 \leq vi \leq 10^9,|Ai,j | \leq 10^9\)

测试点编号 \(n \leq\) \(m \leq\)
\(1 ∼ 2\) \(20\) \(20\)
\(3 ∼ 4\) \(100\) \(100\)
\(5 ∼ 6\) \(5 \times 10^5\) \(1\)
\(7 ∼ 8\) \(5 \times 10^5\) \(5\)
\(9 ∼ 12\) \(5000\) \(5000\)
\(13 ∼ 20\) \(5 \times 10^5\) \(5 \times 10^5\)