总结

  • 人生第一次掉rating
  • 各种降智操作

A

水题

B

逆天操作

WA了3发

第三次交的时候以为过了,等到切完E发现怎么B还没过(

#include<bits/stdc++.h>

using namespace std;
map<string, int> f; int main() {
f["AB"] = f["BC"] = f["CD"] = f["DE"] = f["EA"] = 1;
f["AC"] = f["BD"] = f["CE"] = f["DA"] = f["EB"] = 2;
string s1, s2;
cin >> s1 >> s2;
if(!f[s1]) swap(s1[0], s1[1]);
if(!f[s2]) swap(s2[0], s2[1]);
puts(f[s1] == f[s2] ? "Yes" : "No");
return 0;
}

C

人家题把上限都告诉你了

然后我\(O(12^3)\) 的枚举不写,写半个小时四进制枚举(

#include<bits/stdc++.h>

using namespace std;

bool check(int x) {
int a[15], len = 0;
while(x) a[++ len] = x % 4, x /= 4; for(int i = len ;i >= 1; -- i) {
if(!a[i]) return 0;
}
for(int i = len; i > 1; -- i) {
if(a[i] > a[i - 1]) return 0;
}
return a[1] == 3;
} int main() {
int n, cnt = 0;
cin >> n;
for(int i = 0; i < 1 << 24; ++ i) {
if(check(i)) ++ cnt;
if(cnt == n) {
int x = i, len = 0, a[15];
while(x) a[++ len] = x % 4, x /= 4;
for(int j = len ;j >= 1; -- j) {
cout << a[j];
}
return 0;
}
}
return 0;
}

D

以 \(1\) 为根,\(ans=n - max(size[y]\hspace{0.4cm} |\hspace{0.4cm} y \in H[1])\)

\(H[x]\) 为 \(x\) 所有儿子的集合

#include<bits/stdc++.h>

using namespace std;
const int N = 3e5 + 5; vector<int> H[N];
int fa[N], sz[N]; int dfs(int x) {
sz[x] = 1;
for(int y : H[x]) {
if(y != fa[x]) {
fa[y] = x;
sz[x] += dfs(y);
}
}
return sz[x];
} int main() {
ios :: sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int n;
cin >> n;
for(int i = 1; i < n; ++ i) {
int x, y;
cin >> x >> y;
H[x].push_back(y);
H[y].push_back(x);
}
dfs(1);
int ans = n;
for(int y : H[1]) ans = min(ans, n - sz[y]);
cout << ans;
return 0;
}

E

贪心,打每个怪用离其最近的药水

#include<bits/stdc++.h>

using namespace std;
const int N = 2e5 + 5; int n, op[N], a[N];
bool used[N]; struct Node {
int p, v;
bool operator < (const Node &x) const {
if(v != x.v) return v < x.v;
else return p > x.p;
}
}; int main() {
ios :: sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
cin >> n;
set<Node> se;
for(int i = 1; i <= n; ++ i) {
cin >> op[i] >> a[i];
if(op[i] == 1) se.insert({i, a[i]});
}
for(int i = 1; i <= n; ++ i) {
if(op[i] == 2) {
auto it = se.lower_bound({i, a[i]});
auto x = *it;
if(x.v == a[i]) {
se.erase(it);
used[x.p] = 1;
}
else return cout << -1, int();
}
}
int cur = 0, ans = 0;
for(int i = 1; i <= n; ++ i) {
if(used[i]) ++ cur;
if(op[i] == 2) -- cur;
ans = max(ans, cur);
}
cout << ans << '\n';
for(int i = 1; i <= n; ++ i) if(op[i] == 1) cout << used[i] << ' ';
return 0;
}

F

一道比较有意思的概率dp

我们令 \(f[i][j]\) 表示当前一共\(i\)个人,其中第\(j\)个人留到最后的概率

不难得到

\[f[i][j] = \frac{1}{2} \times f[i][j - 1] + \frac{1}{2} \times f[i - 1][j - 1]
\]

现在就是看边界\(f[i][1]\)怎么求,也就是要用\(f[i - 1]\)里的东西来表示\(f[i][1]\)

手动模拟一下\(n = 3\)或\(n = 4\)的情况

可以得到

\[f[i][1] = ( \sum_{j = 2}^{i} \frac{1}{2^j} \times f[i - 1][i - j + 1]) + \frac{1}{2^i} \times f[i][1]
\]

注意这里的式子是有后效性的,简单解一下方程就好了

具体实现看代码

#include<bits/stdc++.h>
#define ll long long
#define rep(i, j, k) for(int i = j; i <= k; ++ i)
#define per(i, j, k) for(int i = j; i >= k; -- i) using namespace std;
const ll P = 998244353, N = 3005; ll f[N][N], inv[N]; ll qp(ll a, ll b) {
ll ret = 1;
while(b) {
if(b & 1) ret = ret * a % P;
b >>= 1;
a = a * a % P;
}
return ret;
} ll calc(ll x) {
return qp(2, x) * qp(qp(2, x) - 1, P - 2) % P;
}
void init() {
inv[N - 1] = qp(qp(2, N - 1), P - 2);
per(i, N - 2, 0) inv[i] = inv[i + 1] * 2 % P;
f[1][1] = 1;
} int main() {
int n; cin >> n;
init();
rep(i, 2, n) {
rep(j, 2, i) f[i][1] = (f[i][1] + inv[j] * f[i - 1][i - j + 1]) % P;
f[i][1] = f[i][1] * calc(i) % P;
rep(j, 2, i) f[i][j] = inv[1] * (f[i - 1][j - 1] + f[i][j - 1]) % P;
}
rep(i, 1, n) cout << f[n][i] << ' ';
return 0;
}

AtCoder Beginner Contest 333的更多相关文章

  1. AtCoder Beginner Contest 100 2018/06/16

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

  2. AtCoder Beginner Contest 052

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

  3. AtCoder Beginner Contest 053 ABCD题

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

  4. AtCoder Beginner Contest 136

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

  5. AtCoder Beginner Contest 137 F

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

  6. AtCoder Beginner Contest 076

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

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

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

  8. AtCoder Beginner Contest 064 D - Insertion

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

  9. AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle【暴力】

    AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle 我要崩溃,当时还以为是需要什么离散化的,原来是暴力,特么五层循环....我自己写怎么都 ...

  10. AtCoder Beginner Contest 075 C bridge【图论求桥】

    AtCoder Beginner Contest 075 C bridge 桥就是指图中这样的边,删除它以后整个图不连通.本题就是求桥个数的裸题. dfn[u]指在dfs中搜索到u节点的次序值,low ...

随机推荐

  1. C# Demo 资源汇总

    1.OCR 相关OCRService Onnx版 https://lw112190.blog.csdn.net/article/details/132082357 OCRService Sdcb.Pa ...

  2. debian12安装arch到chroot环境

    纯属瞎玩,可能有风险 1.安装工具 sudo apt install pacman-package-manager arch-install-scripts archlinux-keyring 2.创 ...

  3. debootstrap 命令行安装 debian12(stable) btrfs文件系统 uefi引导 (像arch一样)

    1,制作debian12 live 启动盘 2.联网,可以手机usb共享,可以用wpasupplicant连wifi 3.修改镜像列表 sudo nano /etc/apt/source.list 修 ...

  4. #线段树#洛谷 4428 [BJOI2018]二进制

    题目 有一个长为 \(n\) 的二进制串,支持单个位置取反,对于这个二进制串的一个子区间, 求出其有多少位置不同的连续子串,满足在重新排列后(可包含前导0)是一个 3 的倍数. 分析 考虑对于单个位置 ...

  5. ES6中模块化详解

    前言 因为ES6中的模块化是将来,所以就必须有必要好好的了解一下,学习一下,这篇文章就简单总结一下ES6中模块的概念,语法和用法.纯属个人总结,不喜勿喷. 下面我将通过a.js.b.js和c.js三个 ...

  6. 在Centos 8 服务器用tmux多开窗口

    在 CentOS 服务器上使用 tmux 来多开窗口是一个高效的方式.tmux 是一个终端复用器,它允许你在一个终端窗口中打开多个终端会话,还可以在会话之间轻松切换,非常适合长时间运行程序或多任务操作 ...

  7. Python - 字典1

    字典用于存储键值对形式的数据.字典是一个有序.可更改的集合,不允许重复.从 Python 3.7 版本开始,字典是有序的.在 Python 3.6 及更早版本中,字典是无序的.字典用花括号编写,具有键 ...

  8. Qt设置窗口显示到扩展屏

    #include <QDesktopWidget> void Dialog::setDisplayPos() { QDesktopWidget *desktop = QApplicatio ...

  9. Android 开发入门(1)

    0x01 准备 (1)概述 安卓(Android)基于 Linux 内核开发的操作系统,由 Google 等领导开发. (2)版本 Android 版本号 API 发布时间 Android 14 - ...

  10. Effective Python:第1条 查询自己使用的Python版本

    命令行: python --version:通常可查看python2的版本: python3 --version:通常可查看python3的版本: 代码: import sys print(sys.v ...