Codeforces Round #627 (Div. 3) 題解

Codeforces Round #627 (Div. 3)

A. Yet Another Tetris Problem

題意:給你一堆俄羅斯方塊,詢問在只有 \(1\times 2\) 的方塊狀況下可否消除全部方塊。c++

分析:看懂題目比作題還麻煩。數組

#define _CRT_SECURE_NO_WARNINGS
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma comment(linker, "/stack:200000000")
#include <bits/stdc++.h>
#define SIZE 200010
#define rep(i, a, b) for (int i = a; i <= b; ++i)
#define mp make_pair
#define ll long long
using namespace std;
void io() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); }
int n, t, a[SIZE];

int main() {
    io(); cin >> t;
    rep(ii, 1, t) {
        cin >> n;
        rep(i, 1, n) cin >> a[i];
        bool f = true;
        rep(i, 2, n) {
            if ((a[i] - a[i - 1]) & 1) {
                f = false;
                break;
            }
        }
        cout << (f ? "YES\n" : "NO\n");
    }
}

B. Yet Another Palindrome Problem

題意:詢問是否存在長度大於等於三的迴文子串(不連續)。spa

分析:因爲不連續的條件,咱們只須要找是否存在非相鄰的相同字符便可。code

#define _CRT_SECURE_NO_WARNINGS
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma comment(linker, "/stack:200000000")
#include <bits/stdc++.h>
#define SIZE 200010
#define rep(i, a, b) for (int i = a; i <= b; ++i)
#define mp make_pair
#define ll long long
using namespace std;
void io() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); }
int n, t, a[SIZE];

int main() {
    io(); cin >> t;
    rep(ii, 1, t) {
        cin >> n;
        map<int, vector<int> > MP;
        bool f = false;
        rep(i, 1, n) cin >> a[i], MP[a[i]].emplace_back(i);
        for (auto i : MP) {
            if (i.second.size() > 2) {
                f = true;
                break;
            }
            if (i.second.size() == 2 && abs(i.second[0] - i.second[1]) > 1) {
                f = true;
                break;
            }
        }
        cout << (f ? "YES\n" : "NO\n");
    }
}

C. Frog Jumps

題意:給定一個字符串 \(s\) 。 一隻青蛙在 \(x=0\) 處,一次最大跳躍距離爲 \(d\) ,當它跳到位置 \(x=i\) 時,若是 \(s[i]=R\) 那它能繼續向右跳,若 \(s[i]=L\) 那它只能向左跳,詢問使得青蛙可以跳到 \(x=n+1\) 位置的 \(d_{min}\)ci

分析:貪心,求兩個字符 \(R\) 之間的最大距離。字符串

#define _CRT_SECURE_NO_WARNINGS
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma comment(linker, "/stack:200000000")
#include <bits/stdc++.h>
#define SIZE 200010
#define rep(i, a, b) for (int i = a; i <= b; ++i)
#define mp make_pair
#define ll long long
using namespace std;
void io() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); }
int n, t, a[SIZE];

int main() {
    io(); cin >> t;
    rep(ii, 1, t) {
        string s; cin >> s;
        s += 'R';
        int pre = 0, mind = -1;
        rep(i, 1, s.length()) {
            if (s[i - 1] == 'R') {
                mind = max(mind, i - pre);
                pre = i;
            }
        }
        cout << (mind == -1 ? (s.length() + 1) : mind) << '\n';
    }
}

D. Pair of Topics

題意:給定兩個數組 \(a\)\(b\) ,詢問知足 \(a_i+a_j>b_i+b_j(i<j)\) 的二元組 \((i,j)\) 數量。get

分析:明顯的二分:\(a_i+a_j>b_i+b_j\Leftrightarrow a_i-b_i>-(a_j-b_j)\) 。因而只須要預處理一個數組 \(c_i=a_i-b_i\)string

#define _CRT_SECURE_NO_WARNINGS
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma comment(linker, "/stack:200000000")
#include <bits/stdc++.h>
#define SIZE 200010
#define rep(i, a, b) for (int i = a; i <= b; ++i)
#define mp make_pair
#define ll long long
using namespace std;
void io() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); }
ll n, a[SIZE], b[SIZE],ans;
vector<ll> vec;
 
int main() {
    io(); cin >> n;
    rep(i, 1, n) cin >> a[i];
    rep(i, 1, n) cin >> b[i];
    rep(i, 1, n) vec.emplace_back(a[i] - b[i]);
    sort(vec.begin(), vec.end());
    rep(i, 0, (vec.size() - 1)) {
        int now = vec[i];
        if (now > 0) ans += (n - 1 - i);
        else {
            int pos = lower_bound(vec.begin(), vec.end(), 1 - now) - vec.begin();
            ans += max(0ll, (n - pos));
        }
    }
    cout << ans;
}

E. Sleeping Schedule

題意\(Vova\) 一共要睡覺 \(n\) 次,每次都會睡滿一成天,天天時長 \(h\) 個小時,若是 \(Vova\) 的入睡時間在 \([l,r]\) 範圍內則之稱爲一次好的睡眠。如今已知 \(Vova\)\(i\) 次睡眠前,她能控制本身醒着 \(a_i\) 或者 \(a_i - 1\) 個小時。求好的睡眠最大值。it

分析:注意到 \(n,h\leq 2000\) ,直接枚舉時間進行 \(dp\) 。設第 \(i\) 次睡眠 \(j\) 時段的最大值爲 \(dp[i][j]\) ,則有: \(dp[i][(j+t)modh] = max(dp[i][(j+t)modh],dp[i-1][j]+(l\leq (j+t)modh\leq r))\)\((t=a_i\) \(or\) \(a_i-1)\) 。emmm,好像就結束了。

#define _CRT_SECURE_NO_WARNINGS
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma comment(linker, "/stack:200000000")
#include <bits/stdc++.h>
#define SIZE 2010
#define rep(i, a, b) for (int i = a; i <= b; ++i)
#define mp make_pair
#define ll long long
using namespace std;
void io() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); }
int n, h, l, r, ans = -1;
int a[SIZE], dp[SIZE][SIZE];

int main() {
    io(); cin >> n >> h >> l >> r;
    rep(i, 1, n) cin >> a[i];
    rep(i, 0, 2000) rep(j, 0, 2000) dp[i][j] = -1;
    dp[0][0] = 0;
    rep(i, 1, n) {
        i = i;
        rep(j, 0, (h - 1)) dp[i][j] = -1;
        rep(j, 0, (h - 1)) {
            if (dp[i - 1][j] == -1) continue;
            rep(t, (a[i] - 1), a[i]) {
                int k = (j + t) % h;
                dp[i][k] = max(dp[i][k], dp[i - 1][j] + (l <= k && k <= r));
            }
        }
    }
    rep(i, 0, h) ans = max(ans, dp[n][i]);
    cout << ans;
}

F. Maximum White Subtree

題意:給定一棵無根樹,每一個節點都染色爲白色或黑色,對每一個節點詢問:包含當前節點的任意子樹中(由於是無根樹,實際上就是連通塊) \(cnt_w-cnt_b\) 的最大值,即白色點數減黑色點數的最大值。

分析:標準的換根樹形 \(dp\) ,咱們任取一點做爲根,此時對於任意節點咱們可以簡單地推出如下遞推式: \(dp_{now}=\underset{i\in children(now)}\sum{max(0,dp[i])}\) 。而後考慮換根,咱們考慮交換 \(now\) 節點和他的一個子節點 \(to\) 以後會發生什麼變化:顯然這個交換隻會影響 \(now\)\(to\) 這兩個節點,其餘節點任然做爲子節點不受影響。獲得第二組樹形 \(dp\) 轉移式:\(dp_{now}=dp_{now}-max(0,dp[to])\)\(dp_{to}=dp_{to}+max(0,dp_{now})\)

#define _CRT_SECURE_NO_WARNINGS
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma comment(linker, "/stack:200000000")
#include <bits/stdc++.h>
#define SIZE 200010
#define rep(i, a, b) for (int i = a; i <= b; ++i)
#define mp make_pair
#define ll long long
using namespace std;
void io() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); }
int n;
int a[SIZE], dp[SIZE], ans[SIZE];
vector<int> vec[SIZE];

void dfs(int now, int pa) {
    dp[now] = a[now];
    for (auto i : vec[now]) {
        if (i == pa) continue;
        dfs(i, now);
        dp[now] += max(0, dp[i]);
    }
}

void dfs2(int now, int pa) {
    ans[now] = dp[now];
    for (auto i : vec[now]) {
        if (i == pa) continue;
        dp[now] -= max(0, dp[i]);
        dp[i] += max(0, dp[now]);
        dfs2(i, now);
        dp[i] -= max(0, dp[now]);
        dp[now] += max(0, dp[i]);
    }
}

int main() {
    io(); cin >> n;
    rep(i, 1, n) {
        int x; cin >> x;
        a[i] = (x ? 1 : -1);
    }
    rep(i, 1, (n - 1)) {
        int x, y; cin >> x >> y;
        vec[x].emplace_back(y);
        vec[y].emplace_back(x);
    }
    dfs(1, 0);
    dfs2(1, 0);
    rep(i, 1, n) cout << ans[i] << ' ';
}

這場 \(div3\) 好像特別簡單。。。

相關文章
相關標籤/搜索