AtCoder Beginner Contest 352 考试总结
前言#
正常发挥。属于是
得分明细:
A | B | C | D | E | F | G | Total |
---|---|---|---|---|---|---|---|
√ | √ | √ | √ | √ | × | × | 1475 |
改题明细:
A | B | C | D | E | F | G |
---|---|---|---|---|---|---|
√ | √ | √ | √ | √ | × | × |
第一次正式 rated 打 AT,行吧!
A. AtCoder Line#
Problem#
AtCoder 铁路线有
在这条线路上,有趟进站列车从
高桥站即将从
求列车在
Solve#
当
Code#
#include <bits/stdc++.h>
#define ll long long
#define H 19260817
#define rint register int
#define For(i,l,r) for(rint i=l;i<=r;++i)
#define FOR(i,r,l) for(rint i=r;i>=l;--i)
#define MOD 1000003
#define mod 1000000007
using namespace std;
inline int read() {
rint x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
void print(int x){
if(x<0){putchar('-');x=-x;}
if(x>9){print(x/10);putchar(x%10+'0');}
else putchar(x+'0');
return;
}
int n, x, y, z;
signed main() {
n = read(), x = read(), y = read(), z = read();
if(x > y) swap(x, y);
if(x <= z && z <= y) puts("Yes");
else puts("No");
return 0;
}
B. Typing#
Problem#
高桥尝试使用键盘输入由小写英文字母组成的字符串
他打字时只看键盘,不看屏幕,实际键入的字符串是
确定正确键入的字符在
Solve#
指针
Code#
#include <bits/stdc++.h>
#define ll long long
#define H 19260817
#define rint register int
#define For(i,l,r) for(rint i=l;i<=r;++i)
#define FOR(i,r,l) for(rint i=r;i>=l;--i)
#define MOD 1000003
#define mod 1000000007
using namespace std;
inline int read() {
rint x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
void print(int x){
if(x<0){putchar('-');x=-x;}
if(x>9){print(x/10);putchar(x%10+'0');}
else putchar(x+'0');
return;
}
const int N = 2e5 + 10;
int n, m;
char s[N], t[N];
signed main() {
cin >> (s + 1) >> (t + 1);
n = strlen(s + 1), m = strlen(t + 1);
int i = 1;
For(j,1,m) {
if(s[i] == t[j]) cout << j << ' ', i++;
}
return 0;
}
C. Standing On The Shoulders#
Problem#
有
你可以选择
- 首先,将巨人
放在地上。巨人 的肩膀距离地面的高度为 ,头部距离地面的高度为 。 - 为了
的顺序,要把巨人 放在巨人 的肩膀上。如果巨人 的肩膀距离地面的高度是 ,那么巨人 的肩膀距离地面的高度就是 ,他们的头距离地面的高度就是 。
求最上面的巨人
Solve#
考虑到每种排列的叠加总高度为某
则答案为:
Code#
#include <bits/stdc++.h>
#define int long long
#define H 19260817
#define rint register int
#define For(i,l,r) for(rint i=l;i<=r;++i)
#define FOR(i,r,l) for(rint i=r;i>=l;--i)
#define MOD 1000003
#define mod 1000000007
using namespace std;
inline int read() {
rint x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
void print(int x){
if(x<0){putchar('-');x=-x;}
if(x>9){print(x/10);putchar(x%10+'0');}
else putchar(x+'0');
return;
}
const int N = 2e5 + 10;
struct Node {
int a, b;
} a[N];
int n, res = 0, ans;
signed main() {
n = read();
For(i,1,n) a[i].a = read(), a[i].b = read(), res += a[i].a;
For(i,1,n) {
ans = max(ans, res - a[i].a + a[i].b);
}
cout << ans << '\n';
return 0;
}
D. Permutation Subsequence#
Problem#
给你一个
如果一个索引序列
。- 子序列
可以通过重新排列一些连续的 整数而得到。
形式上,存在一个整数 ,使得 。
求所有好的索引序列中
Solve#
记
滑动窗口求 max/min 即可。
Code#
#include <bits/stdc++.h>
#define int long long
#define H 19260817
#define rint register int
#define For(i,l,r) for(rint i=l;i<=r;++i)
#define FOR(i,r,l) for(rint i=r;i>=l;--i)
#define MOD 1000003
#define mod 1000000007
using namespace std;
inline int read() {
rint x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
void print(int x){
if(x<0){putchar('-');x=-x;}
if(x>9){print(x/10);putchar(x%10+'0');}
else putchar(x+'0');
return;
}
const int N = 2e5 + 10;
int n, k, p[N], a[N], q[N], Max[N], Min[N], ans = INT_MAX;
signed main() {
n = read(), k = read();
For(i,1,n) p[i] = read(), a[p[i]] = i;
int h = 1, t = 0;
For(i,1,n) {
while(h <= t && i - q[h] + 1 > k) h++;
while(h <= t && a[i] < a[q[t]]) t--;
q[++t] = i;
if(i >= k) {
Min[i] = a[q[h]];
}
}
h = 1, t = 0;
For(i,1,n) {
while(h <= t && i - q[h] + 1 > k) h++;
while(h <= t && a[i] > a[q[t]]) t--;
q[++t] = i;
if(i >= k) {
Max[i] = a[q[h]];
}
}
For(i,k,n) {
ans = min(ans, Max[i] - Min[i]);
}
cout << ans << '\n';
return 0;
}
E. Clique Connect#
Problem#
给你一个加权无向图
您将执行
- 给你一个由
个顶点组成的顶点子集 。对于每一对 这样的顶点 和 ,在顶点 和 之间添加一条边,边的权重为 。
完成所有
Solve#
一个组内的点与其连边组成的图必为一个团,团内两两联通,且边权相等。
考虑 kruskal,先决策边权最小的团。然后暴力团内 kruskal。
加两个限制:
- 如果当前点已经在团内联通,就不需要加边了,跳过此回合;
- 如果此时生成树的边数已经为
,结束决策;
记得先判连通,再进行决策,不然最后一点会 T 掉。(赛时没注意罚时
然后就 A 了。
Code#
#include <bits/stdc++.h>
#define int long long
#define H 19260817
#define rint register int
#define For(i,l,r) for(rint i=l;i<=r;++i)
#define FOR(i,r,l) for(rint i=r;i>=l;--i)
#define MOD 1000003
#define mod 1000000007
using namespace std;
inline int read() {
rint x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
void print(int x){
if(x<0){putchar('-');x=-x;}
if(x>9){print(x/10);putchar(x%10+'0');}
else putchar(x+'0');
return;
}
const int N = 4e5 + 10;
struct Eg {
int k, c;
} b[N];
int n, m, f[N], p[N], ans, net;
vector<int> a[N];
bool vis[N];
bool cmp(int x, int y) {
return b[x].c < b[y].c;
}
int find(int x) {
return (x == f[x] ? x : f[x] = find(f[x]));
}
signed main() {
n = read(), m = read();
For(i,1,n) f[i] = i;
For(i,1,m) {
p[i] = i;
b[i] = (Eg){read(), read()};
For(j,1,b[i].k) {
int x = read();
a[i].push_back(x);
f[find(a[i][0])] = find(a[i][a[i].size()-1]);
}
}
int res = 0;
For(i,1,n) {
if(find(i) != find(1)) res++;
}
if(res) return puts("-1"), 0;
For(i,1,n) f[i] = i;
sort(p + 1, p + m + 1, cmp);
For(i,1,m) {
int tg = i; i = p[i];
For(j,0,b[i].k-1) {
if(vis[find(a[i][j])]) continue;
For(k,j+1,b[i].k-1) {
int u = a[i][j], v = a[i][k];
int fu = find(u), fv = find(v);
if(fu == fv) continue;
f[fu] = fv; vis[fu] = 1;
ans += b[i].c; net++;
if(net == n-1) goto yzsy;
}
}
i = tg;
}
yzsy: ;
cout << ans << '\n';
return 0;
}
F. Clique Connect#
Problem#
有
在这些
- 每个人都有一个唯一的排名。
- 对于每个
,如果 的排名是 -th,而 的排名是 -th,那么就是 。
给定的输入保证了至少有一种可能的排名与给定的信息不矛盾。
回答
- 如果可以唯一确定人
的排名,则返回该排名。否则,返回 。
Solve#
Code#
G. Socks 3#
Problem#
高桥的抽屉里有各种颜色的袜子。袜子的颜色用从
他准备通过执行以下操作来选择今天要穿的袜子:
- 继续以相等的概率从箱子中每次随机抽取一只袜子,直到他能从已抽取的袜子中做出一双相同颜色的袜子为止。一旦抽到袜子,就不能再放回箱子里。
求他从箱子中抽取袜子的次数的期望值(模为
Solve#
Code#
作者:Daniel-yao
出处:https://www.cnblogs.com/Daniel-yao/p/18172801
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效