abc391 题解合集

news/2025/2/2 12:15:48/文章来源:https://www.cnblogs.com/Kenma/p/18696757

感觉这场难度不大啊,我讨厌手速场。

D

有一些细节的模拟题。

消除的总行数为所有列中方格数量的最小值,下面记为 \(sum\)

设每个方格在本列中从下到上处在 \(k\) 的位置,那么:

  • \(k \le sum\),这个方格被消除的时间为所有处在 \(k\) 位置的格子中,\(x\) 的最大值;

  • \(k >sum\),这个方格不会被消除。

排序后直接做就行。

总体复杂度 \(O(n \log n+q)\)

#include<bits/stdc++.h>
using namespace std;
const int inf=1e9+10; 
int n,m,q,x,y,ans,flag,maxn,minn,tim[1000005];
struct node{int x,id;
};
vector<node> v[1000005];
bool cmp(node a,node b){return a.x<b.x;
}
int main(){flag=true;cin>>n>>m;for(int i=1;i<=n;i++){cin>>x>>y;tim[i]=inf;v[x].push_back((node){y,i}); }ans=inf;for(int i=1;i<=m;i++){sort(v[i].begin(),v[i].end(),cmp);ans=min(ans,(int)v[i].size());}for(int i=0;i<ans;i++){maxn=0;for(int j=1;j<=m;j++){maxn=max(maxn,v[j][i].x);}for(int j=1;j<=m;j++){tim[v[j][i].id]=maxn;}}cin>>q;for(int i=1;i<=q;i++){cin>>y>>x;if(y<tim[x]) cout<<"Yes"<<'\n';else cout<<"No"<<'\n';}return 0;
} 

E

看起来就像一个树形结构,考虑直接在序列上建三叉树,每个叶子节点表示序列上的一个位置。

考虑 DP,设 \(f_{x,0/1}\) 表示 \(x\) 这个节点最终为 \(0/1\) 的最小代价,初始全为 \(\inf\),转移为:

\[f_{x,0}=\min_{y_1 \in son_x,y_2 \in son_x} f_{y_1,0}+f_{y_2,0} \]

\[f_{x,1}=\min_{y_1 \in son_x,y_2 \in son_x} f_{y_1,1}+f_{y_2,1} \]

需要对叶子节点初始化:

\[f_{x,a_i}=0 \]

需要对叶子节点的父亲节点特殊转移:

\[f_{x,0}=\min_{y_1 \in son_x,y_2 \in son_x} \min(f_{y_1,0},1)+\min(f_{y_2,0},1) \]

\[f_{x,1}=\min_{y_1 \in son_x,y_2 \in son_x} \min(f_{y_1,1},1)+\min(f_{y_2,1},1) \]

总体复杂度为 \(O(3^n)\)

#include<bits/stdc++.h>
using namespace std;
const int inf=1e9;
char ch;
int n,m,dcnt,id[3000005],a[3000005],f[3000005][2];
vector<int> v[3000005];
bool cmp0(int x,int y){return f[x][0]<f[y][0];
}
bool cmp1(int x,int y){return f[x][1]<f[y][1];
}
void build(int l,int r,int fa){int x=++dcnt;v[fa].push_back(x);if(l==r){id[x]=l;return;}int mid1=(r-l+1)/3+l-1,mid2=(r-l+1)/3*2+l-1;build(l,mid1,x);build(mid1+1,mid2,x);build(mid2+1,r,x);
}
void dfs(int x){if(!v[x].size()){f[x][a[id[x]]]=0;return;} for(int i=0;i<v[x].size();i++){dfs(v[x][i]);}sort(v[x].begin(),v[x].end(),cmp0);if(id[v[x][0]]) f[x][0]=min(f[v[x][0]][0],1)+min(f[v[x][1]][0],1);else f[x][0]=f[v[x][0]][0]+f[v[x][1]][0];sort(v[x].begin(),v[x].end(),cmp1);if(id[v[x][0]]) f[x][1]=min(f[v[x][0]][1],1)+min(f[v[x][1]][1],1);else f[x][1]=f[v[x][0]][1]+f[v[x][1]][1];
}
int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n;m=pow(3,n);for(int i=1;i<=m;i++){cin>>ch;a[i]=ch-'0';}build(1,m,0);for(int i=1;i<=dcnt;i++){f[i][0]=f[i][1]=inf;}dfs(1);if(!f[1][0]) cout<<f[1][1];else cout<<f[1][0];return 0; 
}

F

典。

考虑将 \(a,b,c\) 升序排序后,设 \(f(i,j,k)=a_ib_j+b_jc_k+a_ic_k\),那么有:

\[f(i,j,k) \ge f(i+1,j,k),f(i,j+1,k),f(i,j,k+1) \ge f(i+1,j+1,k),f(i,j+1,k+1),f(i+1,j,k+1) \ge f(i+1,j+1,k+1) \]

所以直接优先队列维护同一层级,不确定单调性的 \(f\),每次取出最大值再拓展新的 \(f\) 即可。

总体复杂度 \(O(k \log k)\)

#include<bits/stdc++.h>
#define int __int128
using namespace std;
template<typename T> inline void read(T &a){a=0;char c=getchar();bool flag=false;while(!isdigit(c)){if(c=='-') flag=true;c=getchar();}while(isdigit(c)){a=(a<<1)+(a<<3)+(c^48);c=getchar(); }a=(flag?-a:a);
}
template<typename T> inline void write(T a){if(a<0) putchar('-'),a=-a;if(a<10) putchar(a+'0');else write(a/10),putchar(a%10+'0');
}
int n,k,cnt,a[200005],b[200005],c[200005];
int val(int i,int j,int k){return a[i]*b[j]+b[j]*c[k]+a[i]*c[k];
}
bool cmp(int x,int y){return x>y;
}
struct node{int a,b,c,val;bool operator <(const node &d)const{if(val!=d.val) return val<d.val;if(a!=d.a) return a<d.a;if(b!=d.b) return b<d.b;return c<d.c;}bool operator ==(const node &d)const{return a==d.a && b==d.b && c==d.c;}
};
priority_queue<node> q;
map<node,bool> vis; 
signed main(){read(n),read(k); for(int i=1;i<=n;i++){read(a[i]);}for(int i=1;i<=n;i++){read(b[i]);}for(int i=1;i<=n;i++){read(c[i]);}sort(a+1,a+1+n,cmp);sort(b+1,b+1+n,cmp);sort(c+1,c+1+n,cmp);q.push((node){1,1,1,val(1,1,1)});while(cnt<k){node t=q.top();q.pop();if(vis[t]) continue;vis[t]=1;cnt++;if(cnt==k){write(t.val);break;}if(t.a<n) q.push((node){t.a+1,t.b,t.c,val(t.a+1,t.b,t.c)});if(t.b<n) q.push((node){t.a,t.b+1,t.c,val(t.a,t.b+1,t.c)});if(t.c<n) q.push((node){t.a,t.b,t.c+1,val(t.a,t.b,t.c+1)});}return 0;}

G

游园会.jpg

但是我做这个题的时候已经忘了游园会怎么做了。

不难发现是 DP of DP,外层是对 \(T\) 形态的 DP,内层是对 \(S\)\(T\) 的 LCS 的 DP。

考虑 LCS 的 DP,设 \(f_{i,j}\) 表示 \(T\) 匹配到 \(i\) 位置,\(S\) 匹配到 \(j\) 位置的 LCS。

在外层 DP 时,记录内层 DP 的状态,也就是记录 \(f_i\) 就行了。

\(g_{i,s}\) 表示考虑到 \(T\) 的前 \(i\) 位,\(S\)\(T\) 的 LCS DP 数组为 \(s\) 的方案数。

枚举当前位置填什么字符,在内层求出 \(s\) 的变化,直接转移即可。

因为 \(0\le f_{i,j}-f_{i,j-1} \le 1\),所以 \(s\) 的上界为 \(2^n\)

在实现上,为了方便,可以在状态中记录 \(f_i\) 的差分数组。

总体复杂度为 \(O(m\sigma 2^m)\)\(\sigma\) 是字符集大小。

#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
char a[15];
int g[15],h[15],n,m,ans;
int get(int ch,int s){int t=0;for(int i=1;i<=n;i++){g[i]=g[i-1]+(bool)(s&(1<<(i-1)));}for(int i=1;i<=n;i++){if(a[i]-'a'==ch) h[i]=g[i-1]+1;else h[i]=max(h[i-1],g[i]);}for(int i=1;i<=n;i++){t|=(1<<(i-1))*(h[i]-h[i-1]);}return t;
}
int f[101][1025];
int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}f[0][0]=1;for(int i=1;i<=m;i++){for(int s=0;s<(1<<n);s++){for(int j=0;j<26;j++){int t=get(j,s);f[i][t]=(f[i][t]+f[i-1][s])%mod;}}}for(int i=0;i<=n;i++){ans=0;for(int s=0;s<(1<<n);s++){if(__builtin_popcount(s)==i) ans=(ans+f[m][s])%mod;}cout<<ans<<' ';}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/877966.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI编程助手带来的洞察和启发——程序员职业的变革

前言 从chatgpt的横空出世到国内大模型的强势崛起, 从AI只会写诗作画到辅助编程, AI作为新质生产力的重要角色逐渐进入各行各业,为行业带来新的可能性。Cursor、通义灵码这类"AI程序员"的出现一方面给编码工作带来了便利,另一方面也对软件从业人员带来极大的冲击…

个人数据保全计划:部署joplin server笔记同步服务

前言 在这个数据爆炸的时代,个人数据的价值愈发凸显,成为我们生活与工作中无可替代的重要资产。上一篇文章里,我介绍了从印象笔记迁移至 Joplin 的过程,这是我寻求数据自主掌控的关键一步。在探索同步方案时,我尝试了 OneDrive,原以为它能提供稳定高效的同步服务,可实际…

【deepseek】在deepin系统上部署运行deepseek-r1

环境配置LM-Studio官网:https://lmstudio.ai/修改“镜像源”cd /opt/apps/ai.lmstudio/files/LM_Studio/resources/app/.webpack/main 使用vscode打开进行编辑,./resources/app/.webpack/main/index.js./resources/app/.webpack/main/llmworker.js./resources/app/.webpack/m…

C++ 编译静态链接 (-static)

因为很长一段时间内并不知道这个编译参数究竟是干什么用的,只知道这个参数在 NOI 系列赛事中普遍使用,并且会导致编译输出文件变大,直到碰到具体问题了才发现这个参数的作用 -static 参数是静态链接开关,不加这个参数默认是动态链接,加上这个参数以后是静态链接,先说一下…

https://avoid.overfit.cn/post/e57ca7e30ea74ad380b093a2599c9c01

DeepSeekMoE是一种创新的大规模语言模型架构,通过整合专家混合系统(Mixture of Experts, MoE)、改进的注意力机制和优化的归一化策略,在模型效率与计算能力之间实现了新的平衡。DeepSeekMoE架构融合了专家混合系统(MoE)、多头潜在注意力机制(Multi-Head Latent Attention, ML…

DeepSeekV3+Roo Code,智能编码好助手

前言 硅基流动最近上线了deepseek-ai/DeepSeek-R1与deepseek-ai/DeepSeek-V3,感兴趣快来试试吧! 邀请注册得14元不过期额度:https://cloud.siliconflow.cn/i/Ia3zOSCU。实践 最近VS Code中的自动编程插件Cline很火爆,Roo Code也是Cline的一个fork版本。 Cline 自主编码代理…

Cisco Catalyst 8000V Edge Software, IOS XE Release 17.16.1a ED - 思科虚拟路由器系统软件

Cisco Catalyst 8000V Edge Software, IOS XE Release 17.16.1a ED - 思科虚拟路由器系统软件Cisco Catalyst 8000V Edge Software, IOS XE Release 17.16.1a ED 思科 Catalyst 8000V 边缘软件 - 虚拟路由器 请访问原文链接:https://sysin.org/blog/cisco-catalyst-8000v/ 查看…

Cisco Catalyst 8000 Series Edge Platforms, IOS XE Release 17.16.1a ED - 思科路由器系统软件

Cisco Catalyst 8000 Series Edge Platforms, IOS XE Release 17.16.1a ED - 思科路由器系统软件Cisco Catalyst 8000 Series Edge Platforms, IOS XE Release 17.16.1a ED 思科 Catalyst 8000 边缘平台系列 IOS XE 系统软件 请访问原文链接:https://sysin.org/blog/cisco-cat…

Easysearch 集群通过 API 进行用户密码重置

在日常使用 Easysearch 中,难免会遇到集群密码需要重置的情况(如密码遗失、安全审计要求等)。 通过查看 Easysearch 用户接口文档,创建用户使用如下接口: PUT _security/user/<username> {"password": "adminpass","roles": ["m…

Elasticvue:一款轻量级的Elasticsearch可视化管理工具

Elasticvue是一款免费开源的Elasticsearch GUI工具,你可以使用它来管理ES里的数据, Elasticvue具有多种安装形式,我们这里采用最简单的Docker安装方式,其他版本如Winodws、MacOS、Linux和浏览器插件。 Elasticvue相比Kibana的优势主要体现在以下几个方面: 1、 轻量级与易用…

【攻防3.0 】信任攻击

Author: sm0nk@深蓝攻防实验室 上周在一个技术沙龙我分享了一个攻防相关议题——进击的白巨人,在此归档。一、进攻场景思考 无论是端侧产品还是流量侧产品、亦或是原生安全还是外挂式,主模式还是鉴黑和鉴白; 随着防守方强化的安全建设,安全产品越来越强,进攻的难度在增加;…

[2025.2.1 MySQL学习] MVCC

MVCC 基本概念当前读(直接读取数据页最新版本):读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于一些日常操作,如:select...lock in share mode、select ... for update、update、isnert、delete都是一种当前读快照读:…