2019 HDOJ Multi-University Training Contest Stage 8(杭电多校)

中规中矩的一场。

题目链接:http://acm.hdu.edu.cn/contests/contest_show.php?cid=855



C:

定义函数f(d,k)为数字d在数字k中出现的次数。给定d和x,找到尽量大的k使得k<=x且f(d,k)==k。

很诡异的一题,最好的做法仍然是打表找规律。题解给了一个很神奇的结论:满足条件的k<1011且k的分布非常稀疏。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
10 #define rep0(i,a,b) for(int i=a;i<b;++i)
11 #define eps 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 /* namespace */
17 using namespace std;
18 /* header end */
19
20 const ll m = 1e5, maxn = 1e6 + 10;
21 ll a[maxn][10], ans[10][maxn], cnt[10];
22
23 bool check(ll x, ll y) {
24     if (x < 0 && y >= 0) return 1;
25     if (x > y && x >= 0 && x < m) return 1;
26     return 0;
27 }
28
29 int main() {
30     for (int i = 1; i < m * 10; i++) {
31         for (int j = 0; j < 10; j++) a[i][j] = a[i / 10][j];
32         a[i][i % 10]++;
33     }
34     for (int d = 1; d < 10; d++) {
35         int r = 1;
36         for (int i = 0; i < m * d; i++)
37             if (check(r, r - m / 2 + m * a[i][d])) {
38                 for (int j = 0; j < m; j++) {
39                     r += a[i][d] + a[j][d] - 1;
40                     if (!r) ans[d][cnt[d]++] = m * i + j;
41                 }
42             } else r += m * a[i][d] - m / 2;
43     }
44     int query; scanf("%d", &query);
45     while (query--) {
46         int d; ll k; scanf("%d%lld", &d, &k);
47         int r = cnt[d] - 1;
48         while (r >= 0 && ans[d][r] > k) r--;
49         if (r >= 0) printf("%lld\n", ans[d][r]);
50         else puts("0");
51     }
52     return 0;
53 }

I:

给定两个矩形的左上角和右下角坐标,问这两个矩形把平面分成几个区域。

离散化是重点。

/* Codeforces Contest 2019_mutc_08
 * Problem I
 * Au: SJoshua
 */
#include <set>
#include <unordered_map>
#include <queue>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

bool board[20][20];

const int movement[4][2] = {
    {0, -1}, {0, 1}, {1, 0}, {-1, 0}
};

struct node {
    int x, y;
};

struct Rectangle {
    int x1, y1, x2, y2;
    void fill(void) {
        for (int x = x1; x <= x2; x++) {
            board[x][y1] = board[x][y2] = true;
        }
        for (int y = y1; y <= y2; y++) {
            board[x1][y] = board[x2][y] = true;
        }
    }
};

void init(void) {
    memset(board, 0, sizeof(board));
}

int calc(void) {
    int ans = 0;
    for (int i = 0; i < 20; i++) {
        for (int j = 0; j < 20; j++) {
            if (!board[i][j]) {
                queue <node> info;
                info.push({i, j});
                while (!info.empty()) {
                    auto t = info.front();
                    info.pop();
                    if (board[t.x][t.y]) {
                        continue;
                    }
                    board[t.x][t.y] = true;
                    for (int k = 0; k < 4; k++) {
                        int nx = t.x + movement[k][0], ny = t.y + movement[k][1];
                        if (0 <= nx && nx < 20 && 0 <= ny && ny < 20 && !board[nx][ny]) {
                            info.push({nx, ny});
                        }
                    }
                }
                ans++;
            }
        }
    }
    return ans;
}

int main(void) {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int T;
    cin >> T;
    while (T--) {
        vector <int> vec(8);
        set <int> hash;
        unordered_map <int, int> mp;
        for (int i = 0; i < 8; i++) {
            cin >> vec[i];
            hash.insert(vec[i]);
        }
        int cur = 1;
        for (auto e : hash) {
            mp[e] = cur;
            cur += 2;
        }
        Rectangle A = {mp[vec[0]], mp[vec[1]], mp[vec[2]], mp[vec[3]]};
        Rectangle B = {mp[vec[4]], mp[vec[5]], mp[vec[6]], mp[vec[7]]};
        init();
        A.fill();
        B.fill();
        cout << calc() << endl;
    }
    return 0;
}

Code via. Sjoshua

J:

签到题,水题。

 1 /* Codeforces Contest 2019_mutc_08
 2  * Problem J
 3  * Au: SJoshua
 4  */
 5 #include <cstdio>
 6 #include <vector>
 7 #include <string>
 8 #include <iostream>
 9 #include <algorithm>
10
11 using namespace std;
12
13 struct info {
14     string name;
15     int score, penalty;
16 };
17
18 int main(void) {
19     std::ios::sync_with_stdio(false);
20     std::cin.tie(0);
21     int T;
22     cin >> T;
23     while (T--) {
24         int n, d;
25         cin >> n >> d;
26         vector <info> board(n);
27         for (int i = 0; i < n; i++) {
28             cin >> board[i].name >> board[i].score >> board[i].penalty;
29         }
30         sort(board.begin(), board.end(), [](info & a, info & b)->bool {
31             return a.score == b.score ? a.penalty < b.penalty : a.score > b.score;
32         });
33         d *= 10;
34         if ((n * d) % 100 == 50) {
35             cout << board[(n * d) / 100].name << endl;
36         } else {
37             cout << "Quailty is very great" << endl;
38         }
39     }
40     return 0;
41 }

Code via. Sjoshua

K:

有n个班级,一个班有ai个人并准备了bi杯奶茶。每个人只能喝一杯奶茶,而且不能喝本班的奶茶。问最多有多少人能喝奶茶。

按班级人数从大到小排序,然后对于第i个班,从第i+1个班开始绕一圈喝奶茶即可。

 1 /* Codeforces Contest 2019_mutc_08
 2  * Problem K
 3  * Au: SJoshua
 4  */
 5 #include <queue>
 6 #include <cstdio>
 7 #include <vector>
 8 #include <string>
 9 #include <list>
10 #include <iostream>
11 #include <algorithm>
12
13 using namespace std;
14
15 struct _Class {
16     int num, tea;
17 };
18
19 int main(void) {
20     std::ios::sync_with_stdio(false);
21     std::cin.tie(0);
22     int T; cin >> T;
23     while (T--) {
24         int n; cin >> n;
25         vector <_Class> _class(n);
26         for (int i = 0; i < n; i++) {
27             cin >> _class[i].num >> _class[i].tea;
28         }
29         sort(_class.begin(), _class.end(), [](_Class & a, _Class & b) {
30             return a.tea == b.tea ? a.num > b.num : a.tea > b.tea;
31         });
32         long long int ans = 0;
33         vector <int> nxt(n);
34         for (int i = 0; i < n - 1; i++) nxt[i] = i + 1;
35         nxt[n - 1] = 0;
36         for (int i = 0; i < n; i++) {
37             int nxt = i;
38             long long int cnt = 0, round = 0;
39             while (_class[i].num) {
40                 round++;
41                 int last = nxt; nxt = nxt[nxt];
42                 if (nxt == i) break;
43                 if (_class[nxt].tea) {
44                     int drink = min(_class[nxt].tea, _class[i].num);
45                     _class[i].num -= drink, _class[nxt].tea -= drink;
46                     ans += drink, cnt += drink;
47                 } else nxt[last] = nxt[nxt];
48                 if (round > n) break;
49             }
50             if (!cnt && _class[i].num) break;
51         }
52         cout << ans << endl;
53     }
54     return 0;
55 }

Code via. Sjoshua

原文地址:https://www.cnblogs.com/JHSeng/p/11354513.html

时间: 2024-11-06 13:09:28

2019 HDOJ Multi-University Training Contest Stage 8(杭电多校)的相关文章

2019 HDOJ Multi-University Training Contest Stage 10(杭电多校)

最后一场多校打得一般般. 题目链接:http://acm.hdu.edu.cn/contests/contest_show.php?cid=857 C: E: I: BFS水题. 1 /* Codeforces Contest 2019_mutc_10 2 * Problem I 3 * Au: SJoshua 4 */ 5 #include <queue> 6 #include <cstdio> 7 #include <vector> 8 #include <s

2019 HDOJ Multi-University Training Contest Stage 2(杭电多校)

服务器时不时爆炸,有点难受. 题目链接:http://acm.hdu.edu.cn/userloginex.php?cid=849 A: 神仙题.不可做题. B: dp. C: 推式子题. D: 边分治. E: 可以数学推理的题.但是显然打表更快找出规律.对打出来的结果做两次差分即可. 1 /* basic header */ 2 #include <bits/stdc++.h> 3 /* define */ 4 #define ll long long 5 #define dou doubl

2019 HDOJ Multi-University Training Contest Stage 4(杭电多校)

很抱歉过了这么多天才补这场,最近真的挺忙的…… 出题人是朝鲜的(目测是金策工业?),挺难. 题目链接:http://acm.hdu.edu.cn/contests/contest_show.php?cid=851 A: 签到题. 对于当前的点,若其编号为偶数,则可与1相连使得边权贡献为0.否则从低位向高位找当前点编号的二进制表示的第一个0,使这个0变为1,其他位置变为0并检查新的数字是否小于等于n.若小于等于n则贡献为0,反之贡献为1. 1 /* basic header */ 2 #inclu

2019杭电多校第九场

2019杭电多校第九场 熟悉的后半场挂机节奏,又苟进首页了,很快乐 1001. Rikka with Quicksort upsolved 不是我做的,1e9调和级数分段打表 1002. Rikka with Cake solved at 01:11 有一个矩形,给你很多射线(射线只有横平竖直的四个方向),问把矩形切成了多少块 队友说答案是交点数加一,作为一个合格的工具人,当然是把队友的想法实现啦 二维坐标离散化枚举纵坐标维护横坐标,常规套路,树状数组也可以做(我是线段树写习惯了根本没想起来还有

2019杭电多校训练(一)

比赛链接: http://acm.hdu.edu.cn/search.php?field=problem&key=2019+Multi-University+Training+Contest+1&source=1&searchmode=source hdu6582 题意: 删除某些边,让$1$到$n$的最短路径发生变化 删除某条边的费用是边的长度 分析: 先用迪杰斯特拉跑一遍整个图,满足$dis[a]+w=dis[b]$的边,肯定是最短路径上的边 选出这些边,找到一个最小割集,Di

2019 杭电多校 第八场

2019 Multi-University Training Contest 8 补题链接:2019 Multi-University Training Contest 8 1003 Acesrc and Good Numbers HDU 6659 题意 定义 \(f(d, n)\) 为十进制下 \(1\) 到 \(n\) 所有数的数位中数字 \(d\) 出现的次数.给定 \(x\),找出最大的 \(n(n \le x)\) 满足 \(f(d, n) = n\). 题解 看到了一个神仙做法. 显

2019 杭电多校 第七场

2019 Multi-University Training Contest 7 补题链接:2019 Multi-University Training Contest 7 1001 A + B = C 题意: 给出 \(a, b, c\),求 \(x, y, z\) 满足 \(a\cdot 10^x + b\cdot 10^y = c\cdot 10^z\).\(a, b, c \le 10^{100000}\). 题解: 补零到 \(a, b, c\) 长度相等之后,可能的情况只有四种: \

2019 杭电多校 第五场

2019 Multi-University Training Contest 5 补题链接:2019 Multi-University Training Contest 5 罚时爆炸 自闭场 1004 equation (HDU 6627) 题意: 给定一个整数 \(C\) 和 \(N\) 组 \(a_i,b_i\),求 \(∑_{i=1}^N|a_i\cdot x + b_i| = C\) 的所有解,如果有无穷多个解就输出 -1. 思路 分类讨论 分类讨论去绝对值.根据 \(b_i / a_i

2019 杭电多校 第六场

2019 Multi-University Training Contest 6 补题链接:2019 Multi-University Training Contest 6 1002 Nonsense Time (HDU 6635) 题意 给定包含 \(n\) 个不同数字的排列 \(p\).一开始所有数字都冻住.再给出一个长度为 \(n\) 的数组 \(k\),\(k[i]\) 表示 \(p[k[i]]\) 在第 \(i\) 时刻解冻.输出 \(n\) 个数,表示第 \(i\) 个时刻数组 \(