Codeforces Round 923 (Div. 3)

这是我第二次参加 cf阴间场。

10 minutes ago:

这次报名人数超过 4 万,一开始网站就崩溃了,比赛延迟了 10 分钟。。开局不顺。

2 minutes later:

cf成功地又炸了。过了 2 分钟,终于进去了。

A题

题目:
您有一个由 n 个单元格组成的水平条带。每个单元格要么是白色,要么是黑色。

您可以选择一段连续的单元格,然后将它们全部涂成白色。完成此操作后,该段中的所有黑色单元格将变为白色,而白色单元格将保持白色。

为了使所有 n 个单元格都变成白色,需要涂成白色的单元格段的最小长度是多少?
做法:模拟。
找到第一个出现和最后出现的黑色,下标相减再加 1 即可。

5 minutes later:

A题过

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll T,n,l1,l2;
string s;
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>T;
while(T--){
cin>>n>>s;
for(int i=0;i<n;i++)
if(s[i]=='B'){l1=i;break;}
for(int i=n-1;i>=0;i--)
if(s[i]=='B'){l2=i;break;}
cout<<l2-l1+1<<"\n";
}
return 0;
}

B题

题目:
波利卡普丢失了由小写拉丁字母组成的长度为 n 的字符串 s ,但他仍然保留着它的痕迹。

字符串 s 的踪迹是一个由 n 个整数组成的数组 a,其中 ai 是 si=sj 的索引 j (j < i) 的个数。例如,字符串 abracadabra 的踪迹是数组 [0,0,0,1,0,2,0,3,1,1,4]。

给定一个字符串的踪迹,从中找出个字符串 s。字符串 s 应该只由小写拉丁字母 a-z 组成。
做法:
用 vector 存字母出现次数对应的字母。
循环时每次取该次数减 1 时可以取到的字母,再存入即可。

15 minutes later:

B题过

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=2e5+10;
ll T,n,a[N];
char c,tt;
vector<char> p[N];
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>T;
while(T--){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],p[i].clear();
c='a';
for(int i=1;i<=n;i++){
if(!a[i]) cout<<(char)(c++),tt=c-1;
else{
ll t=p[a[i]-1].size();
cout<<p[a[i]-1][t-1];
tt=p[a[i]-1][t-1];
p[a[i]-1].pop_back();
}
p[a[i]].push_back(tt);
}
cout<<"\n";
}
return 0;
}

C题

题目:
给定一个由 n 个整数组成的数组 a,一个由 m 个整数组成的数组 b 和一个偶数 k。

你的任务是确定是否有可能从这两个数组中选择的 k/2 个元素,使得所选元素中包括从 1 到 k 的每一个整数。

例如如果 a=[2,3,8,5,6,5],b=[1,3,4,10,5],k=6,那么可以从数组 a 中选择值为 2,3,6 的元素,从数组 b 中选择值为 1,4,5 的元素。在这种情况下,从 1 到 6 的所有数字都将包含在所选的元素中。

如果是 a=[2,3,4,5,6,5],b=[1,3,8,10,3],k=6,则无法按照要求选择元素。

请注意,您不需要找到选择元素的方法,您的程序只需检查是否可以按要求选择元素。
做法:
先判断两个数组中的数字是否包含了 1 到 k 的所有整数。
再判断两个数组是否分别拥有 k/2 个 1 到 k 的整数即可。

29 minutes later:

C题过

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=1e6+10;
ll T,n,m,k,ct1,ct2,a,b;
bool p[N],p1[N],p2[N];
bool flag;
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>T;
while(T--){
cin>>n>>m>>k;
flag=1;ct1=ct2=0;
for(int i=1;i<=k;i++) p[i]=p1[i]=p2[i]=0;
for(int i=1;i<=n;i++) cin>>a,p[a]=1,p1[a]=1;
for(int i=1;i<=m;i++) cin>>b,p[b]=1,p2[b]=1;
for(int i=1;i<=k;i++)
if(!p[i]){flag=0;break;}
for(int i=1;i<=k;i++)
if(p1[i]) ct1++;
for(int i=1;i<=k;i++)
if(p2[i]) ct2++;
if(ct1<k/2||ct2<k/2) flag=0;
if(flag) cout<<"YES\n";
else cout<<"NO\n";
}
return 0;
}

D题

题目:
给你一个由 n 个整数组成的数组 a 和 q 个查询。

对于每个查询,你都需要在 al,al+1,…,ar 中找到一对不同的元素,或者报告不存在这样一对元素。
做法:
贪心。
要找一对不同的元素,那么找最大值和最小值。
如果最大值和最小值不同,那么就存在。
st 表正可以。题目中 n 最大 1e5,st 表并不会超时。
预处理:O(nlogn) 查询:O(1)。
那么如何记录位置呢?
可以将 st 表记录的值改为下标,递推时再改一下即可。

100 minutes later:

st 表数组大小写反了。。

喜提3发罚时。

D题过

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=2e5+10;
ll T,n,q,l,r,A[N],f[33][N],g[33][N];
ll qrymin(ll l,ll r){
ll k=log2(r-l+1);
ll a=f[k][l],b=f[k][r-(1<<k)+1];
return A[a]<A[b]?a:b;
}
ll qrymax(ll l,ll r){
ll k=log2(r-l+1);
ll a=g[k][l],b=g[k][r-(1<<k)+1];
return A[a]>A[b]?a:b;
}
void st(){
for(int i=1;i<=n;i++) f[0][i]=i,g[0][i]=i;
for(int i=1;(1<<i)<=n;i++)
for(int j=1;j+(1<<i)-1<=n;j++){
ll l=f[i-1][j],r=f[i-1][j+(1<<i-1)];
ll l2=g[i-1][j],r2=g[i-1][j+(1<<i-1)];
f[i][j]=A[l]<A[r]?l:r;
g[i][j]=A[l2]>A[r2]?l2:r2;
}
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>T;
while(T--){
cin>>n;
for(int i=1;i<=n;i++) cin>>A[i];
st();
cin>>q;
while(q--){
cin>>l>>r;
ll t1=qrymin(l,r),t2=qrymax(l,r);
if(t1==t2||A[t1]==A[t2]) cout<<"-1 -1\n";
else cout<<t1<<" "<<t2<<"\n";
}
}
return 0;
}

E题

题目:
给你两个整数 n 和 k (k<n),其中 k 是偶数。

你的任务是构造一个长度为 n 的 k 级排列。

如果在所有长度为 k 的连续线段的总和中,任意两个和相差不超过 1,那么这个排列就叫做 k 级排列。

找出长度为 n 的任意一个 k 级排列。
做法:
构造题,考虑贪心。
将数组分为 n/k 组,且向上取整。
将数字从大到小填入数组中。
要使相差不超过 1,可以让较大的数与较小的数相邻。
因此每两次掉换循环方向。

赛后 9 分钟过。。

Deepl 的翻译出了问题,看题目看了好久,最后直接看的英文。。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=2e5+10;
ll T,n,k,ct,a[N];
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>T;
while(T--){
cin>>n>>k;ct=n;
for(int i=1;i<=n;i++) a[i]=0;
for(int i=1;ct;i++)
if(i&1)
for(int j=0;j<(n+k-1)/k;j++)
if(j*k+i<=n) a[j*k+i]=(ct--);
else
for(int j=(n+k-1)/k-1;j>=0;j--)
if(j*k+i<=n) a[j*k+i]=(ct--);
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
cout<<"\n";
}
return 0;
}

n days later:

F题

题目:
给定一张 n 个点,m 条边,边有边权的无向图,无重边自环,不保证连通。定义一个简单环为不经过重复点与重复边的环路径,保证全图至少有一个简单环。记一个简单环的权值是环上最小的边权,你需要找到任意一个全图中权值最小的一个简单环并输出它。

3<=n,m<=2*10^5,w<=10^6。
做法:
考虑最小生成树的做法。

当这条边连接的点已经在同一个集合中时,就说明形成了环。

因此可以找出边的最小值。

之后找出这一条边所在的环即可。(dfs)
代码:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=4e5+10;
ll T,n,m,t,ans,ct,h[N],a[N],f[N],fa[N];
struct E{
ll u,v,w;
}e[N];
struct E2{
ll to,nxt;
}e2[N];
void init(){
for(int i=1;i<=n;i++) fa[i]=i,h[i]=f[i]=0;ct=t=ans=0;
}
bool cmp(E L,E R){
return L.w>R.w;
}
ll getfa(ll x){
return fa[x]==x?x:fa[x]=getfa(fa[x]);
}
void add(E a){
e2[++ct]={a.v,h[a.u]},h[a.u]=ct;
e2[++ct]={a.u,h[a.v]},h[a.v]=ct;
}
void dfs(ll u,ll Fa){
f[u]=Fa;
for(int i=h[u];i;i=e2[i].nxt)
if(e2[i].to!=Fa) dfs(e2[i].to,u);
}
void Ans(ll x,ll y){
a[++ans]=x;
if(x!=y) Ans(f[x],y);
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>T;
while(T--){
cin>>n>>m;
for(int i=1;i<=m;i++) cin>>e[i].u>>e[i].v>>e[i].w;
sort(e+1,e+m+1,cmp);init();
for(int i=1;i<=m;i++){
ll u=getfa(e[i].u),v=getfa(e[i].v);
if(u==v) t=i;
else fa[u]=v,add(e[i]);
}
cout<<e[t].w<<" ";
dfs(e[t].u,0);Ans(e[t].v,e[t].u);
cout<<ans<<"\n";
for(int i=1;i<=ans;i++) cout<<a[i]<<" ";
cout<<"\n";
}
return 0;
}

G

没做,待更新~

总结:

  1. 数组范围不要开错。
  2. 不要依赖于翻译~

Codeforces Round 923 (Div. 3) 比赛记录的更多相关文章

  1. Codeforces Round #606 Div. 2 比赛总结

    比赛情况 bq. A题 Wrong Answer on test 2 , E题sb题没切.bqbqbq. 比赛总结 bq. 那就直接上题解吧!^-^ A 数位dp,分类讨论,注意细节. Talk is ...

  2. Codeforces Round #605 (Div. 3) 比赛总结

    比赛情况 2h才刀了A,B,C,D.E题的套路做的少,不过ygt大佬给我讲完思路后赛后2min就AC了这题. 比赛总结 比赛时不用担心"时间短,要做多快",这样会匆匆忙忙,反而会做 ...

  3. 【cf比赛记录】Codeforces Round #601 (Div. 2)

    Codeforces Round #601 (Div. 2) ---- 比赛传送门 周二晚因为身体不适鸽了,补题补题 A // http://codeforces.com/contest/1255/p ...

  4. 【cf比赛记录】Codeforces Round #600 (Div. 2)

    Codeforces Round #600 (Div. 2) ---- 比赛传送门 昨晚成绩还好,AC A,B题,还能上分(到底有多菜) 补了C.D题,因为昨晚对C.D题已经有想法了,所以补起题来也快 ...

  5. Codeforces Round #713 (Div. 3)AB题

    Codeforces Round #713 (Div. 3) Editorial 记录一下自己写的前二题本人比较菜 A. Spy Detected! You are given an array a ...

  6. 刷题记录:Codeforces Round #734 (Div. 3)

    Codeforces Round #734 (Div. 3) 20210920.网址:https://codeforces.com/contest/1551. 编程细节:下标定义不要一会[1,n]一会 ...

  7. 刷题记录:Codeforces Round #739 (Div. 3)

    Codeforces Round #739 (Div. 3) 20210907.网址:https://codeforces.com/contest/1560. --(叹). A 不希望出现带" ...

  8. 刷题记录:Codeforces Round #724 (Div. 2)

    Codeforces Round #724 (Div. 2) 20210713.网址:https://codeforces.com/contest/1536. div2明显比div3难多了啊-只做了前 ...

  9. 刷题记录:Codeforces Round #725 (Div. 3)

    Codeforces Round #725 (Div. 3) 20210704.网址:https://codeforces.com/contest/1538. 感觉这个比上一个要难. A 有一个n个数 ...

  10. 刷题记录:Codeforces Round #719 (Div. 3)

    Codeforces Round #719 (Div. 3) 20210703.网址:https://codeforces.com/contest/1520. 没错,我是个做div3的蒟蒻-- A 大 ...

随机推荐

  1. HL7消息类型

    HL7消息有很多不同的类型,每种都有其自己的独特用途和消息内容.以下是常见的HL7消息类型的列表. Message Type Description HL7 ADT Admit, Discharge ...

  2. Python爬取网页遇到:selenium.common.exceptions.WebDriverException解决方法

    在PyCharm中写好下列程序: 一运行遇到下列报错: selenium.common.exceptions.WebDriverException: Message: 'chromedriver' e ...

  3. 力扣500(java&python)-键盘行(简单)

    题目: 给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词.键盘如下图所示. 美式键盘 中: 第一行由字符 "qwertyuiop" 组成.第 ...

  4. WebGL实现简易的局部“马赛克”

    前言 接触过Canvas的小伙伴应该都知道,在Canvas2D中我们要加载一个图片很简单,通过调用drawImage API就能将图像绘制到画布上,当然在WebGL中我们也可以绘制图像,在绘制时我们需 ...

  5. ITSM2023年十大功能趋势[采和]

    总体描述:更加人性化,引入自动化相关的设计和技术,更加实用好用.1. 100%服务目录服务目录必须完全贴合用户方的运维实际开展的 服务清单,而不是想当然的抄书或者臆想!都2023年了,还有完全不着调的 ...

  6. 数据可视化技术应用:“Python环境管理器-Anaconda”的安装

    目录 1. Python环境管理器:Anaconda 2. 在Windows上安装Anaconda 3. Anaconda和Miniconda的区别 1. Python环境管理器:Anaconda P ...

  7. windows10 64 解决 exec:"gcc" executable file not found in %PATH%报错问题

    1.下载编译好的包 https://sourceforge.net/projects/mingw-w64/files/mingw-w64/ 这里我选择64位的 2.解压完之后,配置环境变量. 解压完到 ...

  8. sh角本操作数据库

    #!/bin/bash HOST="127.0.0.1" PORT="3306" USERNAME="root" PASSWORD=&quo ...

  9. nim 9. 遍历文件夹

    import std/[os, sugar] const fs = collect(for k in walkDir(r"d:\temp"): k.path) echo fs 文件 ...

  10. fastposter v2.11.0 天花板级的海报生成器

    fastposter v2.11.0 天花板级的海报生成器 fastposter海报生成器是一款快速开发海报的工具.只需上传一张背景图,在对应的位置放上组件(文字.图片.二维.头像)即可生成海报. 点 ...