我找不到满分题解,结果我肝一个下午肝出来了,有一说一,在考场碰到这题估计要没,今年国赛加油把,方法过于暴力,仅供参考
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
ll ans;
void addans1(ll f,ll i,ll j) {
f *= f;
if(i == 1) {
if(j == 1) {
}else if(j == 2){
ans += f * 1;
}else if(j == 3) {
ans += f * 2;
}
}else if(i == 2) {
if(j == 3) {
ans += f * 3;
}else if(j == 2) {
ans += f * 4;
}else if(j == 1) {
ans += f * 5;
}
}else if(i == 3) {
if(j == 1) {
ans += f * 6;
}else if(j == 2) {
ans += f * 7;
}else if(j == 3) {
ans += f * 8;
}
}
}
void addans2(ll f,ll i,ll j) {
f *= f;
if(i == 3) {
if(j == 2) {
ans += f * 1;
}else if( j == 3) {
ans += f * 2;
}
}else if(i == 2) {
if(j == 3){
ans += f * 3;
}else if(j == 2) {
ans += f * 4;
}else if(j == 1) {
ans += f * 5;
}
}else if(i == 1){
if(j == 1) {
ans += f * 6;
}else if(j == 2){
ans += f * 7;
}else if(j == 3){
ans += f * 8;
}
}
}
void addans3(ll f,ll i,ll j) {
f *= f;
if(i == 1) {
if(j == 2)
ans += f * 1;
else if(j == 1)
ans += f * 2;
}else if(i == 2) {
if(j == 1) {
ans += f * 3;
}
else if(j == 2)
ans += f * 4;
else if(j == 3)
ans += f * 5;
}else if (i == 3) {
if(j == 3)
ans += f * 6;
else if(j == 2)
ans += f * 7;
else if(j == 1)
ans += f * 8;
}
}
void addans4(ll f,ll i,ll j) {
f *= f;
if(i == 3) {
if(j == 2) {
ans += f * 1;
}
else if(j == 1)
ans += f * 2;
}else if(i == 2) {
if(j == 1)
ans += f * 3;
else if(j == 2)
ans += f * 4;
else if(j == 3)
ans += f * 5;
}else if(i == 1) {
if(j == 3)
ans += f * 6;
else if(j == 2)
ans += f * 7;
else if(j == 1)
ans += f * 8;
}
}
void dfs(ll x,ll y,ll k,int tpp) {
if(k > n || k == 0)
return;
ll t = 1;
for(int i = 1;i <= k;i++) {
t *= 3;
}
if(x > t || y > t) {
dfs(x,y,k+1,tpp);
}else{
ll f = t / (3);
ll xx = 0,yy = 0;
bool falg = 0;
for(ll i = 1;i <= 3;i++) {
for(ll j = 1;j <= 3;j++) {
if(xx + i * f >= x && xx + (i - 1) * f < x &&
yy + j * f >= y && yy + (j - 1) * f < y) {
if(tpp == 1)
addans1(f,i,j);
else if(tpp == 2)
addans2(f,i,j);
else if(tpp == 3)
addans3(f,i,j);
else
addans4(f,i,j);
if(tpp == 1) {
if( (i == 1 && j == 1) || (i == 1 && j == 3) || (i == 3 && j == 1) || (i == 3 && j == 3)) {
dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,1);
}else if((i == 1 && j == 2) || (i == 3 && j == 2) ) {
dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,2);
}else if((i == 2 && j == 3) || (i == 2 && j == 1)){
dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,3);
}else
dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,4);
}else if(tpp == 2) {
if( (i == 1 && j == 1) || (i == 1 && j == 3) || (i == 3 && j == 1) || (i == 3 && j == 3)) {
dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,2);
}else if((i == 1 && j == 2) || (i == 3 && j == 2) ) {
dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,1);
}else if((i == 2 && j == 3) || (i == 2 && j == 1)){
dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,4);
}else
dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,3);
}else if(tpp == 3) {
if( (i == 1 && j == 1) || (i == 1 && j == 3) || (i == 3 && j == 1) || (i == 3 && j == 3)) {
dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,3);
}else if((i == 1 && j == 2) || (i == 3 && j == 2) ) {
dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,4);
}else if((i == 2 && j == 3) || (i == 2 && j == 1)){
dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,1);
}else
dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,2);
}else if (tpp == 4) {
if( (i == 1 && j == 1) || (i == 1 && j == 3) || (i == 3 && j == 1) || (i == 3 && j == 3)) {
dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,4);
}else if((i == 1 && j == 2) || (i == 3 && j == 2) ) {
dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,3);
}else if((i == 2 && j == 3) || (i == 2 && j == 1)){
dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,2);
}else
dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,1);
}
falg = 1;
break;
}
}
if(falg)
break;
}
}
}
ll cale(ll x,ll y) {
ans = 0;
dfs(x,y,1,1);
return ans;
}
int main()
{
ll x1,y1,x2,y2;
cin>>n;
cin>>x1>>y1>>x2>>y2;
ll a = cale(x1 + 1,y1 + 1);
ll b = cale(x2 + 1,y2 + 1);
cout<<abs(a - b);
}