AtCoder Beginner Contest 179
比赛链接:https://atcoder.jp/contests/abc179/tasks
A - Plural Form
题意
给出一个由小写字母组成的单词,如果单词以 $s$ 结尾,在单词的末尾加上 $es$,否则在单词的末尾加上 $s$ 。
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s;
cin >> s;
cout << s + (s.back() == 's' ? "es" : "s") << "\n";
return 0;
}
B - Go to Jail
题意
给出一对骰子投掷 $n$ 次的结果,问是否有连续三次两个骰子的点数相同。
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<int> x(n), y(n);
for (int i = 0; i < n; i++)
cin >> x[i] >> y[i];
for (int i = 0; i + 2 < n; i++) {
if (x[i] == y[i] and x[i + 1] == y[i + 1] and x[i + 2] == y[i + 2]) {
cout << "Yes" << "\n";
return 0;
}
}
cout << "No" << "\n";
return 0;
}
C - A x B + C
题意
给出一个正整数 $n$,问有多少不同的三元组 $(a, b, c)$ 满足 $a,b,c > 0$ 且 $a \times b + c = n$ 。
题解
枚举 $a$ 的值,与之对应的 $b$ 的最大值为 $\lfloor \frac{n}{a} \rfloor$,然后判断是否都能取到即可。
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
long long ans = 0;
for (int a = 1; a <= n; a++) {
ans += n / a - (n % a == 0);
}
cout << ans << "\n";
return 0;
}
D - Leaping Tak
题意
给出 $k$ 个区间,区间并集中的整数为每次可以选择行走的距离,问在数轴上从点 $1$ 走到点 $n$ 的路径数目。
题解
与上一场的D题类似,可以考虑如下代码:
dp[1] = 1;
for (int i = 1; i < n; i++) {
for (int j = 0; j < k; j++) {
for (int k = l[j]; k <= r[j]; k++) {
(dp[i + k] += dp[i]) %= MOD;
}
}
}
但是 $O_{(n^2k)}$ 的复杂度明显会超时。
注意到第三层循环为区间操作,所以可以考虑用差分或线段树降低复杂度。
代码一
差分,时间复杂度为 $O_{(nk)}$ 。
#include <bits/stdc++.h>
using namespace std;
constexpr int MOD = 998244353;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
cin >> n >> k;
vector<int> l(k), r(k);
for (int i = 0; i < k; i++)
cin >> l[i] >> r[i];
vector<long long> dp(2 * n + 100);
dp[1] = 1;
dp[2] = -1;
for (int i = 1; i <= n; i++) {
dp[i] += dp[i - 1];
dp[i] = (dp[i] % MOD + MOD) % MOD;
for (int j = 0; j < k; j++) {
dp[i + l[j]] += dp[i];
dp[i + r[j] + 1] -= dp[i];
}
}
cout << dp[n] << "\n";
return 0;
}
代码二
线段树,时间复杂度为 $O_{(nlog_nk)}$ 。
#include <bits/stdc++.h>
#define lson i << 1
#define rson i << 1 | 1
#define mid ((l + r) >> 1)
using namespace std;
constexpr int N = 2e5 + 100;
constexpr int MOD = 998244353;
long long sum[N << 2], lazy[N << 2];
void build(int i, int l, int r) {
if (l == r) {
sum[i] = 0;
return;
}
build(lson, l, mid);
build(rson, mid + 1, r);
sum[i] = sum[lson] + sum[rson];
}
void push_down_lazy(int i, int l, int r) {
if (lazy[i] != 0) {
(sum[lson] += lazy[i] * (mid - l + 1)) %= MOD;
(sum[rson] += lazy[i] * (r - mid)) %= MOD;
(lazy[lson] += lazy[i]) %= MOD;
(lazy[rson] += lazy[i]) %= MOD;
lazy[i] = 0;
}
}
void update(int i, int l, int r, int L, int R, int val) {
if (L <= l and r <= R) {
(sum[i] += 1LL * val * (r - l + 1) % MOD) %= MOD;
(lazy[i] += val) %= MOD;
return;
}
push_down_lazy(i, l, r);
if (L <= mid) update(lson, l, mid, L, R, val);
if (R > mid) update(rson, mid + 1, r, L, R, val);
sum[i] = (sum[lson] + sum[rson]) % MOD;
}
long long query(int i, int l, int r, int L, int R) {
if (L <= l and r <= R) {
return sum[i];
}
push_down_lazy(i, l, r);
long long res = 0;
if (L <= mid) res += query(lson, l, mid, L, R);
if (R > mid) res += query(rson, mid + 1, r, L, R);
return res % MOD;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
cin >> n >> k;
vector<int> l(k), r(k);
for (int i = 0; i < k; i++)
cin >> l[i] >> r[i];
build(1, 1, n);
update(1, 1, n, 1, 1, 1);
for (int i = 1; i <= n; i++) {
for (int j = 0; j < k; j++) {
if (i + l[j] <= n) {
update(1, 1, n, i + l[j], min(n, i + r[j]), query(1, 1, n, i, i));
}
}
}
cout << query(1, 1, n, n, n) << "\n";
return 0;
}
E - Sequence Sum
题意
$a_1 = x,\ a_{n+1} = a_n^2\ %\ m$,计算 $\displaystyle{\sum_{i=1}^n a_i}$ 。
题解
找出循环节的起点和终点即可。
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
long long n, x, m;
cin >> n >> x >> m;
const int N = min(n + 1, m + 2);
vector<int> a(N);
vector<int> vis(m);
a[1] = x;
vis[x] = 1;
long long ans = 0;
for (int i = 2; i < N; i++) {
a[i] = a[i - 1] * a[i - 1] % m;
if (vis[a[i]]) {
long long sum1 = accumulate(a.begin(), a.begin() + vis[a[i]], 0LL);
vector<int> cycle;
for (int j = vis[a[i]]; j < i; j++) {
cycle.push_back(a[j]);
}
n -= vis[a[i]] - 1;
long long sum2 = accumulate(cycle.begin(), cycle.end(), 0LL);
long long sum3 = accumulate(cycle.begin(), cycle.begin() + n % cycle.size(), 0LL);
cout << sum1 + sum2 * (n / cycle.size()) + sum3 << "\n";
return 0;
} else {
vis[a[i]] = i;
}
}
ans = accumulate(a.begin(), a.end(), 0LL);
cout << ans << "\n";
return 0;
}
F - Simplified Reversi
题意
有一个 $n \times n$ 的棋盘,棋盘中间 $(n-2) \times (n-2)$ 的方阵中为黑子,棋盘的最右列和最下行为白子。
接下来有 $q$ 次操作:
- $(1, x)$:在棋盘的第一行的 $x$ 列放置一枚白子,白字与该列最近的白子之间均变为白子
- $(2, x)$:在棋盘的第一列的 $x$ 行放置一枚白子,白字与该行最近的白子之间均变为白子
问 $q$ 操作之后还有多少个黑子。
题解
更新最左列和最上行的同时存储移动过程中黑子个数固定的列和行。(也可以直接用二维线段树但我不会)
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, q;
cin >> n >> q;
long long ans = 1LL * (n - 2) * (n - 2);
vector<int> row(n + 1), col(n + 1);
int pos_row = n, pos_col = n;
for (int i = 0; i < q; i++) {
int op, pos;
cin >> op >> pos;
if (op == 1) {
if (pos < pos_col) {
ans -= pos_row - 2;
while (pos_col > pos) col[pos_col--] = pos_row - 2;
} else {
ans -= col[pos];
}
} else {
if (pos < pos_row) {
ans -= pos_col - 2;
while (pos_row > pos) row[pos_row--] = pos_col - 2;
} else {
ans -= row[pos];
}
}
}
cout << ans << "\n";
return 0;
}
AtCoder Beginner Contest 179的更多相关文章
- AtCoder Beginner Contest 179 E - Sequence Sum (模拟)
题意:\(f(x,m)\)表示\(x\ mod\ m\),\(A_{1}=1\),而\(A_{n+1}=f(A^{2}_{n},M)\),求\(\sum^{n}_{i=1}A_{i}\). 题解:多算 ...
- AtCoder Beginner Contest 179 D - Leaping Tak (DP)
题意:给你一个数字\(n\)和\(k\)个区间,\(S\)表示所有区间的并的集合,你目前在\(1\),每次可以从集合中选择一个数字向右移动,问有多少种方法从\(1\)走到\(n\). 题解:我们从1开 ...
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- AtCoder Beginner Contest 052
没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Beginner Contest 076
A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...
- AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】
AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...
随机推荐
- #2使用html+css+js制作网站教程 测试
#2使用html+css+js制作网站教程 测试 本系列链接 1 测试 1.1 运行 1.2 审查 1.3 审查技巧 1.4 其他 引言: 编写完代码后就要上机测试代码,获得用户体验,筛选bug 笔者 ...
- java环境配置-win10(傻瓜式教程)
java环境配置 – 小学弟要开始学java了,由于本人较懒,表达能力有限,所以来这,写一篇简单的指导,帮学弟装下java环境. 首先打开浏览器,输入这个网址https://www.oracle.co ...
- Spring源码深度解析之事务
Spring源码深度解析之事务 目录 一.JDBC方式下的事务使用示例 (1)创建数据表结构 (2)创建对应数据表的PO (3)创建表和实体之间的映射 (4)创建数据操作接口 (5)创建数据操作接口实 ...
- Nacos使用和注册部分源码介绍
Nacos简单介绍 Nacos致力于帮助您发现.配置和管理微服务.Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流量管理.Nacos帮助您更敏捷和容易地构建. ...
- MySQL全面瓦解17:触发器相关
关于触发器 现实开发中我们经常会遇到这种情况,比如添加.删除和修改信息的时候需要记录日志,我们就要在完成常规的数据库逻辑操作之后再去写入日志表,这样变成了两步操作,更复杂了. 又比如删除一个人员信息的 ...
- 奇技淫巧,还是正统功夫? - Python推导式最全用法
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...
- C++:I/O流的概念和流类库的结构
一.C++输入输出包含以下三个方面的内容: 对系统指定的标准设备的输入和输出.即从键盘输入数据,输出到显示器屏幕.这种输入输出称为标准的输入输出,简称标准I/O. 以外存磁盘文件为对象进行输入和输出, ...
- Java安全之Weblogic 2018-3248分析
Java安全之Weblogic 2018-3248分析 0x00 前言 基于前面的分析,后面的还是主要看补丁的绕过方式,这里就来简单的记录一下. 0x01 补丁分析 先来看看补丁细节 private ...
- 2V升3V芯片,输入2V输出3V可达1A
PW5328B是一个恒定频率, 6引脚 SOT23电流模式升压转换器,用于小型低功耗应用. PW5328B的开关频率为 1.2MHz,允许使用微小的.低成本的电容器和电感器.内部软启动导致小涌流和延长 ...
- [CPP] STL 简介
STL 即标准模板库(Standard Template Library),是 C++ 标准库的一部分,里面包含了一些模板化的通用的数据结构和算法.STL 基于模版的实现,因此能够支持自定义的数据结构 ...