Codeforces Round #704 (Div. 2) 题解(待更)
(FST警告)
传送门:https://codeforces.com/contest/1492
A
模拟,分别求出三人到的时间取 即可。
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define SET0(a) memset(a,0,sizeof(a))
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define DWN(i,a,b) for(int i=(a);i>=(b);i--)
#define INF 0x3f3f3f3f
typedef long long ll;
ll min_(ll a,ll b){
if(a>b) return b;
else return a;
}
int main(){
int T; cin>>T;
while(T--){
ll p,a,b,c; cin>>p>>a>>b>>c;
ll u,v,w;
u=a-(p%a==0?a:p%a);
v=b-(p%b==0?b:p%b);
w=c-(p%c==0?c:p%c);
cout<<min_(u,min_(v,w))<<endl;
}
return 0;
}
B
化简一下式子,发现就是要求字典序最大的序列,按照操作规则,对于整堆牌,应该将最大的(以及它下面的牌)留在底部最后再放到另一堆,类似的,对于最大的牌上面的牌,也是将最大的(以及它下面的牌)留在底部最后再放到另一堆,如此下去即可。
注意到操作过程需要维护区间最大值,可以打个ST表
。
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define SET0(a) memset(a,0,sizeof(a))
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define DWN(i,a,b) for(int i=(a);i>=(b);i--)
#define INF 0x3f3f3f3f
typedef long long ll;
const int N=1e5+5,M=20;
int n;
int a[N];
//st
int st[N][M];
int Log[N];
void pre(){
Log[1]=0;
FOR(i,2,N-1) Log[i]=Log[i/2]+1;
}
void init(){
FOR(j,0,M-1)
for(int i=1;i+(1<<j)-1<=n;i++)
if(!j) st[i][j]=a[i];
else st[i][j]=max(st[i][j-1],st[i+(1<<j-1)][j-1]);
}
int query(int l,int r){
int s=Log[r-l+1];
return max(st[l][s],st[r-(1<<s)+1][s]);
}
int main(){
int T; cin>>T;
pre();
while(T--){
cin>>n;
FOR(i,1,n) cin>>a[i];
init();
int pt=n;
DWN(i,n,1){
int num=query(1,pt);
//cerr<<num<<endl;
if(a[i]==num){
FOR(j,i,pt) cout<<a[j]<<' ';
if(i-1) pt=i-1;
}
}
cout<<endl;
}
return 0;
}
C
记录一下从左开始b串
匹配a串
的位置,类似的,记录从右开始b串
匹配a串
的位置。
然后枚举一下断点就可以了。
比如:
accbcaaabac
abc
从左开始匹配的位置为:
i ii
accbcaaabac
从右开始匹配的位置为:
ii i
accbcaaabac
断点可以是:
i
abc
i
abc
i
abc
对于第一个断点,对应的序列匹配情况是:
i i i
accbcaaabac
枚举断点统计一下就好了。
#pragma GCC optimize("O3")
#include<bits/stdc++.h>
using namespace std;
#define SET0(a) memset(a,0,sizeof(a))
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define DWN(i,a,b) for(int i=(a);i>=(b);i--)
#define INF 0x3f3f3f3f
typedef long long ll;
const int N=2e5+5;
int f[N],g[N];
int main(){
int lena,lenb;
string a,b;
cin>>lena>>lenb>>a>>b;
int pt=0;
char tmp=b[pt];
//cerr<<tmp;
for(int i=0;i<lena;i++){
if(a[i]==tmp && pt<lenb){
f[pt]=i;
pt++;
if(pt<lenb) tmp=b[pt];
}
}
pt=lenb-1;
tmp=b[pt];
DWN(i,lena-1,0){
if(a[i]==tmp && pt>=0){
g[pt]=i;
pt--;
tmp=b[pt];
}
}
int ans=-1;
FOR(i,0,lenb-1){
ans=max(ans,g[i+1]-f[i]);
}
cout<<ans<<endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】