AtCoder Beginner Contest 129 解题报告
写了四个题就跑去打球了。第五题应该能肝出来的。
#include <bits/stdc++.h>
using namespace std; inline int read() {
int x = , f = ; char ch = getchar();
while (ch < '' || ch > '') { if (ch == '-') f = -; ch = getchar(); }
while (ch >= '' && ch <= '') { x = x * + ch - ; ch = getchar(); }
return x * f;
} int main() {
int a = read(), b = read(), c = read();
int ans = 1e9;
ans = min(ans, a + b);
ans = min(b + c, ans);
ans = min(ans, c + a);
cout << ans << '\n';
return ;
}
看错题意了。。改的时候就直接暴力了一发。。
#include <bits/stdc++.h>
using namespace std; inline int read() {
int x = , f = ; char ch = getchar();
while (ch < '' || ch > '') { if (ch == '-') f = -; ch = getchar(); }
while (ch >= '' && ch <= '') { x = x * + ch - ; ch = getchar(); }
return x * f;
} const int N = ;
int a[N], sum[N]; int main() {
int n = read();
for (int i = ; i <= n; i++) a[i] = read();
for (int i = ; i <= n; i++) {
sum[i] = sum[i - ] + a[i];
}
int ans = 1e9;
for (int T = ; T < n; T++) {
int sum0 = ;
for (int i = ; i <= n; i++) {
if (i <= T) sum0 += a[i];
else break;
}
ans = min(ans, abs(sum[n] - sum0 - sum0));
// printf("%d\n", ans);
}
printf("%d\n", ans);
return ;
}
题意:走台阶,一次走一至两个台阶,有些台阶是坏的,问走到第$n$个台阶的方案数
思路:就是普通的递推,坏的台阶$f[i]$设为0
#include <bits/stdc++.h>
#define ll long long
using namespace std; inline int read() {
int x = , f = ; char ch = getchar();
while (ch < '' || ch > '') { if (ch == '-') f = -; ch = getchar(); }
while (ch >= '' && ch <= '') { x = x * + ch - ; ch = getchar(); }
return x * f;
} const int N = 1e5 + ;
const ll mod = 1e9 + ;
bool vis[N];
ll f[N]; int main() {
int n = read(), m = read();
while (m--) {
int x = read();
vis[x] = ;
}
f[] = ;
if (!vis[]) f[] = ;
for (int i = ; i <= n; i++) {
if (vis[i]) continue;
f[i] = (f[i - ] + f[i - ]) % mod;
}
printf("%lld\n", f[n]);
return ;
}
题意:一个网格,有些地方是墙,问在哪个没有墙的地方放个灯,灯能照射的范围最远,灯能往上下左右延伸
思路:刚开始傻逼傻逼的对每个点往四个方向延伸,然后就获得了一个TLE。从左上对每个点统计从它的左方和上方分别能走多远,从右下对每个点统计从它的右方和下方分别能走多远
然后再对每一个点求一边四个方向的和的最大值
#include <bits/stdc++.h>
using namespace std; inline int read() {
int x = , f = ; char ch = getchar();
while (ch < '' || ch > '') { if (ch == '-') f = -; ch = getchar(); }
while (ch >= '' && ch <= '') { x = x * + ch - ; ch = getchar(); }
return x * f;
} const int N = ;
char s[N][N];
int dp[N][N][]; int main() {
int n = read(), m = read();
for (int i = ; i < n; i++) {
scanf("%s", s[i]);
}
int ans = ;
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
if (s[i][j] == '.') {
dp[i][j][] = dp[i][j][] = ;
if (j > && dp[i][j - ][] > ) dp[i][j][] = dp[i][j - ][] + ;
if (i > && dp[i - ][j][] > ) dp[i][j][] = dp[i - ][j][] + ;
}
}
}
for (int i = n - ; i >= ; i--) {
for (int j = m - ; j >= ; j--) {
if (s[i][j] == '.') {
dp[i][j][] = dp[i][j][] = ;
if (j < m - && dp[i][j + ][] > ) dp[i][j][] = dp[i][j + ][] + ;
if (i < n - && dp[i + ][j][] > ) dp[i][j][] = dp[i + ][j][] + ;
}
}
}
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
if (s[i][j] == '#') continue;
int temp = ;
for (int cnt = ; cnt < ; cnt++) temp += dp[i][j][cnt];
ans = max(ans, temp - );
}
}
printf("%d\n", ans);
return ;
}
题意:给一个二进制数$L$,问有多少对$\left(a,b\right)$满足:$a+b \leq L$ $a+b = a \oplus b$
思路:为啥别人看到都直接莽DP啊,为啥我看到就推公式啊。因为第二个条件,对于每一位 $a$和$b$只能为$\left(0,0\right)$ $\left(1,0\right)$ $\left(0, 1\right)$ 三种情况
所以如果给出的$L$是全1,那么答案就是$3^{len}$,但是由于第一个条件存在,那么对于每一位为0的,不能出现 1.比他高位的1的位置出现 $\left(1,0\right)$ $\left(0, 1\right)$ 2.这个位置出现$\left(1,0\right)$ $\left(0, 1\right)$ 那么就用一个系数$c$来保存1位置,每到一个1位置, $c$乘2,每到一个0位置,答案减去 $c \times 3 ^{x}$ $x$是这个位置往后的数的长度 就是前面1位置出现了一个为0一个为1 这个0位置出现一个0一个为1 $a + b$就会大于$L$ 那么后面的随机组合的情况就是多出来了 所以减去就完了。
代码里面还有一个是DP的,我是拿来对拍的...
#include <bits/stdc++.h>
#define ll long long
using namespace std; const ll mod = 1e9 + ; ll qp(ll a, ll b) {
ll res = ;
while (b) {
if (b & ) res = res * a % mod;
a = a * a % mod;
b >>= ;
}
return res;
} const int N = 1e5 + ;
char s[N];
ll dp[N];
ll bit[N]; int main() {
scanf("%s", s);
int len = strlen(s);
ll ans = qp(, len);
bit[] = ;
for (int i = ; i <= len; i++) bit[i] = bit[i - ] * % mod;
if (s[] == '') ans = (ans - * qp(, len - )) % mod;
ll temp = ;
for (int i = ; i < len; i++) {
if (s[i] == '') ans = (ans - temp * bit[len - i - ] % mod + mod) % mod;
else temp = temp * % mod;
}
// dp[0] = 1;
// reverse(s, s + len);
// for (int i = 0; i < len; i++) {
// if (s[i] == '1') dp[i + 1] = (2 * dp[i] + bit[i]) % mod;
// else dp[i + 1] = dp[i];
// }
printf("%lld\n", ans);
return ;
}
F - Takahashi's Basics in Education and Learning
题意:给一个等差数列的首项和公差和项数,把这$L$项给拼起来,问最后这个大数模$M$的答案是多少
思路:完全没明白咋写...看了别人的代码看半天才懂...
这个大数的组成就是$a_{0}\times 10^{b_{0}\cdot }+a_{1}\times 10^{b_{1}}+\ldots +a_{L - 1}\times 10^{b_{L - 1}}$
答案把这$L$项按他们的长度分类 然后对于每一个构造一个矩阵
$\begin{pmatrix} bit & 1 & 0 \\ 0 & 1 & d \\ 0 & 0 & 1 \end{pmatrix}$
答案矩阵为$\begin{pmatrix} ans \\ a_{st} \\ 1 \end{pmatrix}$
找到$a_{st}$二分就OK了
学习了。
#include <bits/stdc++.h>
#define ll long long
using namespace std; inline ll read() {
ll x = , f = ; char ch = getchar();
while (ch < '' || ch > '') { if (ch == '-') f = -; ch = getchar(); }
while (ch >= '' && ch <= '') { x = x * + ch - ; ch = getchar(); }
return x * f;
} ll mod; struct M { ll a[][]; };
M operator * (const M &a, const M &b) {
M c;
for (int i = ; i < ; i++) {
for (int j = ; j < ; j++) {
c.a[i][j] = ;
for (int k = ; k < ; k++) {
c.a[i][j] = (c.a[i][j] + a.a[i][k] * b.a[k][j] % mod) % mod;
}
}
}
return c;
} M qp(M a, ll b) {
M c;
for (int i = ; i < ; i++) for (int j = ; j < ; j++) c.a[i][j] = i == j;
while (b) {
if (b & ) c = c * a;
a = a * a;
b >>= ;
}
return c;
} int main() {
ll n = read(), a0 = read(), d = read(); mod = read();
ll bit = , ans = ;
ll st = ;
for (int i = ; i <= ; i++) {
ll l = st, r = n, p = -;
while (l + < r) {
ll mid = l + r >> ;
if (mid * d + a0 < bit) l = mid , p = mid;
else r = mid;
}
if (l * d + a0 < bit) p = l;
if (p != -) {
M a;
a.a[][] = bit % mod; a.a[][] = a.a[][] = a.a[][] = 1LL;
a.a[][] = a.a[][] = a.a[][] = a.a[][] = 0LL;
a.a[][] = d % mod;
a = qp(a, p - st + );
ll ast = a0 % mod + d % mod * st % mod; ast %= mod;
ans = (ans * a.a[][] % mod + ast * a.a[][] % mod + a.a[][] % mod) % mod;
st = p + ;
}
if (st >= n) break;
bit *= ;
}
printf("%lld\n", ans);
return ;
}
AtCoder Beginner Contest 129 解题报告的更多相关文章
- AtCoder Beginner Contest 122 解题报告
手速选手成功混进rated only里面的前30名,但是总排名就到110+了... A - Double Helix #include <bits/stdc++.h> #define ll ...
- AtCoder Beginner Contest 146解题报告
题目地址 https://atcoder.jp/contests/abc146/tasks 感觉没有什么有意思的题... 题解 A #include <bits/stdc++.h> usi ...
- Atcoder Beginner Contest 124 解题报告
心态爆炸.本来能全做出来的.但是由于双开了Comet oj一个比赛,写了ABC就去搞那个的B题 还被搞死了. 回来写了一会D就过了.可惜比赛已经结束了.真的是作死. A - Buttons #incl ...
- AtCoder Beginner Contest 118 解题报告
A - B +/- A #include <bits/stdc++.h> int main() { int a, b; std::cin >> a >> b; b ...
- AtCoder Beginner Contest 120 解题报告
为啥最近都没有arc啊... A - Favorite Sound #include <algorithm> #include <iostream> #include < ...
- AtCoder Beginner Contest 117 解题报告
果然abc都是手速场. 倒序开的qwq. D题因为忘记1e12二进制几位上界爆了一发. A - Entrance Examination 就是除一下就行了... 看样例猜题意系列. #include& ...
- AtCoder Beginner Contest 132 解题报告
前四题都好水.后面两道题好难. C Divide the Problems #include <cstdio> #include <algorithm> using names ...
- AtCoder Beginner Contest 127 解题报告
传送门 非常遗憾.当天晚上错过这一场.不过感觉也会掉分的吧.后面两题偏结论题,打了的话应该想不出来. A - Ferris Wheel #include <bits/stdc++.h> u ...
- AtCoder Beginner Contest 126 解题报告
突然6道题.有点慌.比赛写了五个.罚时爆炸.最后一个时间不太够+没敢写就放弃了. 两道题奇奇怪怪的WJ和20/20.今天的评测机是怎么了. A Changing a Character #includ ...
随机推荐
- 【转帖】Kafka入门介绍
Kafka入门介绍 https://www.cnblogs.com/swordfall/p/8251700.html 最近在看hdoop的hdfs 以及看了下kafka的底层存储,发现分布式的技术基本 ...
- pytest_参数化parametrize
前言 pytest.mark.parametrize装饰器可以实现测试用例参数化. parametrizing 1.这里是一个实现检查一定的输入和期望输出测试功能的典型例子 import pytest ...
- emmet css 缩写
css 缩写 对于CSS语法,Emmet有许多用于属性的预定义代码段.例如,您可以扩展 m 缩写以获取margin: ;代码段. 要获取 margin: 10px;您可以简单地扩展m10缩写. 需要多 ...
- elasticsearch配置文件中http.cors.x字段有哪些用途和用法
http.cors.enabled 是否支持跨域,默认为false http.cors.allow-origin 当设置允许跨域,默认为*,表示支持所有域名,如果我们只是允许某些网站能访问,那么可以使 ...
- springboot自定义消息转换器HttpMessageConverter Spring Boot - 使用Gson替换Jackson
Jackson一直是springframework默认的json库,从4.1开始,springframework支持通过配置GsonHttpMessageConverter的方式使用Gson. 在典型 ...
- Java之路---Day07
2019-10-21-23:30:24 ArrayList类[集合] What:java.util.ArrayList是大小可变的数组的实现,存储在内的数据称为元元素,此类提供一些方法来操作内部存储的 ...
- Fedora 30系统的升级方法
Fedora 30 已经发布了.你可能希望将系统升级到最新版本的 Fedora.Fedora 工作站版本有图形化升级的方法.另外,Fedora 也提供了一个命令行方法,用于将 Fedora 29 升级 ...
- Java知识回顾 (16)常用操作的Java示例
环境设置 Java 实例 – 如何编译一个Java 文件? Java 实例 – Java 如何运行一个编译过的类文件? Java 实例 - 如何执行指定class文件目录(classpath)? Ja ...
- kafka消费者问题
[] 2019-12-17 15:40:01 - [INFO] [AbstractCoordinator:542 coordinatorDead] Marking the coordinator 机器 ...
- 【夯实基础】- https和http的主要区别
HTTPS和HTTP的区别主要如下: 1.https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用. 2.http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输 ...