2018-2019 9th BSUIR Open Programming Championship

最后一天集训,大家说开个5星难度的gym玩玩,没想到爆炸难……3题爬了。

D

\(O(n^2logn)+\)强剪枝才过了
solver: czq

/* basic header */
#include <bits/stdc++.h>
/* define */
#define ll long long
#define dou double
#define pb emplace_back
#define mp make_pair
#define sot(a,b) sort(a+1,a+1+b)
#define rep1(i,a,b) for(int i=a;i<=b;++i)
#define rep0(i,a,b) for(int i=a;i<b;++i)
#define eps 1e-8
#define int_inf 0x3f3f3f3f
#define ll_inf 0x7f7f7f7f7f7f7f7f
#define lson (curpos<<1)
#define rson (curpos<<1|1)
/* namespace */
using namespace std;
/* header end */

const int maxn = 1e5 + 10;
struct Node {
    int id, x;
    Node() {}
    Node(int _id, int _x): id(_id), x(_x) {}
    bool operator<(const Node &rhs)const {
        return x < rhs.x || x == rhs.x && id < rhs.id;
    }
} card[maxn];
pair<int, int> dp[maxn], segT[maxn << 2];
int n, pass, numOfCard = 0, ans = 0, __begin = 0;

void maintain(int curpos) {
    segT[curpos] = max(segT[lson], segT[rson]);
}

void build(int curpos, int curl, int curr) {
    if (curl == curr) {
        segT[curpos] = mp(0, -1);
        return;
    }
    int mid = curl + curr >> 1;
    build(lson, curl, mid); build(rson, mid + 1, curr);
    maintain(curpos);
}

pair<int, int> query(int curpos, int curl, int curr, int ql, int qr) {
    if (ql > qr) return mp(0, -1);
    if (ql <= curl && curr <= qr) return segT[curpos];
    int mid = curl + curr >> 1;
    pair<int, int> ans = mp(0, -1);
    if (ql <= mid) ans = max(ans, query(lson, curl, mid, ql, qr));
    if (qr > mid) ans = max(ans, query(rson, mid + 1, curr, ql, qr));
    return ans;
}

void update(int curpos, int pos, int curl, int curr, pair<int, int>val) {
    if (curl == curr) {
        segT[curpos] = max(segT[curpos], val);
        return;
    }
    int mid = curl + curr >> 1;
    if (pos <= mid) update(lson, pos, curl, mid, val);
    else update(rson, pos, mid + 1, curr, val);
    maintain(curpos);
}

void dfs(int curr, int depth) {
    if (curr == -1) {
        printf("%d\n", depth);
        return;
    }
    dfs(dp[curr].second, depth + 1);
    printf("%d %d\n", card[curr].id, card[curr].x);
}

int main() {
    scanf("%d%d", &n, &pass);
    for (int i = 1; i <= n; i++) {
        int num; scanf("%d", &num);
        for (int j = 1; j <= num; j++) {
            int x; scanf("%d", &x);
            card[++numOfCard] = Node(i, x);
        }
    }
    build(1, 1, n);
    sort(card + 1, card + 1 + numOfCard);
    // O(n^2logn) LIS
    for (int i = 1; i <= numOfCard;) {
        for (int j = i; j <= numOfCard; j++) {
            if (card[i].x != card[j].x) break;
            int currID = card[j].id, currPos = ((currID - pass - 2) % n + n) % n + 1;
            if (currPos < currID) dp[j] = query(1, 1, n, currPos, currID - 1);
            else dp[j] = max(query(1, 1, n, currPos, n), query(1, 1, n, 1, currID - 1));
        }
        int j;
        for (j = i; j <= numOfCard; j++) {
            if (card[i].x != card[j].x) break;
            if (!dp[j].first && card[j].id > pass + 1) continue;
            dp[j].first++; int pos = card[j].id;
            update(1, pos, 1, n, mp(dp[j].first, j));
        }
        i = j;
    }
    for (int i = 1; i <= numOfCard; i++)
        if (dp[i].first > ans) {
            ans = dp[i].first;
            __begin = i;
        }
    if (!__begin) puts("0");
    else dfs(__begin, 0);
    return 0;
}

H

白给
solver: czq

/* basic header */
#include <bits/stdc++.h>
/* define */
#define ll long long
#define dou double
#define pb emplace_back
#define mp make_pair
#define sot(a,b) sort(a+1,a+1+b)
#define rep1(i,a,b) for(int i=a;i<=b;++i)
#define rep0(i,a,b) for(int i=a;i<b;++i)
#define eps 1e-8
#define int_inf 0x3f3f3f3f
#define ll_inf 0x7f7f7f7f7f7f7f7f
#define lson (curpos<<1)
#define rson (curpos<<1|1)
/* namespace */
using namespace std;
/* header end */

int main() {
    int t; cin >> t;
    while (t--) {
        int a, b; cin >> a >> b;
        for (int i = 1; i <= 50; i++) {
            if (i != a + b) {
                cout << i << endl;
                break;
            }
        }
    }
    return 0;
}

I

注意记忆化
solver: lzh

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define ff first
#define ss second
#define mp make_pair

unordered_map<ll, pair<int, vector<ll>>> m;
void dfs(ll x, vector<ll> &tmpp) {
    if (!x)
        return;
    if (m[x].ff) {
        tmpp = m[x].ss;
        return;
    }

    ll tmp = 10, res = x;
    vector<ll> minn = vector<ll>(1, x);

    while (x / tmp) {
        ll tmp1 = x / tmp, tmp2 = x % tmp;
        tmpp = vector<ll>(1, x);
        dfs(abs(tmp1 - tmp2), tmpp);
        if (tmpp.back() < res) {
            res = tmpp.back();
            minn = tmpp;
        }
        tmp *= 10;
    }
    if (res != x)
        tmpp = vector<ll>(1, x);
    else
        tmpp.clear();
    for (auto i : minn)
        tmpp.push_back(i);
    m[x] = mp(res, tmpp);
}

int main() {
    for (int i = 1; i <= 9; i++)
        m[i] = mp(i, vector<ll>(1, i));
    int t = 1000;
    scanf("%d", &t);
    while (t--) {
        ll n = t + 1;
        scanf("%lld", &n);
        vector<ll> ans;
        dfs(n, ans);
        if (!m[n].ff)
            m[n] = mp(n, vector<ll>(1, n));
        ans = m[n].ss;
        printf("%d ", ans.size());
        for (auto i : ans)
            printf("%lld ", i);
        printf("\n");
    }
}

猜你喜欢

转载自www.cnblogs.com/JHSeng/p/12202904.html
9th