AtCoder Beginner Contest 165

AtCoder Beginner Contest 165

https://atcoder.jp/contests/abc165

C - Many Requirements

dfs

#include <bits/stdc++.h>

using namespace std;
const int N = 15, M = 55;
int n, m, q, ans;
int a[M], b[M], c[M], d[M], A[N];

void dfs (int x) {
    if (x > n) {
        int sum = 0;
        for (int i = 1; i <= q; i++) {
            if (A[b[i]] - A[a[i]] == c[i])  sum += d[i];
        }
        ans = max (ans, sum);
        return ;
    }

    for (int i = A[x - 1]; i <= m; i++) {
        A[x] = i;
        dfs (x + 1);
        A[x] = 0;
    }
}

int main () {
    cin >> n >> m >> q;
    for (int i = 1; i <= q; i++)    cin >> a[i] >> b[i] >> c[i] >> d[i];
    A[0] = 1;
    dfs (1);
    cout << ans << endl;
}

D - Floor Function

推导:

#include<bits/stdc++.h>

using namespace std;

int main () {
    long long a, b, n;
    cin >> a >> b >> n;
    //for (int i = 1; i <= n; i++)    cout << (a * i) / b - a * (i / b) << ' ';
    n = min (b - 1, n);
    cout << (a * n) / b - a * (n / b);
}

E - Rotation Matching

这题有点看不懂题解。。。

#include<bits/stdc++.h>

using namespace std;

int main () {
    int n, m;
    cin >> n >> m;
    int l = 1, r = m + 1;
    for (int i = 0; i < m; i++) {
        if (l >= r) l = m + 2, r = 2 * m + 1;
        cout << l << ' ' << r << endl;
        l++, r--;
    }
}

F - LIS on Tree

二分求LIS + 树上dfs 然后回溯

(基础是导弹拦截那题)

#include <bits/stdc++.h>

using namespace std;
const int N = 2e5 + 5, M = N * 2;
int a[N], ans[N], f[N], n; //f[i]: 长度为i的LIS的结尾最大值
int h[N], e[M], ne[M], idx;

void add (int a, int b) {
    e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

void dfs (int u, int fa) {
    int l = 1, r = ans[fa], lst;
    if (fa == 0)     ans[1] = 1, f[1] = a[u];
    else {
        while (l <= r) {
            int mid = l + r >> 1;
            if (a[u] <= f[mid])     r = mid - 1;
            else    l = mid + 1;
        }
        //cout << l << ' ' << r << endl;
        lst = f[l], f[l] = a[u], ans[u] = ans[fa];
        if (l > ans[fa])    ans[u]++;
    }
    for (int i = h[u]; ~i; i = ne[i]) {
        int j = e[i];
        if (j == fa)    continue;
        dfs (j, u);
    }
    f[l] = lst; //回溯
}

int main () {
    memset (h, -1, sizeof h);
    cin >> n;
    for (int i = 1; i <= n; i++)    cin >> a[i];
    for (int i = 1; i < n; i++) {
        int a, b;
        cin >> a >> b;
        add (a, b), add (b, a);
    }
    dfs (1, 0);
    for (int i = 1; i <= n; i++)    cout << ans[i] << endl;
}
posted @ 2023-08-01 09:32  Sakana~  阅读(17)  评论(0编辑  收藏  举报