10.13 山东多校联测模拟赛小记

发布时间 2023-10-13 21:26:56作者: Moyyer_suiy

比赛地址

149pts,60-65-8-16,rank36/108,被您们吊打。


T1 写的其实假了,小细节没处理好,数组开小了。所以在找到错因后还挺惊讶的,狠狠的嘲讽数据()。

一开始想的 dp,后来发现不太对,可以写二分判断。

为什么不能直接求,因为不能确定挑战的顺序。二分 check 的时候可以倒着贪心的处理。大概是这样。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,m,ans;
int flagg=0;
int a[N],s[N];
int vis[N];
bool check(int x){
	memset(vis,0,sizeof vis);
	int cst=0,v=0,flag=0;
	for(int i=x;i>=1;i--){
		if(s[i]) flag=1;
		if(s[i]&&!vis[s[i]]){
			if(i<=a[s[i]]) return 0;
			cst+=a[s[i]];
			vis[s[i]]=1;
		}
		else if(flag) v++;
	}
	for(int i=1;i<=m;i++) if(!vis[i]) return 0;
	if(cst<=v){flagg=1;return 1;}
	return 0;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&s[i]);
	for(int i=1;i<=m;i++) scanf("%d",&a[i]);
	int l=1,r=n;
	while(l<=r){
		int mid=(l+r)>>1;
		if(check(mid)){
			ans=mid;
			r=mid-1;
		}
		else l=mid+1;
	}
	if(!flagg) puts("-1");
	else printf("%d",ans);
}