Codeforces 727 F. Polycarp's problems

Posted 北屿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 727 F. Polycarp's problems相关的知识,希望对你有一定的参考价值。

Description

有一个长度为 \(n\) 有正负权值的序列,你一开始有一个值,每次到一个权值就加上,最少需要删掉多少数值才能到序列末尾.\(n \leqslant 750,m \leqslant 2 \times 10^5\)

Sol

DP+二分.

发现这个东西有后效性,就是前面选不选会影响后面的决策,并且权值太大无法记录.

但是我们可以倒着做,因为后面的决策无法影响前面的决策.

\(f[i][j]\) 表示到 \(i\) 删掉 \(j\) 个至少需要的初始权值.

因为初始权值非负,所以不可能在中途中出现负数,要处理掉,然后就两个决策,删或不删,转移就很好写了.

统计答案的时候他有单调性,可以二分.

Code

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

typedef long long LL;
const int N = 755;

int n,m;
LL a[N],f[N][N],w[N];

inline LL in(LL x=0,char ch=getchar()){ while(ch>‘9‘||ch<‘0‘) ch=getchar();
	while(ch>=‘0‘ && ch<=‘9‘) x=(x<<3)+(x<<1)+ch-‘0‘,ch=getchar();return x; }
void work(LL x){
	int l=0,r=n,mid;
	while(l<=r){
		mid=(l+r)>>1;
		if(f[1][mid] <= x) r=mid-1;
		else l=mid+1;
	}printf("%d\n",l);
}
int main(){
	
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) cin>>a[i];
	
	memset(f,0x3f,sizeof(f));
	f[n+1][0]=0LL;
	for(int i=n;i;i--) for(int j=0;j<n-i+1;j++){
		f[i][j]=min(f[i][j],max(0LL,f[i+1][j]-a[i]));
		f[i][j+1]=min(f[i][j+1],f[i+1][j]);
	}
	
	for(;m--;) work(in());
	return 0;
}

  

以上是关于Codeforces 727 F. Polycarp's problems的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces727E/CF727EGames on a CD (字符串哈希)

codeforces727C(交互)

codeforces727E Games on a CD

Codeforces 240 F. TorCoder 线段树

Codeforces Round #392 (Div. 2) F. Geometrical Progression

[codeforces]Codeforces Global Round 1 F. Nearest Leaf