Educational Codeforces Round 118 (Rated for Div. 2)

Educational Codeforces Round 118 (Rated for Div. 2)

A

模拟 , 显然 p p p 之差大于 10 肯定是 0

#include <bits/stdc++.h>
using namespace std;

std::mt19937 rng(std::random_device{}());
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef const int& cint;
typedef const ll& cll;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;

#define ls (loc<<1)
#define rs ((loc<<1)|1)

const int mod1 = 1e9+7;
const int mod2 = 998244353;
const int inf_int = 0x7fffffff;
const int hf_int = 0x3f3f3f3f;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;

ll x1, p1, x2, p2;


void solve(cint T) {
    cin >> x1 >> p1 >> x2 >> p2;
    p1 -= p2;
    if(p1 > 10) cout << '>' << endl;
    else if(p1 < -10) cout << '<' << endl;
    else {
        if(p1 > 0) while(p1) { x1 *= 10; --p1; }
        if(p1 < 0) while(p1) { x2 *= 10; ++p1; }
        if(x1 < x2) cout << '<' << endl;
        else if(x1 == x2) cout << '=' << endl;
        else cout << '>' << endl;
    }
}

int main() {
    //freopen("1.in", "r", stdin);
    //cout.flags(ios::fixed); cout.precision(8);
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int T_=1;
    std::cin >> T_;
    for(int _T=1; _T<=T_; _T++)
        solve(_T);
    return 0;
}

B

贪心 , 取最小的作为除数

#include <bits/stdc++.h>
using namespace std;

std::mt19937 rng(std::random_device{}());
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef const int& cint;
typedef const ll& cll;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;

#define ls (loc<<1)
#define rs ((loc<<1)|1)

const int mod1 = 1e9+7;
const int mod2 = 998244353;
const int inf_int = 0x7fffffff;
const int hf_int = 0x3f3f3f3f;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;

int n;
int a[200100];

void solve(cint T) {
    cin >> n;
    for(int i=1; i<=n; i++) cin >> a[i];
    sort(a+1, a+1+n);
    for(int i=2; i<=n/2+1; i++) {
        cout << a[i] << ' ' << a[1] << endl;
    }
}

int main() {
    //freopen("1.in", "r", stdin);
    //cout.flags(ios::fixed); cout.precision(8);
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int T_=1;
    std::cin >> T_;
    for(int _T=1; _T<=T_; _T++)
        solve(_T);
    return 0;
}

C

裸的二分

#include <bits/stdc++.h>
using namespace std;

std::mt19937 rng(std::random_device{}());
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef const int& cint;
typedef const ll& cll;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;

#define ls (loc<<1)
#define rs ((loc<<1)|1)

const int mod1 = 1e9+7;
const int mod2 = 998244353;
const int inf_int = 0x7fffffff;
const int hf_int = 0x3f3f3f3f;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;

ll n, h;
ll a[101];

bool check(ll x) {
    ll rh = h;
    for(int i=2; i<=n; i++) {
        rh -= min(x, a[i]-a[i-1]);
    }
    rh -= x;
    return rh <= 0;
}

void solve(cint T) {
    cin >> n >> h;
    for(int i=1; i<=n; i++) cin >> a[i];
    ll l = 1, r = h, mid;
    while(l < r) {
        mid = l + (r-l)/2;
        if(check(mid)) r = mid;
        else l = mid + 1;
    }
    cout << r << endl;
}

int main() {
    //freopen("1.in", "r", stdin);
    //cout.flags(ios::fixed); cout.precision(8);
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int T_=1;
    std::cin >> T_;
    for(int _T=1; _T<=T_; _T++)
        solve(_T);
    return 0;
}

D

转移比较复杂的dp

考虑当前最大数是 x x x

如果 m e x = x − 1 mex=x-1 mex=x1 , 那么下一个可以选 x − 1 x-1 x1 x x x

如果 m e x = x + 1 mex=x+1 mex=x+1 , 那么下一个可以选 x + 2 x+2 x+2 x x x

所以可以设 d p [ 0 / 1 ] [ x ] dp[0/1][x] dp[0/1][x] 表示最大数为 x x x m e x = x − 1 / m e x = x + 1 mex=x-1/mex=x+1 mex=x1/mex=x+1 的情况数

答案就是所有的累加

#include <bits/stdc++.h>
using namespace std;

std::mt19937 rng(std::random_device{}());
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef const int& cint;
typedef const ll& cll;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;

#define ls (loc<<1)
#define rs ((loc<<1)|1)

const int mod1 = 1e9+7;
const int mod2 = 998244353;
const int inf_int = 0x7fffffff;
const int hf_int = 0x3f3f3f3f;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;

int n;
int a[500500];
ll dp[2][500500];

void solve(cint T) {
    cin >> n;
    for(int i=1; i<=n; i++) cin >> a[i];
    ll s = 0;
    dp[1][0] = 1;
    for(int i=1; i<=n; i++) {
        dp[0][a[i]] += dp[0][a[i]];
        if(a[i] == 0) ++ dp[0][0];
        if(a[i]) dp[1][a[i]] += dp[1][a[i]];
        dp[1][a[i]+2] += dp[1][a[i]+2];
        if(a[i] >= 1) dp[0][a[i]] += dp[0][a[i]-1];
        if(a[i] >= 2) dp[1][a[i]] += dp[0][a[i]-2];
        if(a[i] == 1) ++ dp[1][1];

        dp[1][a[i]] %= mod2;
        dp[1][a[i]+2] %= mod2;
        dp[1][a[i]] %= mod2;
        dp[0][a[i]] %= mod2;
    }
    ll ans = mod2 - dp[1][0];
    for(int i=0; i<=n; i++) ans = (ans + dp[0][i] + dp[1][i]) % mod2;
    for(int i=0; i<=n; i++) dp[0][i] = dp[1][i] = 0;
    cout << ans << endl;
}

int main() {
    //freopen("1.in", "r", stdin);
    //cout.flags(ios::fixed); cout.precision(8);
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int T_=1;
    std::cin >> T_;
    for(int _T=1; _T<=T_; _T++)
        solve(_T);
    return 0;
}

E

bfs

可以发现 , 如果一个点能到达 L , 当且仅当四周的不能到达 L 的点的个数(不计算墙)小于 2

所以将所有 L 扔进队列里跑 bfs , 每次将新的能到达的点四周的 free block 扔进队列

每个点至多进入 4 次队列

#include <bits/stdc++.h>
using namespace std;

std::mt19937 rng(std::random_device{}());
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef const int& cint;
typedef const ll& cll;
typedef pair<int, int> pii;
typedef pair<int, ll> pil;

#define ls (loc<<1)
#define rs ((loc<<1)|1)

const int mod1 = 1e9+7;
const int mod2 = 998244353;
const int inf_int = 0x7fffffff;
const int hf_int = 0x3f3f3f3f;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;

int n, m;
vector<char> s[1000100];

struct node {
    int x, y;
};

bool isfree(cint x, cint y) {
    if(x < 0 || x >= n || y < 0 || y >= m) return 0;
    return s[x][y] == '.';
}

bool check(cint x, cint y) {
    return (isfree(x-1, y) + isfree(x, y-1) + isfree(x+1, y) + isfree(x, y+1)) < 2;
}

void solve(cint T) {
    cin >> n >> m;
    char ss;
    queue<node> q;
    for(int i=0; i<n; i++) {
        s[i].clear();
        for(int j=0; j<m; j++) {
            cin >> ss;
            s[i].push_back(ss);
            if(ss == 'L') q.push({i, j});
        }
    }
    while(!q.empty()) {
        node k = q.front();
        q.pop();
        if(s[k.x][k.y] != 'L' && !check(k.x, k.y)) continue;
        if(s[k.x][k.y] != 'L') s[k.x][k.y] = '+';
        if(isfree(k.x-1, k.y)) q.push({k.x-1, k.y});
        if(isfree(k.x, k.y-1)) q.push({k.x, k.y-1});
        if(isfree(k.x+1, k.y)) q.push({k.x+1, k.y});
        if(isfree(k.x, k.y+1)) q.push({k.x, k.y+1});
    }
    for(int i=0; i<n; i++) {
        for(char r: s[i]) cout << r;
        cout << '\n';
    }
}

int main() {
    //freopen("1.in", "r", stdin);
    //cout.flags(ios::fixed); cout.precision(8);
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int T_=1;
    std::cin >> T_;
    for(int _T=1; _T<=T_; _T++)
        solve(_T);
    return 0;
}

F

不会

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值