AtCoder Beginner Contest 370 Solution

2024-09-08 07:28

本文主要是介绍AtCoder Beginner Contest 370 Solution,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

A

void solve() {int a, b;qr(a, b);if(a + b != 1) cout << "Invalid\n";else Yes(a);
}

B

模拟

void solve() {qr(n);int x = 1;FOR(i, n) FOR(j, i) qr(a[i][j]);FOR(i, n) x = x >= i ? a[x][i]: a[i][x];pr2(x);
}

C

首先先考虑能变小的位置, 此时选择更前面的位置对字典序的改变更优. 反之, 先选后面的位置更优.

void solve() {string s, t;qr(s, t);n = SZ(s);VT<int> v[2];m = 0;rep(i, 0, n - 1) if(s[i] != t[i])v[s[i] < t[i]].pb(i);pr2(SZ(v[0]) + SZ(v[1]));reverse(v[1]);rep(i, 0, 1) {for(int j: v[i]) s[j] = t[j], pr2(s);}
}

D

维护 n + m n+m n+m 个set,用内置函数查找. 需要注意的时,先删除 prev(it), 再删除 it. 否则迭代器可能异常.

void solve() {qr(n, m, q);VT r(n + 1, set<int>()), c(m + 1, set<int>());FOR(i, n) FOR(j, m) r[i].insert(j), c[j].insert(i);int x, y;auto del = [&](int x, int y) {r[x].erase(y); c[y].erase(x);};while(q--) {qr(x, y);if(r[x].contains(y)) {del(x, y);continue;}if(SZ(c[y])) {auto jt = c[y].upper_bound(x);if(jt != c[y].begin()) del(*prev(jt), y);if(jt != c[y].end()) del(*jt, y);}if(SZ(r[x])) {auto jt = r[x].upper_bound(y);if(jt != r[x].begin()) del(x, *prev(jt));if(jt != r[x].end()) del(x, *jt);}}int ans = 0;FOR(i, n) ans += SZ(r[i]);pr2(ans);
}

E

简单容斥+dp, 每次把以 i i i 末尾段中和为 k k k 的段去掉即可.

const int N = 2e5 + 10, inf = 0x3f3f3f3f;
const ll INF = 4E18;
int n;
ll s[N], m, f[N];void solve() {qr(n, m);FOR(i, n) qr(s[i]), s[i] += s[i - 1];ll sum = f[0] = 1;map<ll, int> g;g[0] = 1;FOR(i, n) {f[i] = sum;dl(f[i], g[s[i] - m]);ad(g[s[i]], f[i]);ad(sum, f[i]);}pr2(f[n]);
}

F

看到最小值最大,显然二分 x x x,判断是否可以每段都 ≥ x \ge x x .
然后环的处理就是断环为链(复制一次在后面).
然后每个位置求一下最大的前驱,满足对应区间和 ≥ x \ge x x.
然后就是倍增选择跳 m m m 次前驱, 如果跳完坐标差 ≤ n \le n n, 则合法.

考虑第二个输出, 不被砍,说明不能以它结尾, 所以统计不合法的 e n d p o i n t endpoint endpoint 数量即可. 复杂度 O ( n log ⁡ m log ⁡ ( ∑ a [ i ] / n ) ) O(n\log m \log (\sum a[i] / n)) O(nlogmlog(a[i]/n)).

当然把倍增去掉,改成 d f s dfs dfs 即可省去 一个 log ⁡ m \log m logm.

const int N = 4e5 + 10, inf = 0x3f3f3f3f;
const ll INF = 4E18;
int n, m, a[N], sum;int p[N], f[N][20], out;
bool check(int x, int o = 1) {int st = 1, s = 0;int lg = __lg(m);out = 0;FOR(i, 2 * n) {s += a[i];while(st < i && s - a[st] >= x) s -= a[st++];p[i] = st - 1;f[i][0] = p[i];rep(j, 1, lg) f[i][j] = f[f[i][j - 1]][j - 1];if(i > n) {int j = i;rep(k, 0, lg) if(m >> k & 1) j = f[j][k];if(i - j <= n) {if(o) return 1;}else out++;}}return 0;
}void solve() {qr(n, m);FOR(i, n) qr(a[i]), a[i + n] = a[i], sum += a[i];int l = *min_element(a + 1, a + n + 1), r = sum / m, mid;while(l < r) {mid = (l + r + 1) >> 1;if(check(mid)) l = mid;else r = mid - 1;}check(l, 0);pr1(l, out);
}

G

口胡.
简单容斥, 所以 a n s = n − ans = n- ans=n 不好的数的数量.
n = ∏ i = 1 m p i c i n = \prod _{i = 1}^m p_i ^{c_i} n=i=1mpici, 则 n n n 不好,当且仅当 ∀ i ∈ [ 1 , m ] , 3 ∤ p i c i + 1 − 1 p i − 1 \forall i \in [1, m], 3 \nmid \dfrac {p_i ^{c_i+ 1}-1}{p_i-1} i[1,m],3pi1pici+11

不妨设记性函数 f ( x ) f(x) f(x), 其中 f ( p c ) = [ 3 ∤ p c + 1 − 1 p − 1 ] ( c + m − 1 m − 1 ) f(p^c) = [3 \nmid \dfrac {p ^{c+ 1}-1}{p-1}] \dbinom {c+m-1}{m-1} f(pc)=[3p1pc+11](m1c+m1). 那么最后结果就是 n − ∑ i = 1 n f ( i ) n-\sum_{i=1}^n f(i) ni=1nf(i).

上min25即可.
对于大质数 p p p, 写个dp, g [ x ] [ t ] g[x][t] g[x][t] 计算 [ 1 , ⌊ n x ⌋ ] [1, \lfloor \dfrac n x\rfloor] [1,xn⌋] m o d 3 \mod 3 mod3 的余数为 t t t 的质数数量即可… (赛时没想到,以为要用什么数论知识 /yun)

这篇关于AtCoder Beginner Contest 370 Solution的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147489

相关文章

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

CF Bayan 2015 Contest Warm Up B.(dfs+暴力)

B. Strongly Connected City time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/475/probl

CF Bayan 2015 Contest Warm Up A.(模拟+预处理)

A. Bayan Bus time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/475/problem/A The fi

AtCoder Beginner Contest 369 D - Bonus EXP 动态规划

原题链接: https://atcoder.jp/contests/abc369/tasks/abc369_d 思路:   这道题为什么要用动态规划呢,其实,对于第i个怪物,我们有打与不打两种处理方式,而对于打,我们是获得两倍的经验值,还是一倍的经验值,与我们打了奇数只怪物还是打了偶数只怪物有关了,因此我们定义dp[i][0] 为前i只怪物总共打了偶数次,dp[i][1] 为前i只怪物总

2015 Multi-University Training Contest 5 1009 MZL#39;s Border

MZL's Border  Problem's Link:  http://acm.hdu.edu.cn/showproblem.php?pid=5351   Mean:  给出一个类似斐波那契数列的字符串序列,要你求给出的f[n]字符串中截取前m位的字符串s中s[1...i] = s[s.size()-i+1....s.size()]的最大长度。 analyse:   过计算

【UVa】10600 ACM Contest and Blackout 次小生成树

类型:次小生成树 题目大意: 为了举办ACM竞赛,市长决定给所有的n(3 <= n <= 100)所学校提供可靠的电力供应。当且仅当一个学校直接连到电站,或者连到另一个有可靠供应的学校时,才有可靠供应。现在给出在不同学校之间的布线成本,找出最便宜的两种连线方案。一个方案的成本等于其中所有学校之间连线的成本的总和。 题目分析: 次小生成树。 先求出最小生成树,然后枚举所有不在

【POJ】3660 Cow Contest floyd(可以拓扑排序?)

Cow Contest Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 6925 Accepted: 3792 Description N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating i

2014 Asia AnShan Regional Contest 题解

B:5071Chat 暴力模拟即可。注意Bye的时候先和always on top说bye。还有注意long long。 代码如下: #include <set>#include <cstdio>#include <cstring>#include <algorithm>using namespace std ;#pragma comment(linker, "/ST