五五五五五(easy)题解
题意简述
有一个长度为
思路
我们发现会出现没有
因为
那么根据这个公式,我们就很容易得到如下的两个代码:
第一部分,计算
for(int i=1;i<=n+1;i++){//遍历到n+1,可以统计最后一个5的块
if(a[i]==5)//如果当前的ai为5,那么更新长度
f[i]=f[i-1]+1;
else f[i]=0;//如果不是的话,就一直为0
if(a[i]==5&&a[i-1]!=5)//如果这是一个块的起点,那么更新起始点的位置(第一个不为5的点)
lst=i-1;
if(a[i]!=5&&a[i-1]==5){//如果这是一个块的结束,那么计算答案
len[++ce]=f[i-1];//统计长度
ans+=lst*(((len[ce]+1)*len[ce]/2)%Mode)%Mode;//根据公式计算答案
ans%=Mode;//取模
}
}
第二部分,计算
for(int i=1;i<=ce;i++){
for(int j=1;j<=len[i];j++){
ans+=j*(len[i]-j+1);//根据公式计算如果l在块内部的答案
ans%=Mode;//取模
}
ans%=Mode;//还是取模
// cout<<len[i]<<" ";
}
AC代码
#include<bits/stdc++.h>
#define ll long long
#define ull usigned long long
using namespace std;
const string TypideName="c";
inline void readc(char &c){
c=getchar();
while(c==' '||c=='\n')
c=getchar();
}inline void writec(char c){putchar(c);}
template<typename T>inline void read(T& x) {
if(typeid(x).name()==TypideName){char ch;readc(ch);x=ch;return;}
x = 0; bool f = false; char ch = getchar();
while (ch < '0' || ch>'9') { if (ch == '-') f = !f; ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = (x << 3) + (x << 1) + (ch ^ 48); ch = getchar(); }
x = (f ? -x : x); return;
}template<typename T>inline void put(T x) {
if (x < 0) putchar('-'), x = -x;
if (x > 9) put(x / 10);
putchar(x % 10 + '0'); return;
}template<typename T>inline void write(T x) {
if(typeid(x).name()==TypideName){writec(x);return;}
put(x);
}
template<typename T,typename... Args>
inline void read(T& x,Args&...x_) {read(x),read(x_...);}
template<typename T,typename... Args>
inline void write(T x,Args...x_){write(x),write(x_...);}
#define N 200005
#define int ll
#define Mode 1000000007
int n,a[N],maxt=-1;
int f[N],len[N],ce,lst;ll ans=0;
inline void work(){
read(n);
for(int i=1;i<=n;i++)
read(a[i]),
maxt=max(maxt,a[i]);
for(int i=1;i<=n+1;i++){//遍历到n+1,可以统计最后一个5的块
if(a[i]==5)//如果当前的ai为5,那么更新长度
f[i]=f[i-1]+1;
else f[i]=0;//如果不是的话,就一直为0
if(a[i]==5&&a[i-1]!=5)//如果这是一个块的起点,那么更新起始点的位置(第一个不为5的点)
lst=i-1;
if(a[i]!=5&&a[i-1]==5){//如果这是一个块的结束,那么计算答案
len[++ce]=f[i-1];//统计长度
ans+=lst*(((len[ce]+1)*len[ce]/2)%Mode)%Mode;//根据公式计算答案
ans%=Mode;//取模
}
}
for(int i=1;i<=ce;i++){
for(int j=1;j<=len[i];j++){
ans+=j*(len[i]-j+1);//根据公式计算如果l在块内部的答案
ans%=Mode;//取模
}
ans%=Mode;//还是取模
}
write(ans);
}
signed main(){
work();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下