Educational Codeforces Round 130 (Rated for Div. 2)

补题喽!!!

传送门

A. Parkway Walk

Solution
没啥好说的,题目都是晃人的,最终都是要花费的。
Code

void solve()
{
    int sum = 0, x;
    cin >> n >> m;
    for(int i = 1; i <= n; ++i) cin >> x, sum += x;
    cout << max(sum - m, 0ll) << "\n";
}

B. Promo

Solution
非常基础的前缀和查询题。
Code

int n, q, a[N], s[N];
void solve()
{
    cin >> n >> q;
    for(int i = 1; i <= n; ++i) cin >> a[i];
    sort(a + 1, a + 1 + n, greater<int>());
    for(int i = 1; i <= n; ++i) s[i] = s[i - 1] + a[i];
    while(q--)
    {
        int r, l;
        cin >> r >> l;
        cout << s[r] - s[r - l] << "\n";
    }
}

C. awoo's Favorite Problem

Solution
总结来看,b作为a和c移动的跳板,没有任何影响。我们首先看a、c的数量是否相同,相同则可以继续往下做,不同我们就看a、c的相对位置是否满足相对关系,因为a只能往后走,c只能往前走,所以第一个字符串a的位置与第二个字符串a的位置,对应都是<=的位置关系,c同理。判断即可。
Code

int n;
string s, t;
void solve()
{
    cin >> n >> s >> t;
    string s1 = "", s2 = "";
    for(int i = 0; i < n; ++i)
    {
        if(s[i] != 'b') s1 += s[i];
        if(t[i] != 'b') s2 += t[i];
    }
    if(s1 != s2)
    {
        cout << "NO\n";
        return;
    }
    vector<int> c1, c2;
    for(int i = 0; i < n; ++i)
    {
        if(s[i] == 'c') c1.push_back(i);
        if(t[i] == 'c') c2.push_back(i);
    }
    for(int i = 0; i < c1.size(); ++i)
    {
        if(c1[i] < c2[i])
        {
            cout << "NO\n";
            return;
        }
    }
    vector<int> a1, a2;
    for(int i = 0; i < n; ++i)
    {
        if(s[i] == 'a') a1.push_back(i);
        if(t[i] == 'a') a2.push_back(i);
    }
    for(int i = 0; i < a1.size(); ++i)
    {
        if(a1[i] > a2[i])
        {
            cout << "NO\n";
            return;
        }
    }
    cout << "YES\n";
}

D. Guess The String

Solution

记录每次新出现字符的位置,如果没有出现,说明查询1-i数量相等,二分寻找该字符。

Code

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 100;
char ask1(int i)
{
    cout << "? 1 " << i << endl;
    char t;
    cin >> t;
    return t;
}
int ask2(int l, int r)
{
    cout << "? 2 " << l << " " << r << endl;
    int t;
    cin >> t;
    return t;
}
int n;
char ans[N], sum;
signed main()
{
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    vector<int> v;
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        int t = ask2(1, i);
        if(t > sum)
        {
            ans[i] = ask1(i);
            v.push_back(i);
        }
        else
        {
            int l = 0, r = v.size() - 1;
            while(l < r)
            {
                int mid = (l + r + 1) >> 1;
                int t = ask2(v[mid], i);
                if(t != v.size() - mid + 1) l = mid;
                else r = mid - 1;
            }
            ans[i] = ans[v[l]];
            v[l] = i;
            sort(v.begin(), v.end());
        }
        sum = t;
    }
    cout << "! ";
    for(int i = 1; i <= n; ++i) cout << ans[i];
    return 0;
}
posted @ 2022-06-28 09:31  std&ice  阅读(92)  评论(0)    收藏  举报