首页 > 其他分享 >CF1840C题解

CF1840C题解

时间:2023-06-18 12:22:59浏览次数:54  
标签:CF1840C int 题解 sum long 区间 include 解法

题目描述

题目传送门

\(T\) 组数据,每组数据给定 \(n\),\(k\),\(q\) 和一个长度为 \(n\) 的数组 \(a\),求 \(a\) 中长度大于等于 \(k\) 且最大值小于等于 \(q\) 的序列个数。
\(\sum{n}\le 2e5\)。

题目解析

  • 解法一:数据结构解法

显然可以利用数据结构维护。考虑ST表预处理出区间最大值枚举区间左右端点累计,复杂度 \(O(nlogn+n^2)\),需要优化。

再想想,若区间 \([i,j]\) 符合条件,则对于每个 \(i\le k\le j\),区间 \([i,k]\) 都符合条件;若区间 \([i,j]\) 不符合,则对于每个 \(j<k\le n\),区间 \([i,k]\) 都不符合,答案可二分。所以我们枚举左端点,二分右端点,复杂度 \(O(Tnlogn)\)。

  • 解法二:数学解法

显然:一个区间符合条件,当且仅当此区间不存在一个 \(i\in [i,j]\) 使 \(a_i>q\)。所以处理每一个 \(a_i>q\) 的 \(i\),统计区间长度。区间长度为 \(m\) 的合法区间贡献即为 \(\sum_{i=1}^{m}i\)。而这个式子可以预处理,复杂度 \(O(N+Tn)\)。

代码实现

因为 \(\sum{n}\le 2e5\),所以答案需要 long long。

  • 解法一
#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

标签:CF1840C,int,题解,sum,long,区间,include,解法
From: https://www.cnblogs.com/Mr-KaYa/p/17488958.html

相关文章

  • JOI Final 2020 题解
    JOI2020JustLongNeckties首先一定是贪心将两个从小到大排。然后考虑维护\(a_i-b_i\)的前缀max与\(a_{i+1}-b_i\)的后缀max即可。https://qoj.ac/submission/113106JOI2020JJOOII2考虑维护出每个点往前跳\(k\)个J/O/I跳到哪里。于是枚举右端点,然后往前跳找......
  • 蓝桥杯嵌入式第十三届客观题解析
    (文章目录)前言本篇文章将带大家来学习蓝桥杯嵌入式的客观题了,蓝桥杯嵌入式的客观题涉及到模电,数电,单片机等知识,需要非常扎实的基础,客观题不能急于求成只能脚踏实地一步步的积累,下面就让我们正式进入客观题的讲解。一、题目1第一题是一个多选题选ABC在参考手册中我们可以清......
  • 【题解】[NOIP2017 提高组] 逛公园
    题目描述:策策同学特别喜欢逛公园。公园可以看成一张\(N\)个点\(M\)条边构成的有向图,且没有自环和重边。其中\(1\)号点是公园的入口,\(N\)号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花的时间。策策每天都会去逛公园,他总是从\(1\)号点进去,从\(N\)号......
  • 【题解】Atcoder ABC300 F.More Holidays(线性做法)
    F.MoreHolidays题目描述:给你一个由o和x组成的长度为\(N\)的字符串\(S\),以及整数\(M\)和\(K\)。保证\(S\)至少包含一个x。假设\(T\)是由\(S\)复制\(M\)次而成的长度为\(NM\)的字符串。考虑将\(T\)中的\(K\)个x恰好替换为o。你的目标是在替换后的......
  • P2161 [SHOI2009]会场预约 题解
    蒟蒻提供一种fhq-treap的做法,但是不如其他题解的快(也没有stl快,不开O21.8s),但是比较好想,扩展了fhq的模板,也算是为使用fhq提供一个新方法。首先,fhq-treap是什么,如果有同学不清楚,请点击学习(并非我的blog)那么,由于fhq树的分裂操作,使得我们可以很方便的取出我们想要的区间。那么,在......
  • react经典面试题解析--持续更新--day01
    一、类组件和函数组件的区别(面试常考)简单理解(所有同学都要掌握)1、类组件有生命周期,函数组件没有2、类组件需要继承Class,函数组件不需要3、类组件可以获取实例化的this,并且基于this做各种操作,函数组件不行4、类组件内部可以定义并维护state,函数组件都称为无状态了,那肯定......
  • AtCoder ABC056D 题解
    题目直达0x00思路从大到小枚举每个元素,同时加入\(sum\)进行累计,当\(k\lesum\)时,便会返现之前的元素可以构成“好的组”(因为他们都大于\(p_i\)),即有用的,所以要清空。0x01举个例子36143我们对输入排序后,会得到\(p\)为。431这时,我们的\(i=1\),即\(p_i=......
  • AtCoder ABC228D 题解
    [ABC299D]FindbyQuery题解0x00题目分析题目传送门经过分析,我们得到的几个关键信息:\(n\le2\times10^5\)最多可以问法官\(20\)个问题。s[1]=0,s[n]=1分析\(n\)的范围,发现\(\log_n=17.6096\),刚好比\(20\)小一点点。这时便考虑二分的做法。看到s[1]=0,......
  • AtCoder ABC047D 题解
    题意理解&分析:大概的题意应该是十分清晰的,就是一个人要从\(1\)到\(n\)的城市中买苹果。另一个人要其中调整价格。这里的调整也不需要太多,就\(1\)就可以了。但是,如果有多组购买方案可以得到相同的利润,就还需要将其他相同的价格一并调整。这道题的关键就在于求出有几组购买......
  • CF1732D1 题解
    CF1732D1Balance题解题目解释输入一个\(op\)和\(x\),\(op\)有\(2\)种情况。\(op\)为+,则将\(x\)加入到集合中。\(op\)为?,则找到一个最小的\(k\),使\(k\timesx\)不在合集中。题目非常简单明了。具体实现这时,看到这句话:\(1\lex\le10^{18}\),所以不可......