Practice.代码略去了快读模板
A. Two Permutations
题意
给定三个整数 \(n, a, b\),构建两个长为 \(n\) 的排列,满足前 \(a\) 个数和后 \(b\) 个数一致。输出是否能构建出两个不同的排列。
特别地,当 \(n = a = b\) 时,输出 \(YES\)。
思路
如题。
时间复杂度:\(O(1)\)
对应AC代码
import java.io.*;
import java.math.*;
import java.util.*;
import java.util.concurrent.atomic.*;
public class Main{
public static void main(String[] args) throws Exception{
Console console = new Console();
int t = console.nextInt();
while(t -- > 0){
int n = console.nextInt(), a = console.nextInt(), b = console.nextInt();
if(n == a && b == a){
console.println("YES");
continue;
}
console.println(n - a - b >= 2 ? "YES" : "NO");
}
console.close();
}
}
什么离谱的特判啊
B. Elimination of a Ring
题意
给定一个首尾相连的序列,序列中的相邻元素不相等。定义一次操作为删去任意元素,在每次删去后,若出现相邻元素相等,那么删去任意重复元素,直到没有相邻元素相等。
思路
我们不妨来考虑下面的一种情况:
1
6
1 2 1 2 1 2
显然,对于这类相间的数,在剩余两个数之前,我们都是成对删除的(如删除 \(1\) 后左边或右边的 \(2\) 也将被删去)。
而若我们在里面添加任意数字,那么相间的环将会被打破,我们不难发现,我们只需删去添加的任意数的相邻数,即可避免删除数以后出现重复数字。
更具体地说,除了两个数字相间成环的情况,我们应该输出 \(\frac{n}{2} + 1\) 外,其余情况均输出 \(n\)。
时间复杂度:\(O(n)\)
对应AC代码
import java.io.*;
import java.math.*;
import java.util.*;
import java.util.concurrent.atomic.*;
public class Main{
public static void main(String[] args) throws Exception{
Console console = new Console();
int t = console.nextInt();
nxt:
while(t -- > 0){
int n = console.nextInt();
if(n <= 2 || n % 2 == 1) {
for(int i=0;i<n;i++) console.nextInt();
console.println(n);
}
else{
int a = console.nextInt(), b = console.nextInt();
boolean f = false;
for(int i = 1;i<n / 2;i++){
if(console.nextInt() != a | console.nextInt() != b){
if(f) continue;
console.println(n);
f = true;
}
}
if(!f) console.println(n / 2 + 1);
}
}
console.close();
}
}
硬猜就完事了(
C. Set Construction
题意
给定一个二进制矩阵 \(b\),构造 \(n\) 个无重复数字的序列 \(A\),满足矩阵对应的限制:
\(b_{i, j} = 1\) 表示 \(A_i\subsetneq A_j\),\(b_{i, j} = 0\) 则相反。
思路
显然,序列是不唯一的,那么我们不妨来初始化 \(A\),满足 \(A_i\) 中一定包含 \(i\)。
那么,显然地,若 \(A_i\subsetneq A_j\),那么 \(A_j\) 中就一定有 \(i\)。
更简单地说,我们只需遍历输出的矩阵,若 \(b_{i, j} = 1\),那么我们在 \(A_j\) 里添加 \(i\)。
输出满足上述条件的序列即可。
时间复杂度:\(O(n ^ 2)\)
对应AC代码
import java.io.*;
import java.math.*;
import java.util.*;
import java.util.concurrent.atomic.*;
public class Main{
public static void main(String[] args) throws Exception{
Console console = new Console();
int t = console.nextInt();
nxt:
while(t -- > 0) {
int n = console.nextInt();
List<List<Integer>> ans = new ArrayList<>();
for (int i = 0; i < n; i++) {
List<Integer> e = new ArrayList<>();
e.add(i + 1);
ans.add(e);
}
for (int i = 1; i <= n; i++) {
String s = console.next();
for (int j = 0; j < n; j++) {
if(s.charAt(j) == '1') ans.get(j).add(i);
}
}
for(int i=0;i<n;i++){
console.print(ans.get(i).size());
for(int j : ans.get(i)) console.print(" " + j);
console.println();
}
}
console.close();
}
}
好一个思维题...