首页 > 其他分享 >Codeforces 1455E Four Points

Codeforces 1455E Four Points

时间:2024-02-29 16:23:08浏览次数:16  
标签:std min int max px py Codeforces Four Points

首先确定每个点最后走到的是哪一个点。
这部分可以枚举全排列。

假设左上角的点为 \((x_0, y_0)\),右上角的点为 \((x_1, y_1)\),左下角的点为 \((x_2, y_2)\),右下角的点为 \((x_3, y_3)\)。
令最终的点为 \((x'_0, y'_0)\),以此类推。

那么最终的答案就是 \(\sum\limits_{i = 0}^3 |x_i - x'_i| + |y_i - y'_i|\)。

令 \(x'_0 = x'_2 = a\),那么如果当 \(\min(x_0, x_2)\le a\le \max(x_0, x_2)\) 时,\(|x_0 - x'_0| + |x_2 - x'_2| = |x_0 - x_2|\),这是最优的。
否则说如果不在这个区间中,多走出去 \(1\),答案就会多 \(2\)。
对于 \(x'_1 = x'_3\) 也是同理的。

那么对于 \(x\) 这一维,要让 \(x_0, x_1\) 这 \(2\) 部分都取到最优,就对正方形边长 \(d\) 有个限制,\(\min(x_1, x_3) - \max(x_0, x_2)\le d\le \max(x_1, x_3) - \min(x_0, x_2)\),注意还有个 \(d\ge 0\) 的限制。
否则如果 \(d\) 不在这个区间里,就只能让一个边取到最优,另一边则要扩展出去。

相应的,\(y\) 这一维对 \(d\) 也有个限制区间。
如果 \(x, y\) 限制区间有交,那么 \(d\) 取在交的这个区间内就可以让两维都取到最小值。
否则可以考虑使一边最优,另一边调整到这一边的区间内,且越少越好,例如当 \(r_x < l_y\) 时,将 \(d\) 调整到 \(r_x\) 或 \(l_y\) 时是最优的。

时间复杂度 \(O(Tn!n)\)。

代码
#include<bits/stdc++.h>
using i64 = long long;
int dx[4], dy[4], px[4], py[4];
inline void Main() {
    for (int i = 0; i < 4; i++) scanf("%d%d", &dx[i], &dy[i]);
    int p[4] = {0, 1, 2, 3};
    i64 ans = 1e10;
    do {
        for (int i = 0; i < 4; i++) px[i] = dx[p[i]], py[i] = dy[p[i]];
        int lx = std::min(px[1], px[3]) - std::max(px[0], px[2]), rx = std::max(px[1], px[3]) - std::min(px[0], px[2]);
        int ly = std::min(py[0], py[1]) - std::max(py[2], py[3]), ry = std::max(py[0], py[1]) - std::min(py[2], py[3]);
        if (rx < 0 || ry < 0) continue;
        i64 tot = 0ll + abs(px[0] - px[2]) + abs(px[1] - px[3]) + abs(py[0] - py[1]) + abs(py[2] - py[3]);
        if (rx < ly) tot += 2ll * (ly - rx);
        if (ry < lx) tot += 2ll * (lx - ry);
        ans = std::min(ans, tot);
    } while (std::next_permutation(p, p + 4));
    printf("%lld\n", ans);
}
int main() {
    int T; scanf("%d", &T);
    while (T--) Main();
    return 0;
}

标签:std,min,int,max,px,py,Codeforces,Four,Points
From: https://www.cnblogs.com/rizynvu/p/18044602

相关文章

  • Codeforces 451E Devu and Flowers
    首先考虑没有\(f_i\)的限制的时候,此时可以用插板法得到方案数为\(\binom{s+n-1}{n-1}\)。考虑钦定\(f_i\)不合法,那么就相当于先在\(i\)这里选\(f_i+1\),剩下的随意分配,方案数就为\(\binom{s-(f_i+1)+n-1}{n-1}\)。算完过后能发现会算重存在\(>1\)......
  • Codeforces 1830C Hyperregular Bracket Strings
    考虑到区间的限制\([l,r]\)就是要求\([l,r]\)里的字符会在\([l,r]\)里找到匹配。假设还有个区间\([l',r']\)满足\(l\lel'\ler\ler'\),能够发现限制变成了\([l,l'),[l',r],(r,r']\)这\(3\)个区间内的字符能在对应区间内找到匹配。继续,假设\(l\lel'\le......
  • Codeforces 863E Turn Off The TV
    能发现其实就是区间加查询区间最小值。如果最小值\(>1\)则这个区间可以删掉。考虑离散化端点,先把区间表示为\([l_i,r_i)\)的形式,方便离散化端点。这样子离散化出来的端点也是\([x,y)\)的形式。对于区间加查询区间最小值,很容易用线段树维护。时间复杂度\(O(n\logn)......
  • Codeforces Round 929 (Div. 3)
    CodeforcesRound929(Div.3)A-TurtlePuzzle:RearrangeandNegate代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=pa......
  • 13 Codeforces Round 886 (Div. 4)G. The Morning Star(简单容斥)
    G.TheMorningStar思路:用map记录x,y,以及y-x、y+x从前往后统计一遍答案即可公式\(ans+=cnt[x]+cnt[y]-2*cnt[x,y]+cnt[y+x]+cnt[y-x]\)\(cnt[x]+cny[y]-2*cnt[x,y]\)是统计坐标轴方向的,-2倍是需要把本身这个点给减去容斥是减一倍,这里还需要把自己给挖掉\(cnt[y+x]+cnt[y......
  • Codeforces 264E Roadside Trees
    首先考虑时间增长的问题,设第\(i\)棵树的种植时间为\(t_i\)。那么第\(x\)棵树比第\(y\)棵树高就是\(h_x+(t_y-t_x)>h_y\),也就是\(h_x-t_x>h_y-t_y\)。所以可以直接用\(h_i-t_i\)当作第\(i\)棵树的高度,即\(h'_i\leftarrowh_i-t_i\)。对于增加,考虑......
  • CodeForces 1844H Multiple of Three Cycles
    洛谷传送门CF传送门首先环是不用管的,只用判环长是否为\(3\)的倍数即可。考虑设\(f(x,y,z)\)表示\(x\)个\(1\)链,\(y\)个\(2\)链,\(z\)个\(0\)链,组成所有环长都为\(3\)的倍数的方案数。注意到\(f(x,y,z)=(x+y+z)f(x,y,z-1)\)(可以接到剩下的任意......
  • Codeforces Round 929 (Div. 3)
    B.TurtleMath:FastThreeTask数学#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=1e5+10;inta[N];voidsolve(){ intn; cin>>n; intsum=0; map<int,int>mp; intmx=0; for(inti=1;i<=n;i++){ cin......
  • 11 .Codeforces Round 891 (Div. 3)E. Power of Points(推公式+前缀和优化)
    E.PowerofPoints题解参考#include<bits/stdc++.h>#defineintlonglong#definerep(i,a,b)for(inti=(a);i<=(b);++i)#definefep(i,a,b)for(inti=(a);i>=(b);--i)#define_for(i,a,b)for(inti=(a);i<(b);++i)#definepii......
  • Codeforces Round 929 (Div. 3) 题解(D-G)
    比赛链接:https://codeforces.com/contest/1933官解暂未放出。质量不错的一场D3。CF1933D.TurtleTenacity:ContinualMods题意将数组\(a_{1..n}\ge1\)重排,问是否能使\(((a_1\mathbin{\rmmod}a_2)\mathbin{\rmmod}a_3)\cdots\mathbin{\rmmod}a_n\ne0\)......