传送门

写了四个题就跑去打球了。第五题应该能肝出来的。

A - Airplane

#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 ;
}

B - Balance

看错题意了。。改的时候就直接暴力了一发。。

#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 ;
}

C - Typical Stairs

题意:走台阶,一次走一至两个台阶,有些台阶是坏的,问走到第$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 ;
}

D - Lamp

题意:一个网格,有些地方是墙,问在哪个没有墙的地方放个灯,灯能照射的范围最远,灯能往上下左右延伸

思路:刚开始傻逼傻逼的对每个点往四个方向延伸,然后就获得了一个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 ;
}

E - Sum Equals Xor

题意:给一个二进制数$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 解题报告的更多相关文章

  1. AtCoder Beginner Contest 122 解题报告

    手速选手成功混进rated only里面的前30名,但是总排名就到110+了... A - Double Helix #include <bits/stdc++.h> #define ll ...

  2. AtCoder Beginner Contest 146解题报告

    题目地址 https://atcoder.jp/contests/abc146/tasks 感觉没有什么有意思的题... 题解 A #include <bits/stdc++.h> usi ...

  3. Atcoder Beginner Contest 124 解题报告

    心态爆炸.本来能全做出来的.但是由于双开了Comet oj一个比赛,写了ABC就去搞那个的B题 还被搞死了. 回来写了一会D就过了.可惜比赛已经结束了.真的是作死. A - Buttons #incl ...

  4. AtCoder Beginner Contest 118 解题报告

    A - B +/- A #include <bits/stdc++.h> int main() { int a, b; std::cin >> a >> b; b ...

  5. AtCoder Beginner Contest 120 解题报告

    为啥最近都没有arc啊... A - Favorite Sound #include <algorithm> #include <iostream> #include < ...

  6. AtCoder Beginner Contest 117 解题报告

    果然abc都是手速场. 倒序开的qwq. D题因为忘记1e12二进制几位上界爆了一发. A - Entrance Examination 就是除一下就行了... 看样例猜题意系列. #include& ...

  7. AtCoder Beginner Contest 132 解题报告

    前四题都好水.后面两道题好难. C Divide the Problems #include <cstdio> #include <algorithm> using names ...

  8. AtCoder Beginner Contest 127 解题报告

    传送门 非常遗憾.当天晚上错过这一场.不过感觉也会掉分的吧.后面两题偏结论题,打了的话应该想不出来. A - Ferris Wheel #include <bits/stdc++.h> u ...

  9. AtCoder Beginner Contest 126 解题报告

    突然6道题.有点慌.比赛写了五个.罚时爆炸.最后一个时间不太够+没敢写就放弃了. 两道题奇奇怪怪的WJ和20/20.今天的评测机是怎么了. A Changing a Character #includ ...

随机推荐

  1. ES6常用的新特性

    1.Let&const <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  2. php怎么遍历关联和索引数组

    foreach $arr = ['a' => 1, 2, 3]; foreach($arr as $key => $value){ // } for $arr = [0, 1, 2, 3] ...

  3. Django-11-Form组件

    1. 概述 Django的Form组件一般功能有: 验证用户输入 生成html代码 返回错误信息 创建Form类 from django.shortcuts import render, redire ...

  4. docker关系图解析

    docker关系图解析 一.docker有5种状态 Dockerfile 文本文件,制作images的配置文件 images image,静态文件 containers container image ...

  5. Python入门 常量 注释 基础数据类型 用户输入 流程控制

    Python入门 一.常量 在Python中,不像其他语言有绝对的常量,修改会报错,在Python中有个约定俗成的规定--常量就是将变量名大写. 尽量保持不更改的一种量 , 这个常量有是干什么的呢 其 ...

  6. Typora使用技巧系列:(1)

    Typora使用技巧(1) 刚刚开了博客怎么说也要学一下markdown语法什么的吧,使用的是编译器是Typora,之后有空会陆续更新的 切换到源代码模:(ctrl + /)临时切换到源代码模式,再按 ...

  7. C# 单元测试学习笔记

    1.什么是单元测试         2.单元测试的好处 (1)协助程序员尽快找到代码中bug的具体位置 (2)能够让程序员对自己的程序更有自信 (3)能够让程序员在提交项目之前就将代码变的更加的强壮 ...

  8. FlaskCBV视图类

    路由视图类 from flask import Flask app = Flask(name) 视图类 Views文件 看views源码 继承最后一个类 导入CBV的视图基类 from flask i ...

  9. DameWare入侵

    下载Dameware 去官网下载Dameware,并安装 添加被控端ip 选择Mini连接方式 安装服务到被控端 安装前配置,点击"Install"按钮 如图所示,将选项勾选,并点 ...

  10. Android为TV端助力之热修复原理

    通过源码我们知道Android加载类是通过ClassLoad类里面的findClass先去查找的,如下图所示 通过看源码我们知道,ClassLoad是一个抽象类,它本身并没有实现findclass() ...