【暑假集训模拟DAY5】杂项-分治&二分&倍增&快速幂
前言
题还没改完,先写个前言...
今天又挂分(悲伤)
期望得分:30+20+60+20=130
实际得分:0+20+0+10=30
心态不够稳吧...考试的时候看T1T2T3感觉很玄学,都感觉好像有思路,但是又总是差一点实现不出来正解,反复纠结思考了2-3h之后写暴力心态已经不太好了,因为觉得要崩(实际上打好暴力虽然不算太高但也说的过去)
T1最后打表还抄错个数,爆零;T3没写文件注释掉了(以前从来没有过啊!),爆零;T4不知道为什么挂10分
总结点什么的话,就是在无论何时都要心态积极,考场上一切都有希望,也要相信自己!
题解
T1 road奇怪的道路
大分治,考场上没做出来的原因是没有发现每一层构造的规律,想的过于简单
正解:有 4 种状态,分别拓展成不同的新状态,在递归的时候分类讨论
代码:
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pr pair<int,int>
#define mp make_pair
const int INF = 0x3f3f3f3f;
int n,T,x,y;
pr find(int x,int y,int siz,int opt,int goal,int v)
{
if(siz==1)
{
return mp(x,y);
}
int nsiz=siz>>1;
int pows=nsiz*nsiz;
if(opt==1)
{
if(goal<v+pows) return find(x,y,nsiz,2,goal,v);
else if(goal<v+2*pows) return find(x+nsiz,y,nsiz,1,goal,v+pows);
else if(goal<v+3*pows) return find(x+nsiz,y+nsiz,nsiz,1,goal,v+2*pows);
else return find(x,y+nsiz,nsiz,3,goal,v+3*pows);
}//2113
if(opt==2)
{
if(goal<v+pows) return find(x,y,nsiz,1,goal,v);
else if(goal<v+2*pows) return find(x,y+nsiz,nsiz,2,goal,v+pows);
else if(goal<v+3*pows) return find(x+nsiz,y+nsiz,nsiz,2,goal,v+2*pows);
else return find(x+nsiz,y,nsiz,4,goal,v+3*pows);
}//1422 1224
if(opt==3)
{
if(goal<v+pows) return find(x+nsiz,y+nsiz,nsiz,4,goal,v);
else if(goal<v+2*pows) return find(x+nsiz,y,nsiz,3,goal,v+pows);
else if(goal<v+3*pows) return find(x,y,nsiz,3,goal,v+2*pows);
else return find(x,y+nsiz,nsiz,1,goal,v+3*pows);
}//3341 4331
if(opt==4)
{
if(goal<v+pows) return find(x+nsiz,y+nsiz,nsiz,3,goal,v);
else if(goal<v+2*pows) return find(x,y+nsiz,nsiz,4,goal,v+pows);
else if(goal<v+3*pows) return find(x,y,nsiz,4,goal,v+2*pows);
else return find(x+nsiz,y,nsiz,2,goal,v+3*pows);
}//4234 3442
}
int calc(pr x,pr y)
{
double abs1=abs(x.first-y.first),
abs2=abs(x.second-y.second);
return 10*sqrt(abs1*abs1+abs2*abs2)+0.5;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&x,&y);
int siz=pow(2,n);
pr xa=find(1,1,siz,1,x,1);
pr ya=find(1,1,siz,1,y,1);
int ans=calc(xa,ya);
printf("%d\n",ans);
}
return 0;
}
/*
3
1 1 2
2 16 1
3 4 33
*/