第二次ak,纪念一下。

比赛链接:https://atcoder.jp/contests/abc183/tasks

A - ReLU

题解

模拟。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int x;
cin >> x;
cout << (x >= 0 ? x : 0) << "\n";
return 0;
}

B - Billiards

题解

过两点向 \(x\) 轴作垂线,由两个直角三角形相似得:

\[\frac{x - sx}{gx - x} = \frac{sy}{gy}
\]

移项展开得:

\[(gy + sy) \times x = sy \times gx + sx \times gy
\]

即:

\[x = \frac{sy \times gx + sx \times gy}{gy + sy}
\]

Tips

要求误差小于 \(10^{-6}\) ,所以至少要输出小数点后 \(6\) 位。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout << fixed << setprecision(6);
double sx, sy, gx, gy;
cin >> sx >> sy >> gx >> gy;
cout << (sy * gx + sx * gy) / (sy + gy) << "\n";
return 0;
}

C - Travel

题解

枚举所有情况即可。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
cin >> n >> k;
vector<vector<int>> a(n, vector<int>(n));
for (auto &v : a)
for (auto &x : v) cin >> x;
int ans = 0;
vector<int> p(n);
iota(p.begin(), p.end(), 0);
do {
if (p[0] != 0) continue;
int sum = a[p[n - 1]][p[0]];
for (int i = 1; i < n; i++) sum += a[p[i - 1]][p[i]];
if (sum == k) ++ans;
} while (next_permutation(p.begin(), p.end()));
cout << ans << "\n";
return 0;
}

D - Water Heater

题解

差分。

代码

#include <bits/stdc++.h>
using namespace std;
constexpr int N = 2e5 + 10;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, w;
cin >> n >> w;
vector<long long> cnt(N);
for (int i = 0; i < n; i++) {
int s, t, p;
cin >> s >> t >> p;
cnt[s] += p;
cnt[t] -= p;
}
bool ok = cnt[0] <= w;
for (int i = 1; i < N; i++) {
cnt[i] += cnt[i - 1];
if (cnt[i] > w) ok = false;
}
cout << (ok ? "Yes" : "No") << "\n";
return 0;
}

E - Queen on Grid

题解

模拟做法:对于每个不为 '#' 的点,将水平、垂直、对角线上可达的点都加上走到当前点的方案数

for (int x = i + 1; x <= h and MP[x][j] == '.'; x++) {
dp[x][j] += dp[i][j];
}
for (int y = j + 1; y <= w and MP[i][y] == '.'; y++) {
dp[i][y] += dp[i][j];
}
for (int x = i + 1, y = j + 1; x <= h and y <= w and MP[x][y] == '.'; x++, y++) {
dp[x][y] += dp[i][j];
}

为了避免超时可以分别将三个方向用差分维护。

代码

#include <bits/stdc++.h>
using namespace std;
constexpr int N = 2010;
constexpr int MOD = 1e9 + 7; char MP[N][N]; int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int h, w;
cin >> h >> w;
for (int i = 1; i <= h; i++) {
for (int j = 1; j <= w; j++) {
cin >> MP[i][j];
}
}
vector<vector<long long>> dp(N, vector<long long>(N));
vector<vector<long long>> row(N, vector<long long>(N));
vector<vector<long long>> col(N, vector<long long>(N));
vector<vector<long long>> diag(N, vector<long long>(N));
dp[1][1] = 1;
for (int i = 1; i <= h; i++) {
for (int j = 1; j <= w; j++) {
if (MP[i][j] == '#') continue;
(row[i][j] += row[i - 1][j]) %= MOD;
(col[i][j] += col[i][j - 1]) %= MOD;
(diag[i][j] += diag[i - 1][j - 1]) %= MOD;
(dp[i][j] += row[i][j] + col[i][j] + diag[i][j]) %= MOD;
if (MP[i + 1][j] == '.') row[i + 1][j] += dp[i][j];
if (MP[i][j + 1] == '.') col[i][j + 1] += dp[i][j];
if (MP[i + 1][j + 1] == '.') diag[i + 1][j + 1] += dp[i][j];
}
}
cout << dp[h][w] << "\n";
return 0;
}

F - Confluence

题解

并查集+启发式合并。

Tips

  • 为了避免超时需要始终用大堆合并小堆,最坏时间复杂度为 \(O_{((\frac{n}{2} + \frac{n}{4} + \frac{n}{8} + \dots )log_n)}\) ,用小堆合并大堆复杂度可能达到 \(O_{(n^2log_n)}\) 。
  • map<int, int> mp[N] 快于 map<int, map<int, int>> mp

代码

#include <bits/stdc++.h>
using namespace std;
constexpr int N = 2e5 + 100; int n, q;
int fa[N], clas[N];
map<int, int> son_num[N]; int Find(int x) {
return fa[x] == x ? fa[x] : fa[x] = Find(fa[x]);
} void Union(int x, int y) {
x = Find(x);
y = Find(y);
if (x != y) {
if (son_num[x].size() < son_num[y].size()) swap(x, y);
fa[y] = x;
for (const auto &[_class, num] : son_num[y]) {
son_num[x][_class] += num;
}
}
} void Init() {
for (int i = 0; i < N; i++) {
fa[i] = i;
}
} int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
Init();
cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> clas[i];
son_num[i][clas[i]] = 1;
}
for (int i = 0; i < q; i++) {
int op, x, y;
cin >> op >> x >> y;
if (op == 1) {
Union(x, y);
} else {
cout << son_num[Find(x)][y] << "\n";
}
}
return 0;
}

AtCoder Beginner Contest 183的更多相关文章

  1. AtCoder Beginner Contest 183 E - Queen on Grid (DP)

    题意:有一个\(n\)x\(m\)的棋盘,你需要从\((1,1)\)走到\((n,m)\),每次可以向右,右下,下走任意个单位,\(.\)表示可以走,#表示一堵墙,不能通过,问从\((1,1)\)走\ ...

  2. AtCoder Beginner Contest 100 2018/06/16

    A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...

  3. AtCoder Beginner Contest 052

    没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...

  4. AtCoder Beginner Contest 053 ABCD题

    A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...

  5. AtCoder Beginner Contest 136

    AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...

  6. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  7. AtCoder Beginner Contest 076

    A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...

  8. AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】

    AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...

  9. AtCoder Beginner Contest 064 D - Insertion

    AtCoder Beginner Contest 064 D - Insertion Problem Statement You are given a string S of length N co ...

随机推荐

  1. ContactCollections Design Report

    通讯录的设计采用了分层+接口+面向对象+文件操作+方法实现 分三层实现,共使用了四个包,实现业务数据访问和界面的分离     contactaccess包实现对文件的访问         包括数据访问 ...

  2. SpringBoot入门及深入

    一:SpringBoot简介 当前互联网后端开发中,JavaEE占据了主导地位.对JavaEE开发,首选框架是Spring框架.在传统的Spring开发中,需要使用大量的与业务无关的XML配置才能使S ...

  3. openstack octavia的实现与分析(二)原理,架构与基本流程

    [了解] 其实说白了,Octavia就是将用户的API请求经过逻辑处理,转换成Haproxy或者Nginx的配置参数,下发到amphora虚机中. Octavia的内部实现中,逻辑流程的处理主要使用T ...

  4. 一网打尽,一文讲通虚拟机VirtualBox及Linux使用

    本文将从虚拟机的选择.安装.Linux系统安装.SSH客户端工具使用四个方面来详细介绍Linux系统在虚拟机下的安装及使用方法,为你在虚拟机下正常使用Linux保驾护航. 1.虚拟机的选择 在讲虚拟机 ...

  5. 【C++】《C++ Primer 》第六章

    第六章 函数 一.函数基础 函数定义:包括返回类型.函数名字和0个或者多个形参(parameter)组成的列表和函数体. 调用运算符:调用运算符的形式是一对圆括号 (),作用于一个表达式,该表达式是函 ...

  6. LeetCode237 删除链表中的节点

    请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = [4,5,1,9],它可以表示为: 4 -> 5 -> 1 - ...

  7. Shiro的认证与授权

    shiro实战教程 一.权限管理 1.1什么是权限管理 基本上涉及到用户参与的系统都需要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以 ...

  8. PMP知识领域

    · 十大知识领域 整合-项目整合管理 识别.定义.组合.统一和协调个项目管理过程组的各种过程和活动而展开的活动与过程. 整合:统一.合并.沟通和简历联系:贯穿项目始终 七个过程组 一.制定项目章程(启 ...

  9. char什么时候会用空格进行填充?

    char什么时候会用空格进行填充?

  10. VSCode运行时弹出powershell

    问题 安装好了vscode并且装上code runner插件后,运行代码时总是弹出powershell,而不是在vscode底部终端 显示运行结果. 解决方法 打开系统cmd ,在窗口顶部条右击打开属 ...