首页 > 其他分享 >[ABC227H] Eat Them All 题解

[ABC227H] Eat Them All 题解

时间:2024-10-12 10:44:34浏览次数:10  
标签:Them gf int 题解 char fa Eat hd ct

唐唐题。

思路

容易发现,我们只要知道了一条边总共经过了多少次(不计方向),我们就可以跑欧拉回路。

自己手玩一下,发现只要枚举四个变量,其他的都可以用方程解出来。

求完之后,还需要判一下联通性。

实际效率是很快的,远远跑不满。

时间复杂度:\(O(a_i^4)\)。

Code

#include <bits/stdc++.h>
using namespace std;

int tp;
int a1, a2, a3;
int a4, a5, a6;
int a7, a8, a9;
int b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12;
int c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12;
int ct;
int fa[10];
int hd[10];
char ch[2010];
struct edge {
  int to, nxt, *val; char w;
} e[100];

inline int gf(int x) {
  return (fa[x] == x ? x : fa[x] = gf(fa[x]));
}
inline void mer(int x, int y) {
  fa[gf(x)] = gf(y);
}
inline void add(int x, int y, int*z, char a, char b) {
  e[++ct] = {y, hd[x], z, a}, hd[x] = ct;
  e[++ct] = {x, hd[y], z, b}, hd[y] = ct;
}
inline void dfs(int x) {
  for (int&i = hd[x]; i; i = e[i].nxt) {
    if (*e[i].val > 0) {
      char c = e[i].w;
      (*e[i].val)--;
      dfs(e[i].to);
      ch[++tp] = c;
    }
  }
}

int main() {
  cin >> a1 >> a2 >> a3;
  cin >> a4 >> a5 >> a6;
  cin >> a7 >> a8 >> a9;
  for (b1 = 0; b1 <= min(a1 * 2, a2 * 2); b1++) {
    b3 = 2 * a1 - b1;
    for (b2 = 0; b2 <= min(a2 * 2, a3 * 2); b2++) {
      b4 = 2 * a2 - b1 - b2;
      b5 = 2 * a3 - b2;
      if (b4 < 0) break;
      for (b6 = 0; b6 <= min(a4 * 2, a5 * 2); b6++) {
        b8 = 2 * a4 - b3 - b6;
        if (b8 < 0) break;
        for (b7 = 0; b7 <= min(a5 * 2, a6 * 2); b7++) {
          b9 = 2 * a5 - b4 - b6 - b7;
          b10 = 2 * a6 - b5 - b7;
          b11 = 2 * a7 - b8;
          b12 = 2 * a9 - b10;
          if (b9 + b11 + b12 != a8 * 2 || b9 < 0 || b10 < 0 || b11 < 0 || b12 < 0) continue;
          fa[1] = 1, fa[2] = 2, fa[3] = 3;
          fa[4] = 4, fa[5] = 5, fa[6] = 6;
          fa[7] = 7, fa[8] = 8, fa[9] = 9;
          if (b1) mer(1, 2);
          if (b2) mer(2, 3);
          if (b3) mer(1, 4);
          if (b4) mer(2, 5);
          if (b5) mer(3, 6);
          if (b6) mer(4, 5);
          if (b7) mer(5, 6);
          if (b8) mer(4, 7);
          if (b9) mer(5, 8);
          if (b10) mer(6, 9);
          if (b11) mer(7, 8);
          if (b12) mer(8, 9);
          if (gf(1) != gf(2)) continue;
          if (gf(1) != gf(3)) continue;
          if (gf(1) != gf(4)) continue;
          if (gf(1) != gf(5)) continue;
          if (gf(1) != gf(6)) continue;
          if (gf(1) != gf(7)) continue;
          if (gf(1) != gf(8)) continue;
          if (gf(1) != gf(9)) continue;
          if (b1) add(1, 2, &b1, 'L', 'R');
          if (b2) add(2, 3, &b2, 'L', 'R');
          if (b3) add(1, 4, &b3, 'U', 'D');
          if (b4) add(2, 5, &b4, 'U', 'D');
          if (b5) add(3, 6, &b5, 'U', 'D');
          if (b6) add(4, 5, &b6, 'L', 'R');
          if (b7) add(5, 6, &b7, 'L', 'R');
          if (b8) add(4, 7, &b8, 'U', 'D');
          if (b9) add(5, 8, &b9, 'U', 'D');
          if (b10) add(6, 9, &b10, 'U', 'D');
          if (b11) add(7, 8, &b11, 'L', 'R');
          if (b12) add(8, 9, &b12, 'L', 'R');
          dfs(1);
          for (int i = 1; i <= tp; i++) cout << ch[i]; cout << "\n";
          exit(0);
        }
      }
    }
  }
  cout << "NO\n";
}

标签:Them,gf,int,题解,char,fa,Eat,hd,ct
From: https://www.cnblogs.com/JiaY19/p/18460041

相关文章

  • systemd实现seatunnel自动化启停
    在systemd中,您可以通过配置服务单元文件来设置服务在失败或退出后自动重启。这对于确保关键服务在意外退出时能够自动恢复运行非常有用。下面是实现systemd自动重启服务的步骤:通用操作1.创建或编辑服务单元文件假设服务单元文件位于/etc/systemd/system/my-service......
  • [ABC222H] Beautiful Binary Tree 题解
    第一次写拉格朗日反演。思路考虑如何操作。发现出根节点外有\(n-1\)个点是一。由于我们只能操作\(n-1\)次,相当于每一次操作必须把两个一合并。一个点最多往上跳两层,所以要求它的父亲或者爷爷是一。考虑设\(f_i\)表示当前节点为一并且整个子树总和为\(i\)的方案数,\(g......
  • 题解 QOJ5048【[ECFinal19K] All Pair Maximum Flow】
    题目描述给你一个\(n\)个点\(m\)条边的图,它是平面上的正\(n\)边形和一些对角线,节点按逆时针方向编号为\(1\)到\(n\)。对角线只可能在节点处相交。每条边有一个容量,求每个点对之间的最大流的和。\(n\leq200000,m\leq400000\)。solution做法每次找出边权最小的边\(......
  • 蓝桥杯真题 穿越时空之门(第十五届蓝桥杯省赛PythonB组A题) c++题解
    问题如下(附链接):穿越时空之门题解代码如下:#include<iostream>usingnamespacestd;intx1(inti){inta=0;while(i){a+=i%2;i/=2;}returna;}intx2(inti){intb=0;while(i){b+=i%4;i/=4;}returnb;}intmain()......
  • 线段树分治略解&杂题解析
    可能做到好题之后会再更新吧。总叙线段树与离线询问结合技巧又被称为线段树分治。使用线段树分治维护的信息通常会在某一个时间段内出现,要求在离线的前提下回答某一个时刻的信息并,则可以考虑使用线段树分治的技巧。以下是线段树分治的基本模板:change将信息按时间段覆盖在线......
  • [USACO23FEB] Hungry Cow P 题解
    T7[USACO23FEB]HungryCowP这题就比较正常了,蓝紫之间的水平。我们发现Bessie能活\(10^{14}\)天(,导致我们不好直接按照值域来维护。发现给某一天送干草,影响到的是后面很多天,这是个区间问题。所以考虑动态开点线段树。线段树的每个节点维护\(\mathit{ans},\mathit{cnt},\ma......
  • Seata RM模块与Seata Server之间的通信渠道设计
    胡弦,视频号2023年度优秀创作者,互联网大厂P8技术专家,SpringCloudAlibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者,资深架构师,技术负责人,极客时间训练营讲师,四维口袋KVP最具价值技术专家,技术领域专家团成员,2021电子工业出版社年度优秀作者,获得2023电......
  • csp-s真题题解
    csp题目讲解P8818[CSP-S2022]策略游戏学习笔记感觉非常复杂?对于现在的我还是有深度的,首先第一个大坑就是并不需要真的求出c矩阵,这个题意就是让你在区间中选数,但要求乘积最大,所以要分讨。你假定\(a_i\ge0\),那这时如果\(min(b_i)\ge0\)取\(max(a_i)\),否则取\(min(a_i\ge......
  • P3959 [NOIP2017 提高组] 宝藏 题解
    P3959[NOIP2017提高组]宝藏题解搜索魅力时刻怎么说,四种做法比较??的模拟退火跑得快但是正确性有问题的状压DP跑得慢但是一定正确的状压DP时间复杂度很玄学的DFS+剪枝我就选择了搜索的做法先打个暴搜,70pts点击查看暴搜代码#include<bits/stdc++.h>usingna......
  • 有关 OneDrive 中 Copilot 的常见问题解答
    很多小伙伴已经用上了OneDrive中的Copilot功能:Copilot重磅更新!OneDrive全新功能炸裂一个技巧实现在SharePoint中使用Copilot针对大家提问比较多的问题,在此做一个汇总:1、OneDrive中的Copilot目前在哪里可用?OneDrive中的Copilot目前在 OneDriveWeb上仅适用于商......