首页 > 其他分享 >abc289F 题解

abc289F 题解

时间:2023-02-15 20:46:37浏览次数:50  
标签:y2 return 题解 back y1 push abc289F x1

某人 vp 时 10min 口胡了这道题,然后调了两天,第一天卡在 WA 4,第二天 WA 7 WA 10 交相辉映,心态快崩了,因此写了这篇题解。

\(a=b\) 处理有借鉴 这篇题解


first observation:两维独立。

显然。一次操作可以看成两维分别选点操作。后面的操作均在一维上。

second observation:两次分别选择 \(s\) 与 \(t\) 的操作可以看成 \(x \gets x + 2(t - s)\)。

显然。手动模拟都行。

然后你发现一次操作不影响奇偶性,然后可以把两点奇偶性不同的情况判掉。然后你发现你可以移动任意偶数步,就做完了……吗?

判掉 \(s=t\),那时有可能只会翻转一次。

回到组合两维的地方。我的做法是翻 \(x\) 时永远选择 \(y=c\)。这样子在 \(a \neq b\) 即第一维操作偶数次一定可行。那么 \(a \neq b\) 且 \(c \neq d\) 做完了。接着来看 \(a = b\) 或 \(c = d\)。

现在考虑有至少一者相等。先判掉两维均相等。

如果 \(a = b\) 且 \(sx \neq tx\) 可以先对 \((a, c)\) 操作,\(c = d\) 同理。这样显然不会影响另一维上的操作,因为由构造 \(a \neq b\) 时一定有解。然后做完了。

感觉在空心黄中算是很简单。要不是它难调我觉得空心蓝都行。

#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
vector<int> work(int x, int a, int b, int y) {
  vector<int> w;
  if(a == b) {
    if(x != y) w.push_back(a);
    return w;
  }
  while (x < y) {
    w.push_back(a); w.push_back(a + 1);
    x += 2;
  }
  while(x > y) {
    w.push_back(a+1); w.push_back(a);
    x -= 2;
  }
  return w;
}

vector<pair<int, int> > ans;
int x1, y1, x2, y2, a, b, c, d; 
int solve() {
  ans.clear();
  if(abs(x1 % 2) != abs(x2 % 2)) return 0;
  if(abs(y1 % 2) != abs(y2 % 2)) return 0;
  if(a == b && x1 != x2 && (2 * a - x1) != x2) return 0;
  if(c == d && y1 != y2 && (2 * c - y1) != y2) return 0;
  if(a == b && c == d) {
    if(x1 == x2 && y1 == y2) return 1;
    int x3 = 2 * a - x1, y3 = 2 * c - y1;
    if(x3 == x2 && y3 == y2) return ans.push_back({a, c}), 1;
    else return 0;
  }
  if(a == b && x1 != x2) {
    ans.push_back({a, c}); x1 = 2 * a - x1; y1 = 2 * c - y1;
  }
  if(c == d && y1 != y2) {
    ans.push_back({a, c}); x1 = 2 * a - x1; y1 = 2 * c - y1;
  }
  vector<int> x = work(x1, a, b, x2), y = work(y1, c, d, y2);
  for(auto u : x) ans.push_back({u, c});
  for(auto v : y) ans.push_back({a, v});
  return 1;
}

int main () {
  scanf("%d %d %d %d %d %d %d %d", &x1, &y1, &x2, &y2, &a, &b, &c, &d);
  if(solve()) {
    printf("Yes\n");
    for(auto i : ans) {
      int x = i.first, y = i.second;
      printf("%d %d\n", x, y);
    }
  } else printf("No\n");
}

标签:y2,return,题解,back,y1,push,abc289F,x1
From: https://www.cnblogs.com/purplevine/p/17124566.html

相关文章

  • P7468 愤怒的小N 题解
    P7468愤怒的小N题解首先发现答案等于\[\sum_{i=0}^{n-1}[cnt(i)\&1]\cdotf(i)\\\]其中\(cnt(x)\)为\(x\)在二进制表示下\(1\)的个数。考虑从高到低枚举第一个......
  • AtCoder Beginner Contest 272 题解
    AtCoderBeginnerContest272Solution目录AtCoderBeginnerContest272Solution更好的阅读体验戳此进入题面链接题面Luogu链接abcd跳了[ABC272E]AddandMex题面S......
  • [ABC272F] Two Strings 题解
    [ABC272F]TwoStringsSolution目录[ABC272F]TwoStringsSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面给定两字符串$S,T$,求......
  • CF819D Mister B and Astronomers 题解
    CF819DMisterBandAstronomersSolution目录CF819DMisterBandAstronomersSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面存在......
  • P9064 [yLOI2023] 苦竹林 题解
    洛谷P9064[yLOI2023]苦竹林题意给定一个数列$a$,找一个最小的整数$ε$,使得$a$存在一个长度为$m$的子数列(可以不连续)$b\(,\)b$中任意两数之差的......
  • [ABC267D] Index × A(Not Continuous ver.) 题解
    [ABC267D]Index×A(NotContinuousver.)Solution目录[ABC267D]Index×A(NotContinuousver.)Solution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体......
  • AtCoder Beginner Contest 266 题解
    AtCoderBeginnerContest266Solution目录AtCoderBeginnerContest266Solution更好的阅读体验戳此进入题面链接题面Luogu链接abcd都没什么可说的[ABC266E]Throwi......
  • [ABC268D] Unique Username 题解
    [ABC268D]UniqueUsernameSolution目录[ABC268D]UniqueUsernameSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面给定$n$各字......
  • LG-P6157 有趣的游戏 题解
    LG-P6157有趣的游戏Solution目录LG-P6157有趣的游戏Solution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面给定$n$个点的树,存在点权......
  • [ABC267D] Index × A(Not Continuous ver.) 题解.
    [ABC267E]ErasingVertices2Solution目录[ABC267E]ErasingVertices2Solution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面给定$n$......