ABC371
呜呜呜,第一次打完完整的 ABC。才打了 2000 多名,太菜了。(
A - Jiro
十分简单,分讨即可。
点击查看代码
#include <iostream>
#include <cstdio>
using namespace std;
char a,b,c;
int main(){
cin>>a>>b>>c;
if(a=='>'){
if(b=='>'){
if(c=='>')cout<<"B"<<endl;
if(c=='<')cout<<"C"<<endl;
}
if(b=='<'){
if(c=='>')cout<<"A"<<endl;
if(c=='<')cout<<"A"<<endl;
}
}
if(a=='<'){
if(b=='>'){
if(c=='>')cout<<"A"<<endl;
if(c=='<')cout<<"A"<<endl;
}
if(b=='<'){
if(c=='>')cout<<"C"<<endl;
if(c=='<')cout<<"B"<<endl;
}
}
return 0;
}
时间复杂度
B - Taro
用一个数组记录每个家庭是否生过一个男孩。
如果是女的直接输出 no
,否则查看数组是否标记,然后做判断。
点击查看代码
#include <iostream>
#include <cstdio>
using namespace std;
const int N=105;
int n,m,mk[N];
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
char f;int x;
cin>>x>>f;
if(f=='F')cout<<"No"<<endl;
else{
if(mk[x])cout<<"No"<<endl;
else cout<<"Yes"<<endl,mk[x]=1;
}
}
return 0;
}
时间复杂度
C - Make Isomorphic
终于不再入门。不过依然十分简单。
“同构”的关系比较难处理,不过我们可以这样理解同构:
给每个
排列
计算方案的花费非常简单,先将原图使用邻接矩阵存储下来,枚举邻接矩阵上的每个位置,如果存在没某个位置
全排列可以用 STL 中的 next_permutation
函数来实现。
点击查看代码
#include <iostream>
#include <algorithm>
using namespace std;
int p[10],n,w[10][10],h[10][10],m,ans=1e9+10,a[10][10];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
p[i]=i;
}
cin>>m;
for(int i=1,u,v;i<=m;i++){
cin>>u>>v;
w[u][v]=w[v][u]=1;
}
cin>>m;
for(int i=1,u,v;i<=m;i++){
cin>>u>>v;
h[u][v]=h[v][u]=1;
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
cin>>a[i][j];
a[j][i]=a[i][j];
}
}
while(1){
int res=0;
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if(w[i][j]!=h[p[i]][p[j]])res+=a[p[i]][p[j]];
}
}
ans=min(ans,res);
if(!next_permutation(p+1,p+1+n))break;
}
cout<<ans<<endl;
return 0;
}
时间复杂度
D - 1D Country
感觉比上一题还简单,不过有一点细节。
静态查询区间和,显然可以用前缀和。
下标过大,可以离散化,然后二分查找,因为题目限制,实现起来非常简单。
注意二分的边界问题,如果不存在一个村庄位置小于当前查询的
否则二分查找第一个大于等于 lower_bound
和 upper_bound
实现。
点击查看代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N=2e5+10;
typedef long long ll;
ll n,q,x[N],s[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",x+i);
}
for(int i=1;i<=n;i++){
scanf("%lld",s+i);
s[i]+=s[i-1];
}
scanf("%d",&q);
for(int i=1;i<=q;i++){
ll l,r;
scanf("%lld %lld",&l,&r);
if(l>x[n]||r<x[1])printf("0\n");
else{
l=(lower_bound(x+1,x+1+n,l)-x)-1;
r=(upper_bound(x+1,x+1+n,r)-x)-1;
printf("%lld\n",s[r]-s[l]);
}
}
return 0;
}
时间复杂度
E - I Hate Sigma Problems
终于上难度哩!
由于长的像序列分治,所以我决定使用序列分治。
假设当前分治区间为
我们考虑枚举
如果存在
如果不存在
暴力枚举
最后记得清空。
点击查看代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N=2e5+10;
typedef long long ll;
int n,a[N],lst[N],mk[N];
ll ans;
void solve(int l,int r){
if(l==r){ans++;return;}
int mid=(l+r)>>1;
ll res=0,sum=0;
solve(l,mid);
solve(mid+1,r);
for(int i=mid;i>=l;i--){
if(!lst[a[i]])lst[a[i]]=i,res++;
sum+=res;
}
for(int i=mid+1;i<=r;i++){
if(!mk[a[i]]){
if(lst[a[i]])sum+=mid-lst[a[i]];
else sum+=mid-l+1;
mk[a[i]]=1;
}
ans+=sum;
}
for(int i=l;i<=mid;i++)lst[a[i]]=0;
for(int i=mid+1;i<=r;i++)mk[a[i]]=0;
return;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",a+i);
}
solve(1,n);
printf("%lld\n",ans);
return 0;
}
时间复杂度
好像有点复杂了
F - Takahashi in Narrow Road
赛时理解错题意了,本来以为是安排最优方案,没想到是模拟。
好像用线段树做一下就可以了,可惜没时间了
G - Lexicographically Smallest Permutation
赛时好像有点思路?大概是并查集+贪心。
可是时间太短了。
The End
这么说给我四个小时我可以 AK ABC?!?这一定是时间太短的问题
菜就多练,输不起就别玩。
--《古希腊哲学》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!