CF1840C题解
题目描述
题目解析
- 解法一:数据结构解法
显然可以利用数据结构维护。考虑ST表预处理出区间最大值枚举区间左右端点累计,复杂度
再想想,若区间
- 解法二:数学解法
显然:一个区间符合条件,当且仅当此区间不存在一个
代码实现
因为
- 解法一
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long
const int N=2e5+10;
int T;
int n,k,q;
ll f[N][31];
inline long long maxx(int l,int r){
int len=log(r-l+1)/log(2);
return max(f[l][len],f[r-(1<<len)+1][len]);
}
int main(){
scanf("%d",&T);
while(T--){
ll ans=0;
scanf("%d%d%d",&n,&k,&q);
for(int i=1;i<=n;++i) scanf("%lld",&f[i][0]);
for(int i=1;i<=30;++i)
for(int j=1;j+(1<<(i-1))-1<=n;++j)
f[j][i]=max(f[j][i-1],f[j+(1<<(i-1))][i-1]);
for(int i=1;i+k-1<=n;++i){
int l=i+k-1,r=n;
while(l<r){
int mid=(l+r+1)>>1;
if(maxx(i,mid)<=q) l=mid;
else r=mid-1;
}
if(maxx(i,l)<=q) ans+=min(l,n)-i-k+2;
}
printf("%lld\n",ans);
}
return 0;
}
- 解法二
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define ll long long
const int N=2e5+10;
int T;
int n,k,q;
ll a[N],sum[N];
int main(){
scanf("%d",&T);
for(int i=1;i<=N-10;++i) sum[i]=sum[i-1]+i;
while(T--){
ll ans=0,p=0;
scanf("%d%d%d",&n,&k,&q);
for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
for(int i=1;i<=n;++i){
if(a[i]>q){
if(p>=k) ans+=sum[p-k+1];
p=0;
}
else ++p;
}
if(p>=k) ans+=sum[p-k+1];
printf("%lld\n",ans);
}
}
完结撒花qwq
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步