#include<cstdio>#include<iostream>#define RI register int#define CI const int&usingnamespace std;
constint N=100005;
int t,n,a[N],pfx[N],suf[N];
intmain(){
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);for (scanf("%d",&t);t;--t)
{
RI i; for (scanf("%d",&n),i=1;i<=n;++i) scanf("%d",&a[i]);
for (pfx[0]=0,i=1;i<=n;++i) pfx[i]=pfx[i-1]+a[i];
for (suf[n+1]=0,i=n;i>=1;--i) suf[i]=suf[i+1]+a[i];
int ans=-1e9; for (i=1;i<n;++i) ans=max(ans,pfx[i-1]+suf[i+2]-a[i]-a[i+1]);
printf("%d\n",ans);
}
return0;
}
3|0B. The Forbidden Permutation
SB题,话说这题题面写的很难懂赛后被好多人喷来着
不难发现由于只要有一个位置不合法即可,我们先特判掉答案为0的情况
然后考虑直接枚举每个位置,分别考虑破坏不等式两边所需要的最小步数即可
#include<cstdio>#include<iostream>#define RI register int#define CI const int&usingnamespace std;
constint N=100005,INF=1e9;
int t,n,m,d,p[N],pos[N],a[N];
intmain(){
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);for (scanf("%d",&t);t;--t)
{
RI i; for (scanf("%d%d%d",&n,&m,&d),i=1;i<=n;++i)
scanf("%d",&p[i]),pos[p[i]]=i;
for (i=1;i<=m;++i) scanf("%d",&a[i]);
bool flag=0; int ans=INF; for (i=1;i<m;++i)
{
int x=pos[a[i]],y=pos[a[i+1]];
if (y<x||y>x+d) { flag=1; break; }
ans=min(ans,y-x); if (n-1>d) ans=min(ans,d+1-(y-x));
}
if (flag) puts("0"); elseprintf("%d\n",ans);
}
return0;
}
4|0C. Flexible String
爆搜题
不难发现关于答案的计算方式,我们只要考虑找出每段连续的两个串对应位置相同的区间长度即可
然后注意到题目中反复提到的字符集大小小于等于10的限制,可以直接爆搜改了哪些字符然后check即可
复杂度O(210×n),实际情况前面是Ck10只会更小
#include<cstdio>#include<iostream>#include<vector>#define RI register int#define CI const int&usingnamespace std;
constint N=100005;
int t,n,k,tot,rst[26]; char a[N],b[N]; bool vis[N],cs[15];
vector <int> pos[15]; longlong ans;
inlinelonglongC2(CI x){
return1LL*x*(x+1)/2LL;
}
inlinevoidDFS(CI now=1,CI num=0){
if (num>k) return; if (now==tot+1)
{
RI i; for (i=1;i<=n;++i) vis[i]=a[i]==b[i];
for (i=1;i<=tot;++i) if (cs[i])
for (int x:pos[i]) vis[x]=1;
longlong ret=0; int lst=0;
for (i=1;i<=n;++i) if (!vis[i]) ret+=C2(i-1-lst),lst=i;
ret+=C2(n-lst); ans=max(ans,ret); return;
}
cs[now]=1; DFS(now+1,num+1); cs[now]=0; DFS(now+1,num);
}
intmain(){
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);for (scanf("%d",&t);t;--t)
{
RI i; for (tot=0,i=0;i<26;++i) rst[i]=0;
for (i=0;i<15;++i) pos[i].clear();
for (scanf("%d%d%s%s",&n,&k,a+1,b+1),i=1;i<=n;++i)
{
if (!rst[a[i]-'a']) rst[a[i]-'a']=++tot;
pos[rst[a[i]-'a']].push_back(i);
}
ans=0; DFS(); printf("%lld\n",ans);
}
return0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
2020-02-02 BZOJ 3622: 已经没有什么好害怕的了
2020-02-02 BZOJ 2553: [BeiJing2011]禁忌
2020-02-02 BZOJ 4767: 两双手
2020-02-02 BZOJ 3601: 一个人的数论