Educational Codeforces Round 76 (Rated for Div. 2)

Educational Codeforces Round 76 (Rated for Div. 2)

A. Two Rival Students

  • 思路:水题

  • AC代码


#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

ll mult_mod(ll x, ll y, ll mod){
    return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}

ll pow_mod(ll a, ll b, ll p){
    ll res = 1;
    while (b){
        if (b & 1)
            res = mult_mod(res, a, p);
        a = mult_mod(a, a, p);
        b >>= 1;
    }
    return res % p;
}

ll gcd(ll a, ll b){
    return b ? gcd(b, a % b) : a;
}

int t, n, x, a, b, ans;

int main(){
#ifndef ONLINE_JUDGE
    freopen("my_in.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> t;
	while (t --){
		cin >> n >> x >> a >> b;
		ans = fabs(a - b);
		ans += x;
		if(ans > n - 1)
            ans = n - 1;
		cout<< ans << '
';
	}
    return 0;
}

B. Magic Stick

  • 思路:水题

  • AC代码


#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

ll mult_mod(ll x, ll y, ll mod){
    return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}

ll pow_mod(ll a, ll b, ll p){
    ll res = 1;
    while (b){
        if (b & 1)
            res = mult_mod(res, a, p);
        a = mult_mod(a, a, p);
        b >>= 1;
    }
    return res % p;
}

ll gcd(ll a, ll b){
    return b ? gcd(b, a % b) : a;
}

int t, x, y;

int main(){
#ifndef ONLINE_JUDGE
    freopen("my_in.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> t;
    while (t -- ){
        cin >> x >> y;
        if(x >= 4){
            cout << "YES
";
            continue;
        }
        if(x == 1){
            if(y == 1)
                cout<<"YES
";
            else
               cout<<"NO
";
        }
        else{
            if(y <= 3)
              cout<<"YES
";
            else
               cout<<"NO
";
        }
    }
    return 0;
}

C. Dominated Subarray

  • 思路:用set搞搞就行

  • AC代码


#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

ll mult_mod(ll x, ll y, ll mod){
    return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}

ll pow_mod(ll a, ll b, ll p){
    ll res = 1;
    while (b){
        if (b & 1)
            res = mult_mod(res, a, p);
        a = mult_mod(a, a, p);
        b >>= 1;
    }
    return res % p;
}

ll gcd(ll a, ll b){
    return b ? gcd(b, a % b) : a;
}

const int INF = 0x3f3f3f3f;
const int N = 2e5 + 10;

int t, n, ans;
int a[N], b[N];
set<int> s;

int main(){
#ifndef ONLINE_JUDGE
    freopen("my_in.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
	cin >> t;
	while (t -- ){
		s.clear();
		memset(b, 0, sizeof(b));
		ans = INF;
		cin >> n;
		for (int i = 1; i <= n; i ++ )
			cin >> a[i];
		for (int i = 1; i <= n; i ++ ){
			if (s.count(a[i]) == 1){
				ans = min(ans, i - b[a[i]] + 1);
				b[a[i]] = i;
				continue;
			}
			s.insert(a[i]);
			b[a[i]] = i;
		}
		if(ans == INF)
			cout<<-1<<"
";
		else
			cout<<ans<<"
";
	}
    return 0;
}

D. Yet Another Monster Killing Problem

  • 思路:贪心

  • AC代码


#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

ll mult_mod(ll x, ll y, ll mod){
    return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}

ll pow_mod(ll a, ll b, ll p){
    ll res = 1;
    while (b){
        if (b & 1)
            res = mult_mod(res, a, p);
        a = mult_mod(a, a, p);
        b >>= 1;
    }
    return res % p;
}

ll gcd(ll a, ll b){
    return b ? gcd(b, a % b) : a;
}

const int N = 2e5 + 10;

int t, n, m, max1, max2, max3, now, pos, ans;
int a[N], p[N], s[N];

struct Hero{
    int p, s;
}hero[N];

inline bool cmp(const Hero &h1, const Hero &h2){
    return h1.p < h2.p;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("my_in.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> t;
    while (t -- ){
        max1 = 0, max2 = 0, max3 = 0, now = 1, ans = 1;
        cin >> n;
        for (int i = 1; i <= n; i ++ ){
            cin >> a[i];
            max1 = max(max1, a[i]);
        }
        cin >> m;
        for (int i = 1; i <= m; i ++ )
            cin >> hero[i].p >> hero[i].s;
        sort(hero + 1, hero + m + 1, cmp);
        if (max1 > hero[m].p){
            cout << "-1
";
            continue;
        }
        for (int i = m; i >= 1; i -- ){
            p[i] = hero[i].p;
            max2 = max(max2, hero[i].s);
            s[i] = max2;
        }
        for (int i = 1; i <= n; i ++ ){
            max3 = max(max3, a[i]);
            pos = lower_bound(p + 1, p + m + 1, max3) - p;
            if (s[pos] < (i - now + 1)){
                now = i;
                max3 = a[i];
                ans ++ ;
            }
        }
        cout << ans << "
";
    }
    return 0;
}

E. The Contest

  • 思路:三个数组排个序拼成一个数组 答案即为n - LIS

  • AC代码


#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;

ll mult_mod(ll x, ll y, ll mod){
    return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}

ll pow_mod(ll a, ll b, ll p){
    ll res = 1;
    while (b){
        if (b & 1)
            res = mult_mod(res, a, p);
        a = mult_mod(a, a, p);
        b >>= 1;
    }
    return res % p;
}

ll gcd(ll a, ll b){
    return b ? gcd(b, a % b) : a;
}

const int N = 2e5 + 10;

int k1, k2, k3, n, ans, pos1, pos2;
int a[N], b[N], c[N], res1[N], res2[N], tmp[N];

int main(){
#ifndef ONLINE_JUDGE
    freopen("my_in.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> k1 >> k2 >> k3;
    n = k1 + k2 + k3;
    ans = n;
    for (int i = 1; i <= k1; i ++ )
        cin >> a[i];
    for (int i = 1; i <= k2; i ++ )
        cin >> b[i];
    for (int i = 1; i <= k3; i ++ )
        cin >> c[i];
    sort(a + 1, a + k1 + 1);
    sort(b + 1, b + k2 + 1);
    sort(c + 1, c + k3 + 1);
    pos1 = 1;
    res1[0] = k1;
    for (int i = 1; i <= n; i ++ ){
        if (a[pos1] == i)
            pos1 ++ ;
        res1[i] = i - pos1 + 1 + k1 - pos1 + 1;
    }
    pos1 = k3, pos2 = k2;
    res2[n + 1] = k3;
    tmp[n + 1] = k3;
    for (int i = n; i > 0; i -- ){
        if (c[pos1] == i)
            pos1 -- ;
        else if (b[pos2] == i)
            pos2 -- ;
        res2[i] = pos1 + k2 - pos2;
        tmp[i] = min(res2[i], tmp[i + 1]);
    }
    for (int i = 0; i <= n; i ++ )
        ans = min(ans, res1[i] + tmp[i + 1] - (lower_bound(c + 1, c + k3 + 1, i) - c - 1));
    cout << ans << "
";
    return 0;
}
原文地址:https://www.cnblogs.com/Misuchii/p/11883899.html