MLE求助
  • 板块P1852 跳跳棋
  • 楼主_x_y_
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/7/12 08:15
  • 上次更新2023/11/3 10:25:16
查看原帖
MLE求助
590925
_x_y_楼主2023/7/12 08:15

这份代码可以过5个点剩下15个点MLE,请问是为什么

#include<cstdio>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
	int x, y, z;
}a1, a2;
bool operator == (node a, node b){
	return a.x == b.x && a.y == b.y && a.z == b.z;
}
bool operator != (node a, node b){
	return !(a == b);
}
int d1, d2, k;
node getroot(node a){
	d1 = a.y - a.x;
	d2 = a.z - a.y;
	if(d1 == d2)
		return a;
	if(d1 < d2){
		k = (d2 - 1) / d1;
		a.x += k * d1;
		a.y += k * d1;
		return getroot(a);
	}
	k = (d1 - 1) / d2;
	a.y -= k * d2;
	a.z -= k * d2;
	return getroot(a);
}
int dep(node a, int tcnt){
	d1 = a.y - a.x;
	d2 = a.z - a.y;
	if(d1 == d2)
		return tcnt;
	if(d1 < d2){
		k = (d2 - 1) / d1;
		a.x += k * d1;
		a.y += k * d1;
		return dep(a, tcnt + k);
	}
	k = (d1 - 1) / d2;
	a.y -= k * d2;
	a.z -= k * d2;
	return dep(a, tcnt + k);
}
node jump(node a, int len){
	d1 = a.y - a.x;
	d2 = a.z - a.y;
	if(len == 0)
		return a;
	if(d1 < d2){
		k = (d2 - 1) / d1;
		if(k > len)
			k = len;
		a.x += k * d1;
		a.y += k * d1;
		return jump(a, len - k);
	}
	k = (d1 - 1) / d2;
	if(k > len)
		k = len;
	a.y -= k * d2;
	a.z -= k * d2;
	return jump(a, len - k);
}
long long ans;
int dep1, dep2, mid;
int l, r;
void go(node a1, node a2){
	l = 1;
	r = dep1;
	while(l < r){
		mid = (l + r + 1) >> 1;
		if(jump(a1, mid) == jump(a2, mid))
			r = mid - 1;
		else
			l = mid;
	}
	ans += 2 * (l + 1);
}
int main(){
	scanf("%d%d%d%d%d%d", &a1.x, &a1.y, &a1.z, &a2.x, &a2.y, &a2.z);
	if(getroot(a1) != getroot(a2)){
		puts("NO");
		return 0;
	}
	dep1 = dep(a1, 1);
	dep2 = dep(a2, 1);
	if(dep1 < dep2){
		swap(dep1, dep2);
		swap(a1, a2);
	}
	ans += dep1 - dep2;
	a1 = jump(a1, dep1 - dep2);
	if(a1 == a2){
		puts("YES");
		printf("%d\n", ans);
		return 0;
	}
	go(a1, a2);
	puts("YES");
	printf("%d\n", ans);
	return 0;
}
2023/7/12 08:15
加载中...