【暑假集训模拟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
",ans);
	}
	return 0;
}
/*
3
1 1 2
2 16 1 
3 4 33
*/
原文地址:https://www.cnblogs.com/conprour/p/15139404.html