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 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 #define mid (curl+curr>>1)
17 /* namespace */
18 using namespace std;
19 /* header end */
20
21 const ll mod = 998244353;
22
23 ll qp(ll x, ll b) {
24     ll ret = 1, base = x;
25     while (b) {
26         if (b & 1) ret = ret * base % mod;
27         base = base * base % mod;
28         b >>= 1;
29     }
30     return ret;
31 }
32
33 int main() {
34     ll n;
35     while (~scanf("%lld", &n)) {
36         ll k = 0, tmp = 3;
37         rep1(i, 2, n) k += tmp, tmp += 2;
38         printf("%lld\n", k * qp(9, mod - 2) % mod);
39     }
40     return 0;
41 }

F:

fwt题。

G:

不均等博弈题。用surrealnumber秒杀。

H:

最小割。

I:

求出本质不同的回文串的数量分布(求每种回文串的个数),然后对每种check一下叠加答案。manacher或者字符串hash都可以。

J:

签到题。1e6+3的阶乘后面全是0已经暗示一切。

 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 #define mid (curl+curr>>1)
17 /* namespace */
18 using namespace std;
19 /* header end */
20
21 const int mod = 1e6 + 3;
22 ll p[mod + 10];
23 int n;
24
25 int main() {
26     p[0] = p[1] = 1;
27     rep0(i, 2, mod) p[i] = 1ll * i * p[i - 1] % mod;
28     while (~scanf("%d", &n)) {
29         if (n >= mod) {
30             puts("0");
31             continue;
32         }
33         n %= mod;
34         printf("%lld\n", p[n]);
35     }
36     return 0;
37 }

K:

对于某个区间,首先考虑区间第1、2、3大的边能否构成三角形,然后考虑区间第2、3 、4大的边能否构成三角形,以此类推。

只要考虑区间前44大即可,因为区间最坏情况是斐波那契数列,然而第45项就爆了1e9的范围。时间复杂度O(44*nlogn)。

 1 /* basic header */
 2 #include <iostream>
 3 #include <cstring>
 4 /* define */
 5 #define ll long long
 6 #define dou double
 7 #define pb emplace_back
 8 #define mp make_pair
 9 #define sot(a,b) sort(a+1,a+1+b)
10 #define rep1(i,a,b) for(int i=a;i<=b;++i)
11 #define rep0(i,a,b) for(int i=a;i<b;++i)
12 #define eps 1e-8
13 #define int_inf 0x3f3f3f3f
14 #define ll_inf 0x7f7f7f7f7f7f7f7f
15 #define lson (curpos<<1)
16 #define rson (curpos<<1|1)
17 /* namespace */
18 using namespace std;
19 /* header end */
20
21 const int maxn = 1e5 + 10;
22 int a[maxn];
23
24 struct Node {
25     int l, r, val[50];
26 };
27
28 Node segt[maxn << 2];
29
30 void maintain(Node &fa, Node &ls, Node &rs) {
31     int i = 0, j = 0;
32     rep0(c, 0, 50) {
33         if (i >= 50)
34             fa.val[c] = rs.val[j++];
35         else if (j >= 50)
36             fa.val[c] = ls.val[i++];
37         else if (ls.val[i] < rs.val[j])
38             fa.val[c] = rs.val[j++];
39         else fa.val[c] = ls.val[i++];
40     }
41 }
42
43 void build(int curpos, int curl, int curr) {
44     segt[curpos].l = curl, segt[curpos].r = curr;
45     // memset(segt[curpos].val, 0, sizeof(segt[curpos].val));
46     if (curl < curr) { // if is not leaf node
47         int mid = curl + curr >> 1;
48         build(lson, curl, mid); build(rson, mid + 1, curr);
49         maintain(segt[curpos], segt[lson], segt[rson]);
50     } else
51         segt[curpos].val[0] = a[curl]; // if is leaf node
52 }
53
54 Node query(int curpos, int curl, int curr) {
55     if (segt[curpos].l == curl && segt[curpos].r == curr) return segt[curpos];
56     else {
57         int mid = segt[curpos].l + segt[curpos].r >> 1;
58         if (curr <= mid) return query(lson, curl, curr);
59         else if (curl > mid) return query(rson, curl, curr);
60         else {
61             Node lnode = query(lson, curl, mid), rnode = query(rson, mid + 1, curr);
62             Node ret; ret.l = curl, ret.r = curr;
63             maintain(ret, lnode, rnode);
64             return ret;
65         }
66     }
67 }
68
69 int main() {
70     int n, q;
71     while (~scanf("%d%d", &n, &q)) {
72         rep1(i, 1, n) scanf("%d", &a[i]);
73         build(1, 1, n);
74         while (q--) {
75             int l, r; scanf("%d%d", &l, &r);
76             Node cur = query(1, l, r);
77             ll ans = -1;
78             rep0(i, 0, 48) {
79                 if ((ll)cur.val[i] < (ll)cur.val[i + 1] + (ll)cur.val[i + 2]) {
80                     ans = (ll)cur.val[i] + (ll)cur.val[i + 1] + (ll)cur.val[i + 2];
81                     break;
82                 }
83             }
84             printf("%lld\n", ans);
85         }
86     }
87     return 0;
88 }

L:

又是线段树题,背锅。

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

时间: 2024-08-29 13:42:04

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

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 /* defin

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 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\) 个时刻数组 \(