Codeforces Round #756 (Div. 3) Разбор
Difference between ru1 and ru2, changed 2 character(s)

[problem:1611A]↵

Идея: [user:MisterGu,2021-11-26]↵

<spoiler summary="Разбор">↵
[tutorial:1611A]↵
</spoiler>↵

<spoiler summary="Решение">↵
~~~~~↵
#include<bits/stdc++.h>↵
 ↵
using namespace std;↵
 ↵
int main() {↵
    int t;↵
    cin >> t;↵
    while(t--) {↵
        string n;↵
        cin >> n;↵
        if((n.back() - '0') % 2 == 0) {↵
            cout << "0\n";↵
            continue;↵
        }↵
        if((n[0] - '0') % 2 == 0) {↵
            cout << "1\n";↵
            continue;↵
        }↵
        int count_2 = count(n.begin(), n.end(), '2');↵
        int count_4 = count(n.begin(), n.end(), '4');↵
        int count_6 = count(n.begin(), n.end(), '6');↵
        int count_8 = count(n.begin(), n.end(), '8');↵
        if(count_2 > 0 || count_4 > 0 || count_6 > 0 || count_8 > 0) {↵
            cout << "2\n";↵
            continue;↵
        }↵
        cout << "-1\n";↵
    }↵
    return 0;↵
}↵
~~~~~↵
</spoiler>↵

[problem:1611B]↵

Идея: [user:MikeMirzayanov,2021-11-26]↵

<spoiler summary="Разбор">↵
[tutorial:1611B]↵
</spoiler>↵

<spoiler summary="Решение">↵
~~~~~↵
#include <bits/stdc++.h>↵
 ↵
using namespace std;↵
using ll = long long;↵
 ↵
void solve() {↵
    ll a, b;↵
    cin >> a >> b;↵
    cout << min(min(a, b), (a + b) / 4) << '\n';↵
}↵
 ↵
int main() {↵
    int t;↵
    cin >> t;↵
    for (int i = 0; i < t; ++i) {↵
        solve();↵
    }↵
    return 0;↵
}↵
~~~~~↵
</spoiler>↵

[problem:1611C]↵

Идея: [user:MikeMirzayanov,2021-11-26]↵

<spoiler summary="Разбор">↵
[tutorial:1611C]↵
</spoiler>↵

<spoiler summary="Решение">↵
~~~~~↵
#include <bits/stdc++.h>↵
 ↵
using namespace std;↵
 ↵
#define forn(i, n) for (int i = 0; i < int(n); i++)↵
 ↵
int main() {↵
    int t;↵
    cin >> t;↵
    forn(tt, t) {↵
        int n;↵
        cin >> n;↵
        vector<int> a(n);↵
        forn(i, n)↵
            cin >> a[i];↵
        if (a[0] != n && a[n - 1] != n)↵
            cout << -1 << endl;↵
        else {↵
            for (int i = n - 1; i >= 0; i--)↵
                cout << a[i] << " ";↵
            cout << endl;↵
        }↵
    }↵
}↵
~~~~~↵
</spoiler>↵

[problem:1611D]↵

Идея: [user:MikeMirzayanov,2021-11-26]↵

<spoiler summary="Разбор">↵
[tutorial:1611D]↵
</spoiler>↵

<spoiler summary="Решение">↵
~~~~~↵
#include <bits/stdc++.h>↵
 ↵
using namespace std;↵
 ↵
void solve(){↵
    int n;↵
    cin >> n;↵
    vector<int> b(n + 1), p(n + 1), dist(n + 1, -1);↵
 ↵
    for(int i = 1; i <= n; i++)↵
        cin >> b[i];↵
    for(int i = 1; i <= n; i++)↵
        cin >> p[i];↵
 ↵
    if (b[p[1]] != p[1]){↵
        cout << -1 << '\n';↵
        return;↵
    }↵
 ↵
    dist[p[1]] = 0;↵
    for(int i = 2; i <= n; i++){↵
        if(dist[b[p[i]]] == -1){↵
            cout << -1 << '\n';↵
            return;↵
        }↵
        dist[p[i]] = dist[p[i - 1]] + 1;↵
    }↵
 ↵
    for(int i = 1; i <= n; i++) {↵
        cout << dist[i] - dist[b[i]] << ' ';↵
    }↵
    cout << '\n';↵
}↵
 ↵
int main() {↵
    int t;↵
    cin >> t;↵
    while(t-- > 0) {↵
        solve();↵
    }↵
}↵
~~~~~↵
</spoiler>↵

[problem:1611E1]↵

Идея: [user:Vladosiya,2021-11-26]↵

<spoiler summary="Разбор">↵
[tutorial:1611E1]↵
</spoiler>↵

<spoiler summary="Решение">↵
~~~~~↵
//↵
// Created by Vlad on 16.11.2021.↵
//↵
 ↵
#include <bits/stdc++.h>↵
 ↵
#define int long long↵
#define mp make_pair↵
#define x first↵
#define y second↵
#define all(a) (a).begin(), (a).end()↵
#define rall(a) (a).rbegin(), (a).rend()↵
 ↵
typedef long double ld;↵
typedef long long ll;↵
 ↵
using namespace std;↵
 ↵
mt19937 rnd(143);↵
 ↵
const int inf = 1e10;↵
const int M = 998244353;↵
const ld pi = atan2(0, -1);↵
const ld eps = 1e-4;↵
 ↵
void solve() {↵
    int n, k;↵
    cin >> n >> k;↵
    vector<int> color(n, -1);↵
    deque<int> q;↵
    for(int i = 0; i < k; ++i){↵
        int x;↵
        cin >> x;↵
        color[--x] = 0;↵
        q.push_back(x);↵
    }↵
    color[0] = 1;↵
    q.push_back(0);↵
    vector<vector<int>> g(n);↵
    for(int i = 0; i < n - 1; ++i){↵
        int u, v;↵
        cin >> u >> v;↵
        g[--u].push_back(--v);↵
        g[v].push_back(u);↵
    }↵
    while(!q.empty()){↵
        int v = q.front();↵
        q.pop_front();↵
        for(int u: g[v]){↵
            if(color[u] == -1){↵
                color[u] = color[v];↵
                q.push_back(u);↵
            }↵
        }↵
    }↵
    for(int v = 1; v < n; ++v){↵
        if(g[v].size() == 1 && color[v] == 1){↵
            cout << "YES";↵
            return;↵
        }↵
    }↵
    cout << "NO";↵
}↵
 ↵
bool multi = true;↵
 ↵
signed main() {↵
    int t = 1;↵
    if (multi) {↵
        cin >> t;↵
    }↵
    for (; t != 0; --t) {↵
        solve();↵
        cout << "\n";↵
    }↵
    return 0;↵
}↵
~~~~~↵
</spoiler>↵

[problem:1611E2]↵

Идея: [user:Vladosiya,2021-11-26]↵

<spoiler summary="Разбор">↵
[tutorial:1611E2]↵
</spoiler>↵

<spoiler summary="Решение">↵
~~~~~↵
#include <bits/stdc++.h>↵
 ↵
#define int long long↵
#define mp make_pair↵
#define x first↵
#define y second↵
#define all(a) (a).begin(), (a).end()↵
#define rall(a) (a).rbegin(), (a).rend()↵
 ↵
/*#pragma GCC optimize("Ofast")↵
#pragma GCC optimize("no-stack-protector")↵
#pragma GCC optimize("unroll-loops")↵
#pragma GCC target("sse,sse2,sse3,ssse3,popcnt,abm,mmx,tune=native")↵
#pragma GCC optimize("fast-math")↵
*/↵
typedef long double ld;↵
typedef long long ll;↵
 ↵
using namespace std;↵
 ↵
mt19937 rnd(143);↵
 ↵
const int inf = 1e10;↵
const int M = 998244353;↵
const ld pi = atan2(0, -1);↵
const ld eps = 1e-4;↵
 ↵
vector<vector<int>> sl;↵
vector<int> nearest;↵
 ↵
int count(int v, int dist, int p = -1){↵
    bool children = true;↵
    int s = 0;↵
    for(int u: sl[v]){↵
        if(u == p) continue;↵
        int c = count(u, dist + 1, v);↵
        if(c < 0) children = false;↵
        nearest[v] = min(nearest[v], nearest[u] + 1);↵
        s += c;↵
    }↵
    if(nearest[v] <= dist) return 1;↵
    if(s == 0 || !children) return -1;↵
    return s;↵
}↵
 ↵
void solve() {↵
    int n, k;↵
    cin >> n >> k;↵
    sl.assign(n, vector<int>(0));↵
    nearest.assign(n, n);↵
    for(int i = 0; i < k; ++i){↵
        int x;↵
        cin >> x;↵
        --x;↵
        nearest[x] = 0;↵
    }↵
    for(int i = 1; i  < n; ++i){↵
        int u, v;↵
        cin >> u >> v;↵
        --u, --v;↵
        sl[u].emplace_back(v);↵
        sl[v].emplace_back(u);↵
    }↵
    cout << count(0, 0);↵
}↵
 ↵
bool multi = true;↵
 ↵
signed main() {↵
    //freopen("in.txt", "r", stdin);↵
    //freopen("in.txt", "w", stdout);↵
    /*ios_base::sync_with_stdio(false);↵
    cin.tie(nullptr);↵
    cout.tie(nullptr);*/↵
    int t = 1;↵
    if (multi) {↵
        cin >> t;↵
    }↵
    for (; t != 0; --t) {↵
        solve();↵
        cout << "\n";↵
    }↵
    return 0;↵
}↵
~~~~~↵
</spoiler>↵

[problem:1611F]↵

Идея: [user:Gol_D,2021-11-26], [user:MikeMirzayanov,2021-11-26]↵

<spoiler summary="Разбор">↵
[tutorial:1611F]↵
</spoiler>↵

<spoiler summary="Решение">↵
~~~~~↵
#include <bits/stdc++.h>↵

using namespace std;↵

typedef long long ll;↵

#define forn(i, n) for (int i = 0; i < int(n); i++)↵

vector<ll> t, a;↵
ll s, tl;↵

const ll MAX = 1'000'000'000'000'000LL;↵

void build(int v, int l, int r) {↵
if (l == r)↵
t[v] = a[l];↵
else {↵
int m = (l + r) / 2;↵
build (v * 2, l, m);↵
build (v * 2 + 1, m + 1, r);↵
t[v] = min(t[v * 2], t[v * 2 + 1]);↵
}↵
}↵

void update(int v, int l, int r) {↵
if (l == r)↵
t[v] = MAX;↵
else {↵
int m = (l + r) / 2;↵
if (tl <= m)↵
update(v * 2, l, m);↵
else↵
update(v * 2 + 1, m + 1, r);↵
t[v] = min(t[v * 2], t[v * 2 + 1]);↵
}↵
}↵

int lower_bound_s(int v, int l, int r) {↵
if (r < tl || (l == r && s < -t[v])) {↵
return -1;↵
}↵
    if (l == r || -t[v] <= s) {↵
        return r;↵
    }↵
int m = (l + r) / 2;↵

if (m < tl) {↵
        return lower_bound_s(2 * v + 1, m + 1, r);↵
}↵
if (s < -t[2 * v]) {↵
        return lower_bound_s(2 * v, l, m);↵
}↵
int res = lower_bound_s(2 * v + 1, m + 1, r);↵
return (res == -1) ? m : res;↵
}↵


int main() {↵
    int tests;↵
    cin >> tests;↵
    forn(tt, tests) {↵
        int n;↵
        cin >> n >> s;↵
        t = vector<ll>(4 * n);↵
        a = vector<ll>(n);↵
        forn(i, n) {↵
            cin >> a[i];↵
        }↵
        for (int i = 1; i < n; ++i) {↵
            a[i] += a[i - 1];↵
        }↵
        build(1, 0, n - 1);↵
        int first = -1, second = -2;↵
        for (tl = 0; tl < n; ++tl) {↵
            int v = lower_bound_s(1, 0, n - 1);↵
            if (v != -1 && v - tl > second - first) {↵
                first = tl + 1;↵
                second = v + 1;↵
            }↵
            s -= a[tl];↵
            if (tl != 0) s += a[tl - 1];↵
            update(1, 0, n - 1);↵
        }↵
        if (first == -1) {↵
            cout << -1;↵
        } else {↵
            cout << first << " " << second;↵
        }↵
        cout << endl;↵
    }↵
}↵
~~~~~↵
</spoiler>↵

[problem:1611G]↵

Идея: [user:MikeMirzayanov,2021-11-26]↵

<spoiler summary="Разбор">↵
[tutorial:1611G]↵
</spoiler>↵

<spoiler summary="Решение">↵
~~~~~↵
#include <bits/stdc++.h>↵
 ↵
using namespace std;↵
 ↵
#define forn(i, n) for (int i = 0; i < int(n); i++)↵
#define sz(v) (int)v.size()↵
 ↵
const int N = 1e6 + 50;↵
string a[N];↵
 ↵
int n,m;↵
int ans;↵
 ↵
void solve(int sum0) {↵
    vector<int> v;↵
    for (int sum = sum0, ad = 0, pref = 0; sum < n + m; sum += 2, ad++) {↵
        vector<int> cur;↵
        int li = max(0, sum - m + 1), ri = min(n - 1, sum);↵
        if (li > ri) continue;↵
 ↵
        for (int i = li; i <= ri; i++) {↵
            int j = sum - i;↵
 ↵
            if (a[i][j] == '1')↵
                cur.emplace_back(i);↵
        }↵
 ↵
        while (pref != sz(v) && v[pref] + ad > ri) {↵
            pref++;↵
        }↵
        for (int i = pref; i < sz(v); i++) {↵
            int new_val = v[i];↵
            while (!cur.empty() && cur.back() - ad >= v[i]) {↵
                new_val = max(new_val, cur.back() - ad);↵
                cur.pop_back();↵
            }↵
            v[i] = new_val;↵
        }↵
        if (!cur.empty()) {↵
            v.emplace_back(cur.back() - ad);↵
            ans++;↵
        }↵
    }↵
}↵
 ↵
int main() {↵
    int t;↵
    cin >> t;↵
 ↵
    forn(tt, t) {↵
        cin >> n >> m;↵
 ↵
        forn(i, n) {↵
            string s; ↵
            cin >> a[i];↵
        }↵
 ↵
        ans = 0;↵
        solve(0);↵
        solve(1);↵
        ↵
        cout << ans << '\n';↵
    }↵
}↵
~~~~~↵
</spoiler>↵

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en3 English Gol_D 2021-11-26 23:41:43 2 Tiny change: '\n[problem:1' -> '[problem:1' (published)
ru2 Russian Gol_D 2021-11-26 23:35:57 2 Мелкая правка: '\n[problem:1' -> '[problem:1' (опубликовано)
ru1 Russian Gol_D 2021-11-26 23:34:41 10435 Первая редакция перевода на Русский (сохранено в черновиках)
en2 English Gol_D 2021-11-26 22:56:33 70
en1 English Gol_D 2021-11-26 22:53:37 10490 Initial revision (saved to drafts)