求助
查看原帖
求助
548270
RAND_MAX楼主2024/8/24 21:30

rt,我看题解写的有点抽象(看不懂orz),而且这题是个黄,想请问一下正确做法,以及有无佬能帮忙看下我场上的做法为什么假了/写挂了。

#include<bits/stdc++.h>
#define int __int128
#define R read()
using namespace std;
int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c>'9'||c<'0')
	{
		if(c=='-')
		{
			f=-1;
		}
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=(x<<1)+(x<<3)+c-48;
		c=getchar();
	}
	return x*f;
}
void write(int x)
{
	static int st[35],top=0;
	if(x<0)
	{
		x=-x;
		putchar('-');
	}
	do
	{
		st[top++]=x%10;
		x/=10;
	}while(x);
	while(top)
	{
		putchar(st[--top]+48);
	}
	putchar('\n');
}
int T,n,m;
signed main()
{
//	freopen("data.in","r",stdin);
//	freopen("E.txt","w",stdout);
	T=R;
	while(T--)
	{
		n=R,m=R;
		if(n&1)
		{
			if(m>=((n+1)>>1))
			{
				write(n+(n-1)*(n-1)/2);
				continue;
			}
			if((n+1)%4)
			{
				int cnt=(n+1>>1)*(n+1>>1),he,lst,fl=m&1;
				if(m==1)
				{
					write(cnt);
				}
				else
				{
					m>>=1;
					he=n-3;
					lst=n+1-4*m;
					cnt+=(he+lst)*m;
					if(!fl)
					{
						cnt-=lst;
					}
					write(cnt);
				}
			}
			else
			{
				m++;
				int cnt=(n-1>>1)*(n-1>>1),he,lst,fl=m&1;
				if(m==1)
				{
					write(cnt);
				}
				else
				{
					m>>=1;
					he=n-1;
					lst=n+3-4*m;
					cnt+=(he+lst)*m;
					if(!fl)
					{
						cnt-=lst;
					}
					write(cnt);
				}
			}
		}
		else
		{
			if(m>=n/2)
			{
				write((n+2)*n>>1);
				continue;
			}
			if(n%4)
			{
				int cnt=(n+2>>1)*(n+2>>1),fl=m&1,he,lst;
				if(m==1)
				{
					write(cnt);
				}
				else
				{
					m>>=1;
					he=n-2;
					lst=n-4*m+2;
					cnt+=(he+lst)*m;
					if(!fl)
					{
						cnt-=lst;
					}
					write(cnt);
				}
			}
			else
			{
				m++;
				int cnt=(n>>1)*(n>>1),fl=m&1,he,lst;
				if(m==1)
				{
					write(cnt);
				}
				else
				{
					m>>=1;
					he=n;
					lst=n-4*(m-1);
					cnt+=(he+lst)*m;
					if(!fl)
					{
						cnt-=lst;
					}
					write(cnt);
				}
			}
		}
	}
 	return 0;
}

2024/8/24 21:30
加载中...