Scoring Subsequences

CF1794C

难度不是很大。主要是二分方式。

首先,题目要求值最大且覆盖区间最长。

因为要求最大,且序列单调递增。所以很容易想到,是从后往前取造成的贡献最大。

但是这样有一个反作用,加入说区间是 [1,i][1,i],当前取到了 xx,如果 axix+1<(ix+1)\frac{a_x}{i-x+1}<(i-x+1),那就必然说明这里就产生了小于 11 的数,必然要比取 [x+1,i][x+1,i] 要小。(可以考虑一一对应去看,aia_i 对应 11ai1a_{i-1} 对应 22,显然是每个 aia_i 都要大于底下的那个数,这个值才可能最大)。

所以就考虑二分这个位置,然后不断地记录能取区间最大值,最后出来的就是值最大,且区间长度最大了。

nn 来表示 n\sum n,时间是 O(nlogn)O(n \log n)

#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
int a[N],s1[N],s[N];
int Slove(int x){
	int l=1,r=x,len=0,sum=0;
	while(l<=r){
		sum++;
		if(sum>x)	break;
		int mid=(l+r)>>1;
		if(x-mid+1<=a[mid])	len=max(len,x-mid+1),r=mid-1;
		else	l=mid+1;
	}
	cout<<len<<" ";
}
int main(){
	int n,t;
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<=n;i++)	cin>>a[i];
		cout<<1<<" ";
		for(int i=2;i<=n;i++){
			Slove(i);
		}
		cout<<endl;
	}
}
posted @   June_Failure  阅读(6)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示