QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#207336#6770. Antsveg#WA 1ms5908kbC++231.9kb2023-10-08 14:26:242023-10-08 14:26:24

Judging History

This is the latest submission verdict.

  • [2023-10-08 14:26:24]
  • Judged
  • Verdict: WA
  • Time: 1ms
  • Memory: 5908kb
  • [2023-10-08 14:26:24]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;

#define ll long long

const int maxn=1e6+10;

int a[maxn];
int d[maxn];

int main()
{
	int n,A,B;ll left,right;
	scanf("%d%d%d",&n,&A,&B);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++) scanf("%d",&d[i]);
	int len=2000000002;
	left=0,right=2.1e18;
	while(left<=right)
	{
		ll mid=left+right>>1,cnt=0;
		for(int i=1;i<=n;i++)
			if(d[i]) cnt+=(mid+a[i])/len;
			else cnt+=(mid+len-a[i])/len;
		if(cnt>=A) right=mid-1;
		else left=mid+1;
	}
	ll ta=left;
	left=0,right=2.1e18;
	while(left<=right)
	{
		ll mid=left+right>>1,cnt=0;
		for(int i=1;i<=n;i++)
			if(!d[i]) cnt+=(mid+a[i])/len;
			else cnt+=(mid+len-a[i])/len;
		if(cnt>=B) right=mid-1;
		else left=mid+1;
	}
	ll tb=left;
	if(ta<=tb)
	{
		vector<int> vec;
		int ans=0;
		for(int i=1;i<=n;i++)
			if(!d[i])
			{
				B-=(ta+len-a[i])/len;
				a[i]=(ta+len-a[i])%len;
				if(a[i]<=len/2) vec.push_back(a[i]);
				else ans=max(ans,len-a[i]);
			}
			else
			{
				B-=(ta+a[i])/len;
				a[i]=(ta+a[i])%len;
				if(a[i]<=len/2) vec.push_back(a[i]);
				else ans=max(ans,len-a[i]);
			}
		sort(vec.begin(),vec.end());
		if(!vec.size()) printf("%lld\n",ta+ans);
		else if(B<=0) printf("%lld\n",ta+max(ans,len/2-vec[0]));
		else printf("%lld\n",ta+max(ans,len-vec[max(0,(int)(vec.size()-B))]));
	}
	else
	{
		vector<int> vec;
		int ans=0;
		for(int i=1;i<=n;i++)
			if(d[i])
			{
				A-=(tb+len-a[i])/len;
				a[i]=(tb+len-a[i])%len;
				if(a[i]<=len/2) vec.push_back(a[i]);
				else ans=max(ans,len-a[i]);
			}
			else
			{
				A-=(tb+a[i])/len;
				a[i]=(tb+a[i])%len;
				if(a[i]<=len/2) vec.push_back(a[i]);
				else ans=max(ans,len-a[i]);
			}
		sort(vec.begin(),vec.end());
		if(!vec.size()) printf("%lld\n",tb+ans);
		else if(A<=0) printf("%lld\n",tb+max(ans,len/2-vec[0]));
		else printf("%lld\n",tb+max(ans,len-vec[max(0,(int)(vec.size()-A))]));
	}
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 5908kb

input:

2 2 4
2 3
0 1

output:

4000000001

result:

ok single line: '4000000001'

Test #2:

score: -100
Wrong Answer
time: 1ms
memory: 5876kb

input:

1 1000000000 1000000000
500000000
0

output:

2000000001499999999

result:

wrong answer 1st lines differ - expected: '2000000002500000000', found: '2000000001499999999'