Codeforces Round 994 (Div. 2) (D-F)

answer page
还有好多没补,但是既然赛时写出了e就应该去补f,不进则退
这场没开排行榜埋头苦写第一次赛时出e了,也是第一次500名,可喜可贺//(虽然d不会)

D

想了一个n4做法,状态设计为\(f[i][pos][j][k]\), 表示第i行必须选第pos个数且当前在位置j且当前行选k个,发现前缀和优化可以从\(min(f[i - 1][x][j - k][x])\) 转移来(x为可忽略项)
思考能否忽略k。发现可行,状态设计变为必须选择pos在j位置,转移变为从\(f[i - 1][x][j - 1]\ or\ f[i][pos - 1][j - 1]\) 转过来, 复杂度对了

#include <bits/stdc++.h>

using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using u128 = unsigned __int128;
constexpr int N = 2e2 + 10;
constexpr i64 inf = 1e18;

#define lowbit(x) (x & (-x))
#define pii pair<int, int>
#define mkp make_pair
#define vi std::vector<i64>
i64 n, k, m;
bool flg[N];

void solve()
{
    std::cin >> n >> m >> k;
    std::vector<vi> a(n + 1, vi(m + 1)), g(n + 1, vi(m + 1));
    vi f(m + 1, inf);
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            std:: cin >>a[i][j];
    f[1] = 0; // pre
    for (int i = 1; i <= n; i++) {
        vi tmp(m + 1, inf);
        for (int sf = 0; sf < m; sf++) {
            vi nw(m + 1, inf); 
            for (int j = 1; j <= m; j++) {
                int _a = a[i][(sf + j - 1) % m + 1];
                nw[j] = std::min(nw[j - 1], f[j] + 1ll * sf * k) + _a;
                tmp[j] = std::min(tmp[j], nw[j]);
            }
        }
        f = tmp;
    }
    std::cout << f[m] << '\n';
}
signed main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int T = 1;
    std::cin >> T;
    while (T--) {
        solve();
    }
    return 0;
}

E

#include <bits/stdc++.h>
using namespace std;
const int N = 2e2 + 10;
#define lowbit(x) (x & (-x))
// #define endl '\n'
#define int long long
#define pii pair<int, int>
#define mkp make_pair
#define LL long long
int n, k, m, mu[N], p[N], tot, C[N], w[N], a[N];
bool flg[N];
int que(int l, int  r) {
    cout << "? " << l << ' ' << r << endl;
    int x; cin >> x;
    return x;
}
void solve()
{
    cin >> n;
    int l = 1, r = n, mid = (l + r) / 2;
    int ql = que(l, mid), qr;
    int q1 = ql; // 1 zuo
    if (ql) r = mid;
    else l = mid + 1;
    mid = (l + r) / 2;
    ql = que(l, mid), qr = que(mid + 1, r);
    // mid < n / 2
    if (ql == qr) {
        qr = l;
        if (ql) r = mid;
        else l = mid + 1;
        mid = (l + r) / 2;
        while(l < r) {
            ql = que(qr, mid);
            if (ql) r = mid;
            else l = mid + 1;
            mid = (l + r) / 2;
        }
        cout << "! "<< mid - qr + 1 << endl;
    }
    else {
        if (q1) {
            l = n / 2 + 1, r = n, mid = (l + r) / 2;
            while(l < r) {
                ql = que(1, mid);
                if (ql) l = mid + 1;
                else r = mid;
                mid = (l + r) / 2;
            }
            cout <<"! "<< mid << endl;
        }
        else {
            l = 1, r = n / 2, mid = (l + r + 1) / 2;
            while(l < r) {
                ql = que(mid, n);
                if (ql) r = mid - 1;
                else l = mid;
                mid = (l + r + 1) / 2;
            }
            cout << "! "<<n - mid + 1 << endl;
        }
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T = 1;
    cin >> T;
    while (T--) {
        solve();
    }
    return 0;
}

F

posted @ 2024-12-21 14:40  lyrrr  阅读(38)  评论(0)    收藏  举报