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 @ 2023-05-06 13:52  June_Failure  阅读(16)  评论(0)    收藏  举报  来源