> 文档中心 > codeforces CodeTON Round 1 (Div. 1 + Div. 2, Rated, Prizes) Editorial前三题讲解

codeforces CodeTON Round 1 (Div. 1 + Div. 2, Rated, Prizes) Editorial前三题讲解


前提声明:题目均已开中文翻译,可能会有偏差,但不影响理解!!!

目录

A

题目

代码

讲解

B

题目

代码

讲解

C

题目

代码

讲解


A

题目

您将获得一个数组a_1、a_2、\ldots、a_n一个1​,一个2​,...,一个n​的正整数。一对好是一对指数(一、j)(ij)跟1 \leq i, j \leq n1≤ijn这样,对于所有人来说1 \leq k \leq n1≤kn,则以下相等性成立:

|a_i - a_k|+ |a_k - a_j|= |a_i - a_j|,,哪里|x|∣x∣表示的绝对值xx.

找到一对好搭档。请注意,我可以等于jj.

输入

输入由多个测试用例组成。第一行包含单个整数tt (1 \leq t \leq 10001≤t≤1000) ― 测试用例的数量。测试用例的说明如下。

每个测试用例的第一行包含一个整数nn (1 \leq n \leq 10^51≤n≤105) ― 数组的长度。

每个测试用例的第二行包含nn整数a_1、a_2、\ldots、a_n一个1​,一个2​,...,一个n​ (1 \leq a_i \leq 10^91≤一个​≤109) 其中a_i一个​是我-数组的第 1 个元素。

总和nn对于所有测试用例,最多是2 \cdot 10^52⋅105.

输出

对于每个测试用例,打印一行具有两个空格分隔索引我和jj形成一对很好的阵列。案例i=j=j是允许的。可以看出,这样的一对始终存在。如果有多个好的配对,请打印其中任何一个。

示例 1

输入复制 输出复制
335 2 751 4 2 2 312
2 31 21 1

注意

在第一种情况下,对于i = 2=2和j = 3j=3平等适用于所有人kk:

  • k = 1k=1:|a_2 - a_1|+ |a_1 - a_3|= |2 - 5|+ |5 - 7|= 5 = |2 - 7|= |a_2-a_3|∣一个2​−一个1​∣+∣一个1​−一个3​∣=∣2−5∣+∣5−7∣=5=∣2−7∣=∣一个2​−一个3​∣,
  • k = 2k=2:|a_2 - a_2|+ |a_2 - a_3|= |2 - 2|+ |2 - 7|= 5 = |2 - 7|= |a_2-a_3|∣一个2​−一个2​∣+∣一个2​−一个3​∣=∣2−2∣+∣2−7∣=5=∣2−7∣=∣一个2​−一个3​∣,
  • k = 3k=3:|a_2 - a_3|+ |a_3 - a_3|= |2 - 7|+ |7 - 7|= 5 = |2 - 7|= |a_2-a_3|∣一个2​−一个3​∣+∣一个3​−一个3​∣=∣2−7∣+∣7−7∣=5=∣2−7∣=∣一个2​−一个3​∣.

代码

#includeusing namespace std;;int main() {int n;cin >> n;while(n--){int m;cin >> m;int minv = 1e9+10;int maxv = -1;int mini ;int maxi ;for(int i = 0;i>a;if(a>maxv){maxi = i+1;maxv = a;}if(a<minv){mini = i+1;minv = a;}}cout<<mini<<" "<<maxi<<endl;}return 0;}

讲解 

 

本题关键是找到数组中的最大值和最小值的下标并输出

k可以为1~n中的任意值,要实现 |a_i - a_k|+ |a_k - a_j|= |a_i - a_j|这个式子

就要保证| a[i]-a[j] |值最大,即数组中的最大值和最小值的差值

B

题目

您将获得以下列表n整数。您可以执行以下操作:选择一个元素x从列表中删除x从列表中,并减去x从所有剩余元素。因此,在一次操作中,列表的长度正好减少1.

给定一个整数k(k>0),查找是否存在n-1操作,使得在应用操作后,列表中唯一剩余的元素等于k.

输入

输入由多个测试用例组成。第一行包含单个整数tt (1 \leq t \leq 10^41≤t≤104) ― 测试用例的数量。测试用例的说明如下。

每个测试用例的第一行包含两个整数nn和kk (2 \leq n \leq 2\cdot 10^52≤n≤2⋅105,1 \leq k \leq 10^91≤k≤109),分别是列表中的整数数和目标值。

每个测试用例的第二行包含nn列表的整数a_1、a_2、\ldots、a_n一个1​,一个2​,...,一个n​ (-10^9 \leq a_i \leq 10^9−109≤一个​≤109).

可以保证nn在所有测试用例中,不会大于2 \cdot 10^52⋅105.

输出

对于每个测试用例,如果可以实现,请打印 YESkk具有以下序列n-1n−1操作。否则,请打印 NO。

在任何情况下,您都可以打印每个字母(例如,"yes","YES","Yes","yeS","yEs"都将被识别为肯定的答案)。

示例 1

输入复制 输出复制
44 54 2 2 75 41 9 1 3 42 1717 02 1718 18
YESNOYESNO

注意

在第一个示例中,我们有列表{4,2,2,7},我们有目标k = 5k=5.实现它的一种方法如下:首先我们选择第三个元素,获取列表{2,0,5}.接下来我们选择第一个元素,获取列表{−2,3}.最后,我们选择第一个元素,获取列表\{5\}.

代码

#include#include#includeusing namespace std;int main() {int t;cin >> t;while (t--) {int n, a;cin >> n >> a;vectorv(n);for (int& x : v) cin >> x;bool ans = false;if (n == 1) ans = (v[0] == a);else {sort(v.begin(), v.end());int i = 0;int j = 0;while (j < n and i < n) {if (v[i] + abs(a) == v[j]) {ans = true;break;}else if (v[i] + abs(a) < v[j])++i;else ++j;}}cout << (ans ? "YES" : "NO") << endl;}return 0;}

讲解

看样例1

咱就是说,如果你还看不懂的话,画一个图,一目了然,

 到最后,,只剩下{5}

坐标即使再发生变化,但坐标差值不会变,hh,可以得出本题求的是两个坐标的最远距离(doge 

也就是找题中的最大值和最小值,看它俩的差值是否为目标值即可

C

题目

您将获得一个数组nn非负整数a_1、a_2、\ldots、a_n一个1​,一个2​,...,一个n​.您可以执行以下操作:选择一个整数x \geq 2x≥2并将数组的每个数字替换为余数,同时将该数字除以xx,即,对于所有人1 \leq i \leq n1≤in设置a_i一个​自a_i \bmod x一个​勇气x.

确定是否可以通过应用零次或多次操作来使数组的所有元素相等。

输入

输入由多个测试用例组成。第一行包含单个整数tt (1 \leq t \leq 10^41≤t≤104) ― 测试用例的数量。测试用例的说明如下。

每个测试用例的第一行包含一个整数nn (1 \leq n \leq 10^51≤n≤105) ― 数组的长度。

每个测试用例的第二行包含nn整数a_1、a_2、\ldots、a_n一个1​,一个2​,...,一个n​ (0 \leq a_i \leq 10^90≤一个​≤109) 其中a_i一个​是我-数组的第 1 个元素。

总和nn对于所有测试用例,最多是2 \cdot 10^52⋅105.

输出

对于每个测试用例,如果可以通过应用操作使列表中的所有元素相等,请打印一行带有 YES 的行。否则,请打印 NO。

在任何情况下,您都可以打印每个字母(例如,"YES","yes","yEs"都将被识别为肯定的答案)。

示例 1

输入复制 输出复制
442 5 6 831 1 154 1 7 0 845 9 17 5
YESYESNOYES

注意

在第一个测试用例中,可以应用该操作x = 3x=3获取数组[2, 2, 0, 2],然后应用该操作x = 2获取[0, 0, 0, 0].

在第二个测试用例中,所有数字都已相等。

在第四个测试用例中,应用操作x = 4结果在数组中[1, 1, 1, 1]

代码

#includeusing namespace std;int main(){int m;cin>>m;while(m--){int n;cin>>n;vectorv(n);for(int i = 0;i>v[i];bool ans1 = 0,ans2 = 0;sort(v.begin(),v.end());for(int i = 0;i<n;i++){if(v[i] == 1){ans1 = 1;}if(i<n-1 &&(v[i]+1 == v[i+1])){ans2 = 1;}}if(ans1&&ans2){cout<<"NO"<<endl;}else{cout<<"YES"<<endl;}}return 0;}

讲解

这一题本质就是求模(每个数都模一个大于等于2的数值),看模到最后,数组中的值是否相等,

当数组中出现了1,绝对不会出现最终结果相等的情况,因为1modx(x>=2)还是1

分成两种情况,数组中包含1和不包含1的进行分析

此外数组中每两个数只差应该大于等于2,如果差值为1,那么x+1 mod x = 1;x mod x = 0

永远不可能出现最后结果相同的情况!

经分析,代码如上

打表过样例,暴力出奇迹