Educational Codeforces Round 118 (Rated for Div. 2)

Educational Codeforces Round 118 (Rated for Div. 2)

A

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

#include 
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 
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 
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 
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 
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

不会

你可能感兴趣的:(Codeforces,c++,visual,studio,算法)