萌新刚学OI,36pts求助
查看原帖
萌新刚学OI,36pts求助
735763
_ChongYun_楼主2024/4/27 12:43

rt。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int q,n,m,sum=0,ans[10];
int id(int x,int y){ return (x-1)*m+y; }
int f(int op,int x){ 
	int u;
	if(!op) u=(id(x-1,m)+1)*id(x-1,m)/2;
	else u=(id(n,1)+1)*n/2*(x-1)+(x-1)*(x-2)/2*n;
	return u;
}
signed main(){
	cin>>q;
	while(q--){
		cin>>n>>m;
		memset(ans,0,sizeof(ans));
		sum=(n*m+1)*n*m/2;
		int l=2,r=m,mid;
		while(l<=r){
			mid=(l+r)>>1;
			if(f(1,mid)>=sum-f(1,mid)){
				r=mid-1;
				ans[2]=mid;
			}
			else l=mid+1;
		}
		l=2,r=m;
		while(l<=r){
			mid=(l+r)>>1;
			if(f(1,mid)<=sum-f(1,mid)){
				l=mid+1;
				ans[1]=mid;
			}
			else r=mid-1;
		}
		l=2,r=n;
		while(l<=r){
			mid=(l+r)>>1;
			if(f(0,mid)>=sum-f(0,mid)){
				r=mid-1;
				ans[4]=mid;
			}
			else l=mid+1;
		}
		l=2,r=n;
		while(l<=r){
			mid=(l+r)>>1;
			if(f(0,mid)<=sum-f(0,mid)){
				l=mid+1;
				ans[3]=mid;
			}
			else r=mid-1;
		}
		int minn=INT_MAX,anss;
		for(int i=1;i<=(n==1?2:4);i++){
			if(max(f((i<=2?1:0),ans[i]),sum-f((i<=2?1:0),ans[i]))<minn){
				minn=max(f((i<=2?1:0),ans[i]),sum-f((i<=2?1:0),ans[i]));
				anss=i;
			}
		}
		cout<<(anss<=2?"V ":"H ")<<ans[anss]<<endl; 
	}
	return 0;
}
2024/4/27 12:43
加载中...