AtCoder Beginner Contest 352
A - AtCoder Line
给
模拟。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,x,y,z;
signed main(){
cin>>n>>x>>y>>z; if(x>y) swap(x,y);
if(x<=z&&z<=y) cout<<"Yes";
else cout<<"No";
return 0;
}
B - Typing
给
模拟。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
char s[200003],t[200003];
signed main(){
cin>>s>>t;
int pos=0;
for(int i=0;t[i];i++){
if(t[i]==s[pos]) cout<<i+1<<' ',pos++;
}
return 0;
}
C - Standing On The Shoulders
有
你可以选择
- 首先,将
巨人放在地上。巨人 的肩膀距离地面的高度为 ,头部距离地面的高度为 。 - 为了
的顺序,要把巨人 放在巨人 的肩膀上。如果巨人 的肩膀距离地面的高度是 ,那么巨人 的肩膀距离地面的高度就是 ,他们的头距离地面的高度就是 。
求最上面的巨人
贪心,显然肩膀的高度是堆叠的,而头的高度只能算一个,所以把所有肩膀加上以后再找到头到肩膀高度差最大的那个就行。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a,b,mx,ans;
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a>>b;
ans+=a,mx=max(b-a,mx);
}
cout<<ans+mx;
return 0;
}
D - Permutation Subsequence
给你一个排列
类似滑动窗口,因为要求数字连续,所以我们可以用 set 维护每连续
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
int pos[200003],a[200003];
set<int>s;
signed main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i],pos[a[i]]=i;
}
for(int i=1;i<=k;i++) s.insert(pos[i]);
auto it=s.end(); it--;
int ans=(*it)-(*(s.begin()));
for(int i=k+1;i<=n;i++){
s.erase(pos[i-k]);
s.insert(pos[i]);
it=s.end(); it--;
ans=min(ans,(*it)-(*(s.begin())));
}
cout<<ans;
return 0;
}
E - Clique Connect
给你一个加权无向图
您需要执行
- 给你一个由
个顶点组成的顶点子集 。对于每一对 ,即 和 ,在顶点 和 之间添加一条边,权重为 。
完成所有
将问题分成两部分,一是判断连通,二是求 MST。
一很好弄,因为所给的每个每个集合之间的块是连通的,直接用并查集处理。
二的话,每个集合里的边是平方级别的,而我们只需要保证连通即可求 MST,所以每个集合里的点只需要保留
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int fa[400003],k[400003],c[400003];
vector<int>a[400003];
void init(){for(int i=1;i<=n;i++)fa[i]=i;}
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
void merge(int x,int y){fa[find(x)]=find(y);}
bool query(int x,int y){return find(x)==find(y);}
int ffa[400003];
void finit(){for(int i=1;i<=n;i++)ffa[i]=i;}
int ffind(int x){return ffa[x]==x?x:ffa[x]=ffind(ffa[x]);}
void fmerge(int x,int y){ffa[ffind(x)]=ffind(y);}
bool fquery(int x,int y){return ffind(x)==ffind(y);}
struct edge{
int u,v,w,id;
bool operator<(const edge &o)const{return w<o.w;}
}e[800003];int cnt;
signed main(){
cin>>n>>m; init(); finit();
for(int i=1;i<=m;i++){
cin>>k[i]>>c[i];
for(int j=1,A;j<=k[i];j++){
cin>>A;
a[i].push_back(A);
}
for(int j=1;j<k[i];j++){
merge(a[i][j-1],a[i][j]);
e[++cnt]={a[i][j-1],a[i][j],c[i],cnt};
e[++cnt]={a[i][j],a[i][j-1],c[i],cnt};
}
}
for(int i=2;i<=n;i++){
if(!query(i,i-1)){
cout<<"-1\n";
return 0;
}
}
int ans=0;
sort(e+1,e+cnt+1);
for(int i=1;i<=cnt;i++){
if(!fquery(e[i].u,e[i].v)){
fmerge(e[i].u,e[i].v);
ans+=e[i].w;
}
}
cout<<ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效