• 【暑假集训模拟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
    */
  • 相关阅读:
    2020年目标检测大盘点 | ECCV大盘点(附论文&代码下载)
    Transformer再下一城!low-level多个任务榜首被占领,北大华为等联合提出预训练模型IPT
    opencv------->>>>>>打印点
    生信工具
    生物信息学练习1-综合使用软件-2
    生物信息学练习1-综合使用软件
    操作指南之下载数据
    安装生物信息学软件-HUMAnN2
    多样性指数介绍
    统计学基础知识-欧式距离与其他
  • 原文地址:https://www.cnblogs.com/conprour/p/15139404.html
Copyright © 2020-2023  润新知