Movatterモバイル変換


[0]ホーム

URL:


CtrlK
On this page

Educational Codeforces Round 53 (Rated for Div. 2)

Educational Codeforces Round 53 (Rated for Div. 2)

A. Diverse Substring

当一个长度为 n 的字符串之中没有字符大于 n/2,证明这是一个 Diverse Substring。

Intuition

其实只用找到一个长度为 2,两个字符不相同的字串就好了。

Solution

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<vector>#include<stack>#include<bitset>#include<cstdlib>#include<cmath>#include<set>#include<list>#include<deque>#include<map>#include<queue>#include<unordered_map>#include<unordered_set>usingnamespace std;typedeflonglong ll;constint INF=0x7fffffff;constdouble eps=1e-8;intmain(int argc,constchar*argv[]){freopen("input.in","r", stdin);int n;    string s;    cin>> n>> s;for (int i=1; i< n; i++) {if (s[0]!=s[i])        {            cout<<"YES\n"<<s[0]<<s[i]<< endl;return0;        }    }    cout<<"NO"<< endl;return0;}

B. Vasya and Books

标号为 1~n 的书被放到栈 a 里,要求按 b 序列的方式取出,求每个操作取多少书。

Intuition

直接模拟就好了

Solution

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<vector>#include<stack>#include<bitset>#include<cstdlib>#include<cmath>#include<set>#include<list>#include<deque>#include<map>#include<queue>#include<unordered_map>#include<unordered_set>using namespace std;typedef long long ll;const int INF = 0x7fffffff;const double eps = 1e-8;int main(int argc, const char *argv[]){    freopen("input.in", "r", stdin);    int n;    cin >> n;    vector<int> a(n);    vector<int> b(n);    for (int i = 0; i < n; i++) {        cin >> a[i];    }    for (int i = 0; i < n; i++) {        cin >> b[i];    }    vector<int> find(n + 1, 0);    int now = 0;    for (int i = 0; i < n; i++) {        if (find[b[i]] == 1) {            cout << "0" << " ";        }        else {            int count = 0;            while (now < n && !find[b[i]]) {                count++;                find[a[now++]] = 1;            }            cout << count << " ";        }    }    cout << endl;    return 0;}

C. Vasya and Robot

一个机器人从 (0, 0) 移动到 (x, y)。求怎么修正原始的移动序列(长度为 n),使得最后一个修改的下标减去最前一个修改的下标让值最小。

Intuition

设结果应该为修改 [l, r] 之间的序列,所以要求出 [0, l) + (r, n] 移动序列之后的位置和 (x, y) 之间的“距离”,验证是否能通过修改 r - l + 1 步,让其到 (x, y)。

可以通过 pre-sum 的方式存储状态,存储 x 轴的状态到 sx,存储 y 轴的状态到 sy。

Solution

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<vector>#include<stack>#include<bitset>#include<cstdlib>#include<cmath>#include<set>#include<list>#include<deque>#include<map>#include<queue>#include<unordered_map>#include<unordered_set>using namespace std;typedef long long ll;const int INF = 0x7fffffff;const double eps = 1e-8;int x, y, n;char s[200005];int sx[200005], sy[200005];int main(int argc, const char *argv[]){    freopen("input.in", "r", stdin);    scanf("%d%s%d%d", &n, s + 1, &x, &y);    if (abs(x) + abs(y) > n || (n + x + y) & 1) {        cout << -1 << endl;        return 0;    }    for (int i = 1; i <= n; i++) {sx[i] = sx[i - 1];sy[i] = sy[i - 1];        if (s[i] == 'R') {            sx[i]++;        }        else if (s[i] == 'L') {            sx[i]--;        }        else if (s[i] == 'U') {            sy[i]++;        }        else {            sy[i]--;        }    }    int res = 2e5;    for (int i = 0, j = 0; i <= n; i++) {        while (j <= n && abs(sx[i] + sx[n] - sx[j] - x) + abs(sy[i] + sy[n] - sy[j] - y) > j - i)            j++;        if (j <= n)res = min(res, j - i);else break;    }cout << res << endl;    return 0;}

D. Berland Fair

去环形集市买东西,看到可以买就直接付钱去下一个,直到没钱为止。求消费的次数。

Intuition

求出一次环形逛集市消耗了多少,然后取余减少重复的次数。

Solution

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<vector>#include<stack>#include<bitset>#include<cstdlib>#include<cmath>#include<set>#include<list>#include<deque>#include<map>#include<queue>#include<unordered_map>#include<unordered_set>using namespace std;typedef long long ll;const int INF = 0x7fffffff;const double eps = 1e-8;int n;ll T;const int MAXN = 2e5 + 5;int a[MAXN];int main(int argc, const char *argv[]){    // freopen("input.in", "r", stdin);    cin >> n >> T;    for (int i = 1; i <= n; i++) {        scanf("%d", &a[i]);    }    ll res = 0;    while (true)    {        ll t = 0, m = 0;        for (int i = 1; i <= n; i++) {            if (T >= t + a[i]) {                t += a[i];                m++;            }        }        if (!m) break;        res += T / t * m;        T %= t;    }    cout << res << endl;    return 0;}

Last updated

Was this helpful?


[8]ページ先頭

©2009-2025 Movatter.jp