QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#646205#5076. Prof. Pang and AntsKevin5307WA 0ms3668kbC++233.0kb2024-10-16 21:41:272024-10-16 21:41:28

Judging History

你现在查看的是最新测评结果

  • [2024-10-16 21:41:28]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3668kb
  • [2024-10-16 21:41:27]
  • 提交

answer

//Author: Kevin
#include<bits/stdc++.h>
//#pragma GCC optimize("O2")
using namespace std;
#define ll long long
#define ull unsigned ll
#define pb emplace_back
#define mp make_pair
#define ALL(x) (x).begin(),(x).end()
#define rALL(x) (x).rbegin(),(x).rend()
#define srt(x) sort(ALL(x))
#define rev(x) reverse(ALL(x))
#define rsrt(x) sort(rALL(x))
#define sz(x) (int)(x.size())
#define inf 0x3f3f3f3f
#define pii pair<int,int>
#define lb(v,x) (int)(lower_bound(ALL(v),x)-v.begin())
#define ub(v,x) (int)(upper_bound(ALL(v),x)-v.begin())
#define uni(v) v.resize(unique(ALL(v))-v.begin())
#define longer __int128_t
void die(string S){puts(S.c_str());exit(0);}
ll a[100100];
struct block
{
	ll A,B,M;
	block(){}
	block(ll _A,ll _B,ll _M):A(_A),B(_B),M(_M){};
	inline ll length(){return (B-A+1)*M;}
	inline ll lget(ll x){return (x-1)/M+A;};
	inline ll rget(ll x){return lget(length()-x+1);}
	inline ll lgetd(ll x){return (x-1)/M*M+M-(x-1);}
	inline ll rgetd(ll x){return lgetd(x);}
	inline ll lgetd2(ll x){return (x-1)-(x-1)/M*M+1;}
	inline ll rgetd2(ll x){return lgetd2(x);}
};
int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		ll m;
		cin>>n>>m;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			a[i]++;
		}
		sort(a+1,a+n+1);
		ll l=0,r=1e18;
		while(l<r)
		{
			ll tmp=m;
			ll mid=(l+r)/2;
			vector<block> vec;
			vector<pii> vect;
			for(int i=1;i<=n;i++)
			{
				vect.pb(a[i],1);
				vect.pb(a[i]+mid/2,-1);
			}
			int cnt=0;
			srt(vect);
			for(int i=0;i<sz(vect)-1;i++)
			{
				cnt+=vect[i].second;
				if(!cnt) continue;
				if(vect[i].first==vect[i+1].first) continue;
				if((vect[i+1].first-vect[i].first)<=m/cnt)
				{
					vec.pb(vect[i].first,vect[i+1].first-1,cnt);
					m-=(vect[i+1].first-vect[i].first)*cnt;
				}
				else
				{
					if(m/cnt)
						vec.pb(vect[i].first,vect[i].first+m/cnt-1,cnt);
					if(m%cnt)
						vec.pb(vect[i].first+m/cnt,vect[i].first+m/cnt,m%cnt);
					m=0;
				}
			}
			if(m)
			{
				m=tmp;
				l=mid+1;
				continue;
			}
			ll L=0,R=0;
			int lp=0,rp=sz(vec)-1;
			ll ans=0;
			while(lp<sz(vec))
			{
				if(L==vec[lp].length())
				{
					L=0;
					lp++;
					continue;
				}
				if(R==vec[rp].length())
				{
					R=0;
					rp--;
					continue;
				}
				ll len=min(vec[lp].length()-L,vec[rp].length()-R);
				ans=max(ans,vec[lp].lget(L+1)+vec[rp].rget(R+1));
				ans=max(ans,vec[lp].lget(L+len)+vec[rp].rget(R+len));
				if(vec[lp].M>=vec[rp].M)
					if(vec[lp].lgetd(L+1)<vec[rp].rgetd(R+1)&&vec[lp].lgetd(L+1)<=len-1)
						ans=max(ans,vec[lp].lget(L+1)+vec[rp].rget(R+1)+1);
				if(vec[lp].M<=vec[rp].M)
					if(vec[lp].lgetd2(L+len)>vec[rp].rgetd2(R+len)&&vec[rp].rgetd2(R+len)<=len-1)
						ans=max(ans,vec[lp].lget(L+len)+vec[rp].rget(R+len)+1);
				L+=len;
				R+=len;
			}
			if(ans<=mid)
				r=mid;
			else
				l=mid+1;
			m=tmp;
		}
		cout<<l<<'\n';
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3668kb

input:

3
2 4
1 2
3 10
1 2 3
5 1
1 2 3 4 5

output:

6
9
4

result:

ok 3 number(s): "6 9 4"

Test #2:

score: -100
Wrong Answer
time: 0ms
memory: 3564kb

input:

1
1 100000000000000
1000000000

output:

156259777335946238

result:

wrong answer 1st numbers differ - expected: '200000000000000', found: '156259777335946238'