传送门

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

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. Scala Spark WordCount

    Scala所需依赖 <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-l ...

  2. 向Spring 容器中注入对象的几种方法

    1.使用@Bean 注解,用于注入第三方 jar 包到SpringIOC容器中. 2.使用 @Import({Order.class, Member.class, MyImportBeanDefini ...

  3. Go内存分配器可视化指南【译】【精】

    当我第一次开始尝试理解 Go 语言的内存分配器时,整个过程让我抓狂.一切看起来都像一个神秘的黑盒子.因为几乎所有技术魔法(technical wizardry)都隐藏在抽象之下,所以你需要一层一层的剥 ...

  4. c# js 时间

    DateTime GetTime(double timeStamp) { DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new Dat ...

  5. SQL Server安装教程(超详细)

    具体教程:https://zijian1998.github.io/2018/03/14/Microsoft%20SQL%20Server%202017%E4%B8%8B%E8%BD%BD%E5%AE ...

  6. sdcard不可执行.

    Possibly you placed it on your sdcard -- which is mounted with the noexec flag. You either need to m ...

  7. js对象及函数(四)

    一.对象1.函数对象的创建方法一:使用new构造函数去创建构造函数对象eg: var obj = new Object(); //向对象里面添加属性或方法 obj.name = 'nzc'; obj. ...

  8. jquery datatable如何动态分页

    展开全部 一.分页 分页的基本思想是根据datatable的页码及每页显示的行数,将数据从数据库分段提出,然后再填充到表格中,以达到分页的效果. 这里需要用到datatable插件的几个属性: &qu ...

  9. Java基础 StringBuffer、StringBuilder原理浅析

    StringBuilder与StringBuffer作用就是用来处理字符串,但String类本身也具备很多方法可以用来处理字符串,那么为什么还要引入这两个类呢? 首先看下面的例子 public sta ...

  10. sql server快捷键添加

    工具--选项--键盘 sp_table_column_info p_helpindex sp_sql