传送门

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

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. [转帖]征服诱人的Vagrant!

    征服诱人的Vagrant! https://www.cnblogs.com/hafiz/ 一.背景 ​ 最近要开始深入学习分布式相关的东西了,那第一步就是在自己的电脑上安装虚拟机,以前在Windows ...

  2. nginx+upsync+consul 构建动态nginx配置系统

    参考: http://www.php230.com/weixin1456193048.html  [upsync模块说明.性能评测] https://www.jianshu.com/p/76352ef ...

  3. UML交互图

    UML 交互图主要包括对象和消息两类元素,创建交互图的过程实际上就是向对象分配任务的过程,是可视化系统的交互行为. UML 交互图包括两种:序列图和协作图. 序列图:显示对象之间的关系,强调对象之间消 ...

  4. Python-07-高阶函数

    一.定义 默认满足以下两个条件中的一个就是高阶函数: 函数的传入参数是一个函数名 函数的返回值是一个函数名 二.map函数 map接收两个参数,一个函数和一个Iterable,map将接收到的函数作用 ...

  5. Ubuntu 编译安装 nginx

    有关博客: <Windows 编译安装 nginx 服务器 + rtmp 模块>.<Ubuntu 编译安装 nginx>.<Arm-Linux 移植 Nginx> ...

  6. Java爬虫https网页内容报错SSLHandshakeException信任(忽略)所有SSL证书

    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building f ...

  7. 线程并发工具类之CountDownLatch的使用及原理分析

    原文链接:http://www.studyshare.cn/blog/details/1149/1 java开发工具下载地址及安装教程大全,点这里.更多技术文章,在这里. 一.定义 CountDown ...

  8. Windows双系统

    基础概念 基础概念 Legacy:传统BIOS传输模式启动顺序:开机→BIOS初始化→BIOS自检→引导操作系统→进入系统.传统硬盘引导记录为MBR格式,MBR无法支持超过2T的硬盘.但拥有最好的兼容 ...

  9. IDEA插件:search with bing、search with baidu

    //转载请注明出处:https://www.cnblogs.com/nreg/p/11267169.html 当项目出现错误时,经常需要复制错误信息粘贴到浏览器查询,但是手动复制再粘贴太麻烦了, 因此 ...

  10. kubeadm部署高可用K8S集群(v1.14.2)

    1. 简介 测试环境Kubernetes 1.14.2版本高可用搭建文档,搭建方式为kubeadm 2. 服务器版本和架构信息 系统版本:CentOS Linux release 7.6.1810 ( ...