(注:不知道是否能在讨论版发关于洛谷月赛题目的求助......如果不能还请大佬提醒一下,我马上自删。qwq)
当时提交的时候 其余全部 点都过了,但就差前面几个判断不合法数列的点没过
当时反复看了十几遍代码都没看出哪里错了......甚至最后怀疑是爆int了还把所有int都改成long long了,但还是没过 TAT
最后只能输出NO骗分了TAT
求大佬指教!!!QwQ
#include<cstdio>
#include<algorithm>
//#define int long long
//#define int int
using namespace std;
long long x[1000020];
long long n,k;
long long _max=-1,_min=214748364;
long long ans=-1;
long long minn(long long a,long long b)
{
return a>b?b:a;
}
long long read()
{
long long num=0;
char c=getchar();
while(c<'0'||c>'9')c=getchar();
while('0'<=c&&c<='9')num=num*10+c-'0',c=getchar();
return num;
}
int main()
{
//scanf("%d %d",&n,&k);
n=read(),k=read();
for(long long i=1;i<=n;i++)
{
long long jx=read(),j=read();
//scanf("%d %d",&jx,&j);
x[jx]+=j;
if(jx>_max)_max=jx;
if(jx<_min)_min=jx;
}
bool flag=0;
for(long long i=_max;i>=_min&&i-k>=0;i--)
{
if(x[i]!=0&&x[i-k]!=0)
{
long long num=minn(x[i],x[i-k]);
//if(!((n==1&&x[i]<2)||(n==1&&k>0))){
if(k==0&&x[i]>=2) {//若k==0且当前数列有>=2个数
if(num*i>ans),ans=num*i;
flag=1;
}
else//既然x[i]和x[i-k]都有值,则这个数列中数的个数一定>=2,就不用判断个数了
if(num*(i+ i-k )>ans)
{
ans=num*(i+ i-k );
flag=1;
}
}
}
if(flag==0)printf("NO");
else
printf("%lld",ans);
return 0;
}