正确复杂度90分无法通过求助
查看原帖
正确复杂度90分无法通过求助
467107
Cap1taL楼主2022/7/25 16:05

用了一篇题解的思路,但最后用的是lower_bound

题解

我的代码

// Problem: P1314 [NOIP2011 提高组] 聪明的质监员
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1314
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define INF 0x7fffffff
#define MAXN 200050
#define MAXM 200050
using namespace std;
int n,m;
int w[MAXN],v[MAXN];
int p[MAXN],q[MAXN];
long long sum[MAXN],num[MAXN];
long long s;
long long get(int W){
	long long ans=0;
	for(int i=1;i<=n;i++){
		if(w[i]<W){
			num[i]=num[i-1];
			sum[i]=sum[i-1];
		}else{
			num[i]=num[i-1]+1;
			sum[i]=sum[i-1]+v[i];
		}
	}
	for(int i=1;i<=m;i++)	ans+=(num[q[i]]-num[p[i]-1])*(sum[q[i]]-sum[p[i]-1]);
	return ans;
}
long long fw[MAXN];
int main(){
	cin>>n>>m>>s;
	int maxx=-1;
	for(int i=1;i<=n;i++){
		scanf("%d %d",&w[i],&v[i]);
		maxx=max(maxx,w[i]);
	}
	for(int i=1;i<=m;i++){
		scanf("%d %d",&p[i],&q[i]);
	}
	for(int i=0;i<=maxx;i++){
		fw[i]=-get(i);
	}
	long long *L=lower_bound(fw,fw+maxx+1,-s);
	long long x=L-fw;
	cout<<min(labs(s+fw[x]),labs(s+fw[x-1]));
	return 0;
}

num和sum数组与题目中一样,get就是题解里的check,最后我用了fw数组记录了所有fw的值,取相反数变成上升的,最后lowerbound,在s左右两个fw里面取最小的

maxx我是记录了所有w里面最大的,这是上界,1e6试过也会TLE两个点

评测记录

复杂度最后依旧是log,为什么过不了求大佬解答QAQ

2022/7/25 16:05
加载中...