AtCoder ABC 183

2023-12-27 10:36
文章标签 atcoder abc 183

本文主要是介绍AtCoder ABC 183,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本期考察STL的性质较多,如果熟悉的话基本可以秒掉

C - Travel

简单的搜索问题,练手

#define _CRT_SECURE_NO_WARNINGS#include <iostream>
#include <string>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <algorithm>
#define LT(x) (x * 2)
#define RT(x) (x * 2 + 1)using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef vector<int> vi;int n, K;
int w[10][10];
bool vis[10];
int ans = 0;void dfs(int step, int u, int val) {if (step == n - 1) {if (val + w[u][0] == K)ans += 1;return;}for (int v = 0; v < n; ++v) {if (vis[v] == 0) {vis[v] = 1;dfs(step + 1, v, val + w[u][v]);vis[v] = 0;}}
}int main() { //freopen("in.txt", "r", stdin);scanf("%d%d", &n, &K);for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {scanf("%d", &w[i][j]);}}vis[0] = 1;dfs(0, 0, 0);printf("%d\n", ans);return 0;
}

D - Water Heater

模拟,会排序就能做
用map来记录当前时间点的操作,每个时间点的操作完毕检查

#define _CRT_SECURE_NO_WARNINGS#include <iostream>
#include <string>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <algorithm>
#define LT(x) (x * 2)
#define RT(x) (x * 2 + 1)using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef vector<int> vi;LL n, W;
map<LL, vector<pair<LL, LL>>> orders;int main() { //freopen("in.txt", "r", stdin);scanf("%lld%lld", &n, &W);set<LL> ts;for (int i = 0; i < n; ++i) {LL s, t, w;scanf("%lld%lld%lld", &s, &t, &w);orders[s].push_back({ 1, w });orders[t].push_back({ 2, w });ts.insert(s);ts.insert(t);}vi ti(ts.begin(), ts.end());sort(ti.begin(), ti.end());bool ac = 1;LL cur = 0;for (auto x : ti) {for (auto &item : orders[x]) {if (item.first == 1) {cur += item.second;}else {cur -= item.second;}}if (cur > W) {ac = 0;break;}}if (ac) {printf("Yes\n");}else {printf("No\n");}return 0;
}

E - Queen on Grid

由于可以走任意步,实际上就是在三个方向上求前缀和

#define _CRT_SECURE_NO_WARNINGS#include <iostream>
#include <string>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <algorithm>
#define LT(x) (x * 2)
#define RT(x) (x * 2 + 1)using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef vector<int> vi;int H, W;
char s[2005][2005];
LL dp[2002][2002];
LL row_dp[2002][2002];      // sum
LL col_dp[2002][2002];
LL dia_dp[2002][2002];
LL mod = LL(1e9) + 7;int main() { //freopen("in.txt", "r", stdin);scanf("%d%d", &H, &W);for (int i = 0; i < H; ++i) {scanf("%s", s[i]);}dp[0][0] = 1;row_dp[0][0] = col_dp[0][0] = dia_dp[0][0] = 1;for (int i = 0; i < H; ++i) {for (int j = 0; j < W; ++j) {if (i + j == 0) continue;if (s[i][j] == '#') continue;if (i - 1 >= 0) dp[i][j] += col_dp[i - 1][j];if (j - 1 >= 0) dp[i][j] += row_dp[i][j - 1];if (i - 1 >= 0 && j - 1 >= 0) dp[i][j] += dia_dp[i - 1][j - 1];dp[i][j] %= mod;col_dp[i][j] = row_dp[i][j] = dia_dp[i][j] = dp[i][j];if (i - 1 >= 0)col_dp[i][j] = (col_dp[i - 1][j] + col_dp[i][j]) % mod;if (j - 1 >= 0)row_dp[i][j] = (row_dp[i][j - 1] + row_dp[i][j]) % mod;if (i - 1 >= 0 && j - 1 >= 0)dia_dp[i][j] = (dia_dp[i - 1][j - 1] + dia_dp[i][j]) % mod;}}LL ans = dp[H - 1][W - 1];printf("%lld\n", ans);return 0;
}

F - Confluence

并查集是并查集,但是在并查集里进行分类操作。乍一看是 O ( N 2 ) O(N^2) O(N2)操作。实际上如果并到最后,并没有那么多的并操作。具体的时间复杂度待研究。。。。
用一个map[i][j]来记录第i个组去上j课的人数。并查集操作的时候小集加入大集。

#define _CRT_SECURE_NO_WARNINGS#include <iostream>
#include <string>
#include <cstring>
#include <climits>
#include <cstdlib>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <algorithm>
#define LT(x) (x * 2)
#define RT(x) (x * 2 + 1)using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
typedef vector<int> vi;map<int, int> cnt[200020];
int n, q;
int c[200020];
int lev[200020];
int fa[200020];int getf(int x) {if (x == fa[x]) return x;return fa[x] = getf(fa[x]);
}int main() { //freopen("in.txt", "r", stdin);scanf("%d%d", &n, &q);for (int i = 1; i <= n; ++i) {scanf("%d", c + i);cnt[i][c[i]] = 1;}for (int i = 1; i <= n; ++i)fa[i] = i, lev[i] = 1;for (int i = 0; i < q; ++i) {int op, u, v;scanf("%d%d%d", &op, &u, &v);if (op == 1) {int fu = getf(u), fv = getf(v);if (fu == fv) continue;if (lev[fu] <= lev[fv]) {swap(fu, fv);}fa[fv] = fu;if (lev[fu] == lev[fv])lev[fu] += 1;for (auto it : cnt[fv]) {int ci = it.first;cnt[fu][ci] += it.second;}}else {int fu = getf(u);printf("%d\n", cnt[fu][v]);}}return 0;
}

这篇关于AtCoder ABC 183的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/542843

相关文章

AtCoder Beginner Contest 370 Solution

A void solve() {int a, b;qr(a, b);if(a + b != 1) cout << "Invalid\n";else Yes(a);} B 模拟 void solve() {qr(n);int x = 1;FOR(i, n) FOR(j, i) qr(a[i][j]);FOR(i, n) x = x >= i ? a[x][i]: a[i][x];pr2(

AtCoder Beginner Contest 369 D - Bonus EXP 动态规划

原题链接: https://atcoder.jp/contests/abc369/tasks/abc369_d 思路:   这道题为什么要用动态规划呢,其实,对于第i个怪物,我们有打与不打两种处理方式,而对于打,我们是获得两倍的经验值,还是一倍的经验值,与我们打了奇数只怪物还是打了偶数只怪物有关了,因此我们定义dp[i][0] 为前i只怪物总共打了偶数次,dp[i][1] 为前i只怪物总

js中怎样对“abc”进行MD5、sha256哈希计算?

在 JavaScript 中,可以使用 CryptoJS 库来进行 MD5 哈希计算。首先,你需要在 HTML 文件中导入 CryptoJS 库,例如: <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script> 然后,在 JavaScript 文件中,可

2024国赛数学建模ABC题思路模型

完整的思路模型请查看文末名片 完整的思路模型请查看文末名片 完整的思路模型请查看文末名片

【ZOJ】3881 From the ABC conjecture【暴力容斥】

传送门:【ZOJ】3881 From the ABC conjecture 复杂度大概 O(N0.67) O(N^{0.67}),我也不会算www,首先转换一下(我们是根据积性函数打表找规律得到的,也可以推出来)使得: g(N)=∏pi ϵ N(pia+1) g(N)=\prod_{pi~\epsilon ~N} (pi^a+1) 暴力展开发现贡献为: h(N)=

题解AtCoder ABC 358 F Easiest Maze

一道模拟题。 思路 最短的路线是直接竖着走下来,经过 n n n 个格子,所以 k k k 最小是 n n n。如果想要延长路线,可以采用九转大肠的形状,就像这样: 可以发现,每次向左走之后都必须走回来,所以每次新经过的格子数是偶数,得到 k − n k-n k−n 是偶数才有可行的方案。 首先,把整张图表的初始状态设为如下形式(即每个格点都是独立的): +++++S++o|o|o

AtCoder Beginner Contest 369 ABCDE

背景 无 A题:369  思路 假设A<=B 分类讨论,有如下两种情况         1.A==B,情况唯一,另外一个数只能取A         2.A<B,首先我们可以以B-A为公差d构造,另外一个数可以取A-d或者B+d。(然后接着考虑放在A和B中间的情况,样例中给了,只要B-A为偶数即可) 代码 inline void solve() {int a, b; cin >>

面试算法题:三线程循环打印ABC

面试遇到三线程循环打印ABC的题目,当时没写出来,然后经过查阅,进行整理了一下。 1、题目 有A、B、C 三个线程,A线程 输出“A”,B线程 输出“B”,C线程 输出“C”,要求同时启动3个线程,按照顺序输出“ABC”,循环10次,请使用代码实现。 2、问题分析 A、B、C 三个线程;这表示我们要使用多线程同步,有人说了这不废话吗。是的,笔者只是想说,多线程的实现,有几种方式,①继承Th

AtCoder Beginner Contest 369 A~E

封面原图 画师かにょこ AtCoder Beginner Contest 369 我愿称之为等差数列场 A - 369 题意 给两个数,问能和他们构成等差数列的数有多少个 代码 #include <bits/stdc++.h>#define mod 998244353using namespace std;typedef long long ll;typed

AtCoder Beginner Contest 366(D~E题解)

闲来无事去vp了一下之前放假没打的比赛,感觉需要总结的也就这两题吧,a,c都是水题,b只不过是实现有一点难,并不是很难写,d是一个需要自己推的三维前缀和,e也是一种前缀和,我当时没想到,看了大犇的代码才知道还能这么做 D - Cuboid Sum Query 题意:给你一个三维数组,然后给你q次询问,每次询问有一个起始位置和终止位置,然后问你这个的三维前缀和是什么 思路:用容斥原理推出三