Codeforces Round #752 (Div. 2)(A-E)

Posted H-w-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #752 (Div. 2)(A-E)相关的知识,希望对你有一定的参考价值。

Codeforces Round #752 (Div. 2)

A. Era

题意:

给出一个数组 a a a,一种操作:每次能够在任意位置插入一个数,问最小的插入次数使 ∀ i ∈ [ 1 , n ] \\forall i \\in[1,n] i[1,n],都满足 a i ≤ i a_i\\le i aii

思路:

我们能够在最前面插入1,使每个数的下标都加1,如果 i ≤ a [ i ] i\\le a[i] ia[i],只要让最小 i − a [ i ] i-a[i] ia[i]变成0的操作数就是答案。

#include <bits/stdc++.h>

using namespace std;

const double eps = 1e-2;

int a[200010];

int main() 
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
    int t;
    cin >> t;
    while(t--) 
        int n;
        cin >> n;
        int ans = 0;
        for(int i=1; i<=n; i++) 
            cin >> a[i];
            ans = max(a[i] - i, ans);
        
        cout << ans << endl;
    

B. XOR Specia-LIS-t

题意:

给出一个数组,你可以将它切割成多个子数组,问每个子数组的最长上升子序列的长度 的 异或是否能够为0

思路:

当数组长度是一个偶数,我们把数组都分解成长度为1的子数组,异或得0。
当数组长度是一个奇数,只要存在一个长度为2的非递增子数组,再把其他的都分解成长度为1的子数组,异或得0。
否则就不存在异或得0得情况。

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 3e5+10;
const double eps = 1e-2;

ll s[N];
ll fac[N];
bool check(int n) 
    for(int i=1; i<=n; i++) 
        if(i >= 30) return true;
        if(s[i] % fac[i+1] == 0) return false;
    
    return true;

int main() 
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
    fac[1] = 1;
    for(ll i=2; i<=30; i++) 
        ll tmp = __gcd(fac[i-1], i);
        fac[i] = fac[i-1] / tmp * i;
    
    int t;
    cin >> t;
    while(t--) 
        int n;
        scanf("%d", &n);
        for(int i=1; i<=n; i++) 
            scanf("%lld", &s[i]);
        
        if(check(n)) puts("YES");
        else puts("NO");
    

C. Di-visible Confusion

题意:

给出一个数组a,当 a [ i ] % ( i + 1 ) ≠ 0 a[i] \\% (i+1)\\neq 0 a[i]%(i+1)=0,就能把 a [ i ] a[i] a[i]删除,后面的元素向前移。问是否存在一个方案使得所有的数都能删除。

思路:

每删除一个元素,都能使得它后面的元素下标产生变化,但是当 i = 1 i=1 i=1时不能再往右移,如果 a [ i ] % 2 = 0 a[i] \\% 2 = 0 a[i]%2=0那么 a [ i ] a[i] a[i]一定不能被删除。
所以我们往后推可以发现,如果 ∃ i \\exist i i使得 a [ i ] % l c m ( 2 , 3 , . . . i + 1 ) = 0 a[i] \\% lcm(2,3,...i+1) = 0 a[i]%lcm(2,3,...i+1)=0那么当前元素一定不能被删除。
【当 i ≥ 30 i\\ge30 i30 l c m lcm lcm会大于 1 e 9 1e9 1e9,所以就不用再考虑了】

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 3e5+10;
const double eps = 1e-2;

ll s[N];
ll fac[N];
bool check(int n) 
    for(int i=1; i<=n; i++) 
        if(i >= 30) return true;
        if(s[i] % fac[i+1] == 0) return false;
    
    return true;

int main() 
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
    fac[1] = 1;
    for(ll i=2; i<=30; i++) 
        ll tmp = __gcd(fac[i-1], i);
        fac[i] = fac[i-1] / tmp * i;
    
    int t;
    cin >> t;
    while(t--) 
        int n;
        scanf("%d", &n);
        for(int i=1; i<=n; i++) 
            scanf("%lld", &s[i]);
        
        if(check(n)) puts("YES");
        else puts("NO");
    

D. Moderate Modular Mode

题意:

给出两个偶数 x , y x,y x,y,求 n n n,使得满足条件 n m o d    x = y m o d    n n\\mod x= y\\mod n nmodx=ymodn

思路:

x = y x=y x=y时, n = x n=x n=x
x > y x>y x>y时, n = x + y n=x+y n=x+y
x < y x<y x<y时,设
n = k 1 x + m 1 y = k 2 n + m 2 ( k 2 + 1 ) n = k 1 x + y x % 2 = y % 2 = 0 n = ( k 1 x + y ) / 2 当 k 1 = y / x 时 满 足 条 件 n=k_1x+m_1\\\\ y=k_2n+m_2\\\\ (k_2+1)n=k_1x+y\\\\ x\\%2=y\\%2=0\\\\ n=(k_1x+y)/2\\\\ 当k_1=y/x时满足条件 n=k1x+m1y=k2n+m2(k2+1)n=k1x+yx%2=y%2=0n=(k1x+y)/2k1=y/x

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 3e5+10;
const double eps = 1e-2;

ll s[N];
ll fac[N];
bool check(int n) 
    for(int i=1; i<=n; i++) 
        if(i >= 30) return true;
        if(s[i] % fac[i+1] == 0) return false;
    
    return true;

int main() 
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
    
    int t;
    cin >> t;
    while(t--) 
        ll x, y;
        cin >> x >> y;
        if(x == y) 
            cout << x << endl;
        
        else if(x > y) 
            cout << x + y << endl;
        
        else 
            if(y % x == 0) cout << x << endl;
            else cout << ((y/x)*x + y)/2 << endl;
        
    

E. Extreme Extension

题意:

给出一个数组a
一个操作:将 a i a_i ai分解成 x x x y y Codeforces Round #752 (Div. 2)(A-E)

Codeforces Round #752 (Div. 2)(A-E)

Codeforces Round #389 (Div. 2) 752F(树的权值重心)

Codeforces Round #436 E. Fire(背包dp+输出路径)

CodeForces - 752B

[ACM]Codeforces Round #534 (Div. 2)