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 ...
随机推荐
- codeforces --- Round #250 (Div. 2) B. The Child and Set
<传送门> [题目大意] 给你一个sum和一个limit,现在要你在1~limit中找到一些数来使得这些数的和等于sum,如果能找到的话就输出找到的数的个数和这些数,未找到输出" ...
- 洛谷P2048 [NOI2010]超级钢琴 题解
2019/11/14 更新日志: 近期发现这篇题解有点烂,更新一下,删繁就简,详细重点.代码多加了注释.就酱紫啦! 正解步骤 我们需要先算美妙度的前缀和,并初始化RMQ. 循环 \(i\) 从 \(1 ...
- CKEditor图片上传问题(默认安装情况下编辑器无法处理图片),通过Base64编码字符串解决
准备做一个文章内容网站,网页编辑器采用CKEditor,第一次用,默认安装情况下,图片无法插入,提示没有定义上传适配器(adapter),错误码提示如下: 根据提示,在官网看到有两种途径:一使用CKE ...
- 深度学习-生成对抗网络GAN笔记
生成对抗网络(GAN)由2个重要的部分构成: 生成器G(Generator):通过机器生成数据(大部分情况下是图像),目的是“骗过”判别器 判别器D(Discriminator):判断这张图像是真实的 ...
- windows中端口查看&关闭进程
在一些情况下遇到的端口占用问题解决: 1.查看端口占用情况 命令:netstat -ano 命令:netstat -ano | findstr 需要释放的端口号 2.查看某端口的占用进程 命令:tas ...
- eclipse不提示问题
按照上面截图输入26个字母大小写,即可.
- C# vb .net图像合成-合成艺术字 照片合成艺术字
在.net中,如何简单快捷地实现图像合成呢,比如合成文字,合成艺术字,多张图片叠加合成等等?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码 ...
- Java自学-Scanner类
使用Scanner读取数据 System.out.println("") 用于向控制台输出数据. 我们还需要从控制台输入数据,所以需要用到Scanner类. 步骤 1 : 使用Sc ...
- 为什么UDP有时比TCP更有优势?
随着网络技术飞速发展,网速已不再是传输的瓶颈,UDP协议以其简单.传输快的优势,在越来越多场景下取代了TCP.1.网速的提升给UDP稳定性提供可靠网络保障 CDN服务商Akamai(NASDAQ: A ...
- git恢复已删的分支
git恢复已经删除的分支 执行git命令, 找回之前提交的commit git log -g 执行效果 commit 80fd3a3e1abeab52030ee9f6ec32b5c815de20a9 ...