Codeforces Round#808 div.1+div.2题解
Posted 欣君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round#808 div.1+div.2题解相关的知识,希望对你有一定的参考价值。
视频讲解:BV1ya411S7KF
div.2-A. Difference Operations
题目大意
给定长度为 n n n 的数组 a a a ,可以进行任意次操作,每次操作选择一个整数 i ∈ [ 2 , n ] i\\in[2,n] i∈[2,n] 将 a i a_i ai 修改为 a i − a i − 1 a_i-a_i-1 ai−ai−1
问能否对所有 i ∈ [ 2 , n ] i\\in[2,n] i∈[2,n] ,使得 a i = 0 a_i=0 ai=0 。
题解
从左到右考虑。
若使得
a
1
=
0
a_1=0
a1=0 ,则必须
a
0
∣
a
1
a_0|a_1
a0∣a1 。
若使得
a
2
=
0
a_2=0
a2=0 ,则必须存在
k
∈
[
0
,
a
1
a
0
]
k\\in[0,\\fraca_1a_0]
k∈[0,a0a1] ,使得
(
a
1
−
k
∗
a
i
)
∣
a
2
(a_1-k*a_i)|a_2
(a1−k∗ai)∣a2 ,即
a
0
∣
a
2
a_0|a_2
a0∣a2 。
以此类推,必须对于所有
i
∈
[
2
,
n
]
i\\in[2,n]
i∈[2,n] ,满足
a
0
∣
a
i
a_0|a_i
a0∣ai ,才存在合法方案。
参考代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=110;
int a[MAXN];
int main()
int T,n,i,flag;
scanf("%d",&T);
while(T--)
scanf("%d",&n);
flag=1;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
if(a[i]%a[1])
flag=0;
if(flag)
puts("YES");
else
puts("NO");
div.2-B. Difference of GCDs
题目大意
给定 n ( 1 ≤ n ≤ 1 0 5 ) , l , r ( 1 ≤ l ≤ r ≤ 1 0 9 ) n(1 \\leq n \\leq 10^5),l,r(1 \\leq l \\leq r \\leq 10^9) n(1≤n≤105),l,r(1≤l≤r≤109) ,构造长为 n n n 的数组 a 1 , a 2 , . . . , a n ( l ≤ a i ≤ r ) a_1,a_2,...,a_n(l \\leq a_i \\leq r) a1,a2,...,an(l≤ai≤r) ,使得 g c d ( i , a i ) gcd(i,a_i) gcd(i,ai) 均不同。
题解
注意到 g c d ( i , a i ) ∈ [ 1 , i ] gcd(i,a_i)\\in[1,i] gcd(i,ai)∈[1,i] ,因此若使得 g c d ( i , a i ) gcd(i,a_i) gcd(i,ai) 均不同,则必须 g c d ( i , a i ) = i gcd(i,a_i)=i gcd(i,ai)=i ,即 i ∣ a i i|a_i i∣ai 。
因此对于每个 i i i ,在 [ l , r ] [l,r] [l,r] 区间内寻找是否存在 i i i 的倍数即可。
参考代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=100100;
int a[MAXN];
int main()
int T,n,l,r,i,flag;
scanf("%d",&T);
while(T--)
scanf("%d%d%d",&n,&l,&r);
flag=1;
for(i=1;i<=n;i++)
a[i]=r/i*i;
if(a[i]<l)
flag=0;
break;
if(!flag)
puts("NO");
else
puts("YES");
for(i=1;i<=n;i++)
printf("%d ",a[i]);
puts("");
div.1-A/div.2-C. Doremy’s IQ
题目大意
Doremy有 n n n 场考试,第 i i i 场考试只能在第 i i i 天进行,难度为 a i a_i ai 。初始IQ为 q ( 1 ≤ q ≤ 1 0 9 ) q(1 \\leq q \\leq 10^9) q(1≤q≤109) ,每场考试可以选择参加或不参加。 q > 0 q>0 q>0 时才能参加考试,若参加,则会产生以下影响:
- 若 a i > q a_i>q ai>q ,则 q q q 减少 1 1 1
- 否则不变
求最多可以参加的考试数。
题解
由于不论 a i a_i ai 多少,只要 a i > q a_i>q ai>q 都会使得 q q q 减少 1 1 1 ,因此贪心考虑,将降智考试全部排在最后即可。
可以简单证明,将一个降智考试从早调整到晚后,必定会产生不更差的结果。
参考代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=100100;
int a[MAXN],ans[MAXN];
int main()
int T,n,q,i,now;
scanf("%d",&T);
while(T--)
scanf("%d%d",&n,&q);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
memset(ans,0,sizeof(int)*(n+5));
now=0;
for(i=n;i>=1&&now<q;i--)
ans[i]=1;
if(now<a[i])
now++;
for(i;i>=1以上是关于Codeforces Round#808 div.1+div.2题解的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round#808 div.1+div.2题解
Codeforces Round#808 div.1+div.2题解
Educational Codeforces Round 21 Problem F (Codeforces 808F) - 最小割 - 二分答案
Codeforces Round #705 (Div. 2)