WA!只有20分!求大佬帮忙!
查看原帖
WA!只有20分!求大佬帮忙!
439177
Supor__Shoep楼主2022/7/16 13:49

个人感觉思路没有错误,但是只有 20 分。

代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=2e5+5;
int n,m,k,s;
int a[MAXN],c[MAXN];
struct node
{
	int l,r;
	bool operator<(const node &x)const
	{
		return r<x.r;
	}
}List[MAXN];
bool cmp(node x,node y){return x.l<y.l;}
int lowbit(int x)
{
	return x & -x;
}
priority_queue<node> que;
void add(int x,int k)
{
	for(int i=x;i<=n;i+=lowbit(i))	c[i]+=k;	
}
int ask(int x)
{
	int ans=0;
	for(int i=x;i>=1;i-=lowbit(i))	ans+=c[i];
	return ans;
}
bool check(int x)
{
	while(!que.empty())	que.pop();
	memset(c,0,sizeof(c));
	for(int i=1;i<=n;i++)	add(i,a[i]-a[i-1]);
	int si=1;
	int cnt=0;
	for(int i=1;i<=n;i++)
	{
		while(si<=m&&List[si].l<=i)	que.push(List[si++]);
		while(ask(i)<x&&!que.empty())
		{
			node t;
			while(t.r<i&&!que.empty())
			{
				t=que.top();
				que.pop();
			}
			if(t.r<i||++cnt>k)	return false;
			add(t.l,s);
			add(t.r+1,-s);
		}
		if(ask(i)<x)	return 0;
	}
	return 1;
}
int ans;
signed main()
{
	int T;
	scanf("%lld",&T);
	while(T--)
	{
		scanf("%lld%lld%lld%lld",&n,&m,&k,&s);
		int l=INT_MAX,r=0;
		for(int i=1;i<=n;i++)
		{
			scanf("%lld",&a[i]);
			l=min(l,a[i]);
			r=max(r,a[i]);
		}
		for(int i=1;i<=m;i++)	scanf("%lld%lld",&List[i].l,&List[i].r);
		sort(List+1,List+m+1,cmp);
		r+=k*s;
		while(l<=r)
		{
			int mid=(l+r)/2;
			if(check(mid))	l=mid+1,ans=mid;
			else	r=mid-1;
		}
		printf("%lld\n",ans);
	}
	return 0;
}
2022/7/16 13:49
加载中...