首页 > 其他分享 >ABC353F 分讨

ABC353F 分讨

时间:2024-06-17 17:33:51浏览次数:26  
标签:大块 ABC353F int x2 y1 abs 分讨 y2

回来补补题。

分析:

我先考虑 \(k\) 很大的时候,大块和大块间的移动,我们不得不尽量避免小块:

我们容易发现这样时是最优的,可以发现就是在斜着走,也就是典型的切比雪夫距离。斜着走一次需要经过两条边,所以花费是两倍的切比雪夫距离

要是起点和终点不在大块上呢?

首先考虑它们不在同一大块(这里的大块意义不同于前面说的大块,具体见下)内:

显然,路径上必然是从起点到一个相邻的大块,然后进行大块和大块间的移动到达与终点相邻的大块,然后再直直进入。

路径简化为:起点起点相邻的大块 再到 终点相邻的大块 最后到 终点

我们明确起点和终点,但起点相邻的大块终点相邻的大块并不确定,但相邻的大块只有 \(4\) 个,所以枚举一下 \(4\times 4\) 就行了,如果起点或终点本来就在大块上就不用考虑了。

要是它们是在同一大块的小块呢?

如图:

那么它们间的路径可能就不会经过大块了,可以在小块内之间相互抵达,但也可能经过大块,所以还是要进行上面的那种讨论。

\(k\) 较小时呢?

\(k=1\),显然就不用考虑那么多了,直接就是曼哈顿距离了。

\(k=2\) 呢?

大块间移动的最短距离不再是切比雪夫距离了,特判一下就行了。

\(k=3\) 时就等同于前面 \(k\) 很大的情况啦。

然后我们就可以轻松切了这题啦。

code:

#include<bits/stdc++.h>
#define int long long 
using namespace std;
int k;
int solve(int x1,int y1,int x2,int y2)
{
    if(k==2) return 2*max(abs(x1-x2),abs(y1-y2))-abs(abs(x1-x2)-abs(y1-y2))/2; 
    return 2*max(abs(x1-x2),abs(y1-y2));
}
vector<pair<pair<int,int>,int>>v[2];
void check(int x,int y,int op)
{
    if((x/k+y/k)%2) v[op].push_back({{x/k,y/k},0});
    else
    v[op].push_back({{x/k-1,y/k},(x%k)+1}),v[op].push_back({{x/k,y/k-1},(y%k)+1}),
    v[op].push_back({{x/k+1,y/k},k-(x%k)}),v[op].push_back({{x/k,y/k+1},k-(y%k)});
}
signed main()
{
    int x1,y1,x2,y2,ans=1e18;
    cin>>k;
    cin>>x1>>y1>>x2>>y2;
    if(k==1) {cout<<abs(y1-y2)+abs(x1-x2);return 0;}
    if(x1/k==x2/k&&y1/k==y2/k) ans=abs(y1-y2)+abs(x1-x2);
    check(x1,y1,0);check(x2,y2,1);
    for(auto i:v[0]) for(auto j:v[1]) ans=min(ans,solve(i.first.first,i.first.second,j.first.first,j.first.second)+i.second+j.second);
    cout<<ans;
    return 0;
}

标签:大块,ABC353F,int,x2,y1,abs,分讨,y2
From: https://www.cnblogs.com/ilibilib/p/18252868

相关文章

  • [ABC353F] Tile Distance 题解
    [ABC353F]TileDistance题解题目传送门:洛谷,AtcoderSolution很恶心人的分类讨论题。很显然走大格子大概率比走小格子快。对终点和起点向上下左右枚举大格子,我们就把问题转化为给两个大格子\((a,b)\)、\((c,d)\),求怎样走最快。对角的大格子可以通过\(2\)步相互到达,如下......
  • abc353f 题解
    大分讨,由于没注意到细节挂大分。下面称大小为\(n\timesn\)的为大格子,\(1\times1\)的为小格子。把\(n\timesn\)个小格子组成的正方形称为一个部分。分析我们先来讨论一般情况。思考一对于\(n\ge3\)的一般情况,如果要求任意两个大格子到对方的距离最小,怎么做?根据贪......
  • CatOJ C0493C 计数 分讨
    对于\(\sum|E'|\),直接计算是简单的。对于\(\sum|E'|^2\),拆下贡献,可以拆成\(\sum\sum_{i,j\inE'}1\),设\(U\)为\(i\)和\(j\)两条边连接的点集,转化一下式子即为\(\sum_i\sum_j2^{n-|U|}\)。对于\(\sum|E'|^3\)同理,\(U\)为\(i,j,k\)三条边连接的点集,原式即为\(......
  • #12 讨厌分讨
    MirianyandMatchstick题面令\(f_{i,0/1,j}\)表示第\(i\)个数选A或B能否产生\(j\)的价值,枚举转移可以做到\(O(n^2)\)。可以发现\(1\)答案为\(1\)的\(j\)在分奇偶后都是一段区间,两个并起来会是一个中间最多一个空缺,证明可以看CF1852D题解,可以维护每个\(f_{i......
  • 关于转移中需要根据期望相对大小进行分讨的期望 dp
    转移式形如\(\displaystylef_i=\sum_{f_i>f_j}g(i,j)f_j+\sum_{f_i<f_j}h(i,j)\boldsymbol{f_i}\)。考虑初始化所有\(f_i\)为正无穷,化一下式子后发现......