[2019HDU多校第二场][HDU 6591][A. Another Chess Problem]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6591
题目大意:二维坐标系上,所有满足\(5|2x+y\)的点都被设为障碍物,无法通过。现给出一对点,问从其中一点走到另一点的最少移动次数以及对应的方案数(每次可以移动一个单位长度)
题解:首先把图画出来,是长这样的

图中所有不能被走过的点用红点表示。可以发现(这个是五子棋中的八卦阵)这些点将图中的格点分成了若干个小块(图中用蓝色方块标出),每个小块里四个点保证两两之间的距离不会被红点所影响。于是我们可以考虑将点与所在的块对应起来,将点之间的移动转换为块之间的移动计算答案。
本人在这题中是将每个方块下方的红点作为该块对应的点,并以点\((2,1)\)当做新坐标系下的\((1,0)\)来进行坐标系的转化,而在块中,可以设每个方块的左上角为点\(0\),顺时针依次设为\(1,2,3\),这样方便之后计算在同一块内进行移动的答案。
转换完坐标系后,对于块间的移动,就可以看成求我要移动\(n\)行,\(m\)列的方案数。这里由于\(n,m\)可能为负数,于是可以考虑将他们全部转换为正数之后再做,转换的方法有很多,其中一种方法是:先判断\(n\)的正负,如果为负可以交换起点和终点,这样答案是一样的,之后判断\(m\)的正负,如果为负则可以做一个对称变换,将\(m\)改为正数,这里要注意点在块内的位置也可能会发生改变。
然后我们会发现,如果我们连续往一个方向移动,移动的步数会比交错方向要多,因此我们要尽量减少连续往相同方向移动的次数,这个最少的次数是可以计算出来的,假设其为\(t\),那么方案数就要乘上\(2^t\),这是因为连续往一个方向走的时候,必须要在块内走对角线,因此每次会有两种走法。另外我们还要考虑在不同位置改变移动方向的方案数,这个是可以用组合数来计算的,之后我们就只需要枚举从起点块的哪一点出发以及到达终点块时处于哪一个点即可。
#include<bits/stdc++.h>
using namespace std;
#define N 200001
#define LL long long
#define MOD 998244353
int T,n,m,ans,num,f[N],p[N],q[N],dis[][];
struct Point
{
int x,y,o;
void read(){scanf("%d%d",&x,&y);}
void get()
{
int tmp=((*x+y)%+)%;
if(tmp==)o=,y-=;
else if(tmp==)o=,x--,y-=;
else if(tmp==)o=,x--,y--;
else if(tmp==)o=,y--;
else while(true);
int tmpx=(*x+y)/,tmpy=(*y-x)/;
x=tmpx,y=tmpy;
}
}A,B;
void pretype()
{
f[]=;
p[]=q[]=;
f[]=p[]=q[]=;
for(int i=;i<N;i++)
{
f[i]=2ll*f[i-]%MOD;
p[i]=1ll*p[i-]*i%MOD;
q[i]=1ll*(MOD-MOD/i)*q[MOD%i]%MOD;
}
for(int i=;i<N;i++)
q[i]=1ll*q[i-]*q[i]%MOD;
for(int i=;i<;i++)
for(int j=;j<;j++)
dis[i][j]=min(abs(i-j),-abs(i-j));
}
int C(int n,int m){return 1ll*p[n]*q[m]%MOD*q[n-m]%MOD;}
void rua(int o1,int o2,int n,int m)
{
int w[]={n,m};
int res=,tot=,t;
if(w[o1]< || w[o2]<)return;
if(o1==o2 && w[o1]< && n+m>)return;
res=(n+m)*-;
if(n+m>)
{
w[o1]--,w[o2]--;
if(o1==o2)
{
t=abs(w[o1]+-w[o1^]);
res+=t,tot=f[t];
if(w[o1]+>=w[o1^])
tot=1ll*tot*C(w[o1]+,w[o1^])%MOD;
else tot=1ll*tot*C(w[o1^]-,w[o1])%MOD;
}
else
{
t=abs(w[o1]-w[o2]);
res+=t,tot=f[t];
if(w[o1]>=w[o2])
tot=1ll*tot*C(w[o1],w[o2])%MOD;
else tot=1ll*tot*C(w[o2],w[o1])%MOD;
}
}
t=dis[o1][A.o];
res+=t;if(t>)tot=2ll*tot%MOD;
t=dis[o2+][B.o];
res+=t;if(t>)tot=2ll*tot%MOD;
if(res==ans)num=(num+tot)%MOD;
if(res<ans)ans=res,num=tot;
}
int main()
{
pretype();
scanf("%d",&T);
while(T--)
{
A.read(),A.get();
B.read(),B.get();
n=B.y-A.y,m=B.x-A.x;
if(n== && m==)
{
ans=dis[A.o][B.o];
num=ans>?:;
printf("%d %d\n",ans,num);
continue;
}
if(n< || (n== && m<))
swap(A,B),n=-n,m=-m;
if(m<)A.o=(-A.o)%,B.o=(-B.o)%,m=-m;
ans=,num=;
for(int i=;i<;i++)
for(int j=;j<;j++)
rua(i,j-,n,m);
printf("%d %d\n",ans,num);
}
}
[2019HDU多校第二场][HDU 6591][A. Another Chess Problem]的更多相关文章
- [2019HDU多校第一场][HDU 6578][A. Blank]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题目大意:长度为\(n\)的数组要求分别填入\(\{0,1,2,3\}\)四个数中的任意一个,有 ...
- [2019HDU多校第一场][HDU 6580][C. Milk]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6580 题目大意:\(n\times m\)大小的方格上有\(k\)瓶水,喝完每瓶水都需要一定的时间.初 ...
- [2019HDU多校第一场][HDU 6584][G. Meteor]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6584 题目大意:求所有满足\(0<\frac{p}{q}\leq1, gcd(p,q)=1,p\ ...
- [2019HDU多校第一场][HDU 6590][M. Code]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6590 题目大意(来自队友):二维平面上有\(n\)个点,每个点要么是黑色要么是白色,问能否找到一条直线 ...
- [2019HDU多校第一场][HDU 6588][K. Function]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6588 题目大意:求\(\sum_{i=1}^{n}gcd(\left \lfloor \sqrt[3] ...
- 杭电多校第二场 hdu 6315 Naive Operations 线段树变形
Naive Operations Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 502768/502768 K (Java/Other ...
- 2019HDU多校第一场1001 BLANK (DP)(HDU6578)
2019HDU多校第一场1001 BLANK (DP) 题意:构造一个长度为n(n<=10)的序列,其中的值域为{0,1,2,3}存在m个限制条件,表示为 l r x意义为[L,R]区间里最多能 ...
- 2019牛客多校第二场 A Eddy Walker(概率推公式)
2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...
- 2014多校第二场1011 || HDU 4882 ZCC Loves Codefires (贪心)
题目链接 题意 : 给出n个问题,每个问题有两个参数,一个ei(所要耗费的时间),一个ki(能得到的score).每道问题需要耗费:(当前耗费的时间)*ki,问怎样组合问题的处理顺序可以使得耗费达到最 ...
随机推荐
- [转帖]linux bash环境变量简单总结
linux bash环境变量简单总结 来源链接:http://www.178linux.com/8005 原创文章,如有转载,请注明原文地址 需要简单学习一下. 其实 我都是直接放一个 .sh文件到 ...
- Linux(CentOS 7)下安装postgres
事情背景:需要在Linux上安装postgres数据库,但安装目录想直接指定,所以想通过源码编译安装pg 首先下载源码安装包.源码下载地址:https://github.com/postgres/po ...
- (四)Resquest 知识点总结 (来自那些年的笔记)
目录 URL和URI的区别 获取URL.URI 什么是HttpServletResquest 获取请求头中字段的内容 获取请求信息的数据 将客户机的请求变为一个流返回 常用的方法 request乱码问 ...
- PAT甲级 二叉查找树 相关题_C++题解
二叉查找树 PAT (Advanced Level) Practice 二叉查找树 相关题 目录 <算法笔记> 重点摘要 1099 Build A Binary Search Tree ( ...
- Python笔记day20-面向对象
目录 面向对象 1 装饰器 1.1 装饰器是什么? 1.2 装饰器 2 面向对象 (Object Oriented) 简称OO 2.1 面向对象相关术语 2.2 类和对象 2.3 类和对象的实现和书写 ...
- ...:ES6中扩展运算符(spread)和剩余运算符(rest)详解
1.扩展运算符(spread) demo1:传递数据代替多个字符串的形式 let test= function(a,b,c){ console.log(a); console.log(b); cons ...
- 在.netcore webapi项目中使用后台任务工具Hangfire
安装Hangfire 在webapi项目中通过nuget安装Hangfire.Core,Hangfire.SqlServer,Hangfire.AspNetCore,截止到目前的最新版本是1.7.6. ...
- gin框架初识(先跑一个简单demo) ①
Gin 是一个 go 写的 web 框架,具有高性能的优点.官方地址:https://github.com/gin-gonic/gin 先跑一个demo(先安装gin框架,具体见官方地址): 1.vs ...
- ES6--JavaScript扩展知识点(let、const、解构)
一,ES2015(ES6)新增了两个声明变量的关键字:let.const let:只在代码块内{}有效,不可重复声明,不会提前初始化 1.只在代码块内有效 { let a = 1; var b = 2 ...
- UDP及操作系统理论
UDP介绍 udp协议又称用户数据报协议 在OSI七层模型中,它于TCP共同存在于传输层 仅用于不要求可靠性,不要求分组顺序且数据较小的简单传输,力求速度 UDP结合socket用法 1.创建sock ...