首页 > 其他分享 >CF1416F Showing Off

CF1416F Showing Off

时间:2024-11-14 15:22:30浏览次数:1  
标签:Off no int Showing CF1416F id bool rep match

万物皆可匈牙利!

首先这道题有几个好想的性质,对于一个位置 \((i,j)\),这个位置连的另一个能到达的位置这个位置同样能够到达。所以,如果四周存在 \(S_{x,y}<S_{i,j}\),那么我们可以直接将 \((i,j)\) 连边到 \((x,y)\),\(A_{i,j}\leftarrow S_{i,j}-S_{x,y}\)。我们将这样的位置 \((i,j)\) 设为白点,否则为黑点。还有一种情况就是在同一个环内的位置,而我们可以注意到这样的环一定是偶环,所以我们只考虑二元环是一定不劣的。

对于 \(S_{i,j}\) 相同的位置,组二元环等价于一个匹配问题。显然所有黑点都需要有一个二元环包括。我们对矩形黑白染色,那么这张图是一张二分图。它相当于是这张二分图有黑点和白点,我们需要所有的黑点都在一个匹配内。虽然这个是一个经典的上下界问题,但是匈牙利是更优美的算法(一定不是我没有想到上下界网络流),所以我准备用匈牙利做这道题。本以为我能很快切掉,没想到噩梦才刚刚开始。

首先我想到了个很假的做法,就是不论是边顺序还是搜索顺序,都是黑在前白在后,然后跑二分图最大匹配。但是这显然有问题,因为我们并不要求最大匹配!我们考虑左部点右部点同时跑最大匹配,只要找到一个黑点,我们就进入搜索,首先前半部分可以跟最大匹配一样。而如果我们找不到最大匹配,如果我们存在与自己相邻的而匹配点为白点的,也可以更换匹配点并且判为增广成功,这样就可以找到可行的匹配。

交上去发现匈牙利被卡了,但都是些雕虫小技,直接随一个加入顺序就可以让匈牙利飞快通过~

代码:

#include <bits/stdc++.h>
#define rep(i, l, r) for (int i (l); i <= r; ++ i)
#define rrp(i, l, r) for (int i (r); i >= l; -- i)
#define pii pair <int, int>
#define eb emplace_back
#define ls p << 1
#define rs ls | 1
#define inf 1000000000
#define id(x, y) (x - 1) * m + (y)
using namespace std;
constexpr int N = 2e5 + 5;
typedef unsigned long long ull;
typedef long long ll;
inline ll rd () {
  ll x = 0, f = 1;
  char ch = getchar ();
  while (! isdigit (ch)) {
    if (ch == '-') f = -1;
    ch = getchar ();
  }
  while (isdigit (ch)) {
    x = (x << 1) + (x << 3) + ch - 48;
    ch = getchar ();
  }
  return x * f;
}
int n, m;
vector <int> a[N], b[N], e[N];
vector <char> c[N];
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
char ch[4] = {'R', 'D', 'L', 'U'};
bool no[N];
bool vis[N];
int match[N], stk[N], top;
bool dfs (int u) {
  for (auto v : e[u]) {
    if (vis[v]) continue;
    vis[v] = 1; stk[++ top] = v;
    if (! match[v] || dfs (match[v])) {
      match[v] = u, match[u] = v;
      return 1;
    }
    if (! no[match[v]]) {
      match[match[v]] = 0;
      match[v] = u, match[u] = v;
      return 1;
    }
  }
  return 0;
}
int p[N], sum;
bool cmp (int x, int y) {
  return no[x] > no[y];
}
mt19937 rnd (time (0));
void solve () {
  n = rd (), m = rd ();
  rep (i, 1, n * m) match[i] = 0, e[i].clear (), no[i] = 0;
  rep (i, 1, n) {
    a[i].resize (m + 2);
    b[i].resize (m + 2);
    c[i].resize (m + 2);
    rep (j, 1, m) b[i][j] = rd ();
  }
  int cnt = 0;
  bool fl = 0;
  rep (i, 1, n) {
    rep (j, 1, m) {
      int mn = 2e9;
      bool ok = 0;
      rep (k, 0, 3) {
        int x = dx[k] + i, y = dy[k] + j;
        if (x < 1 || y < 1 || x > n || y > m) continue;
        mn = min (mn, b[x][y]);
        if (b[x][y] < b[i][j]) {
          a[i][j] = b[i][j] - b[x][y];
          c[i][j] = ch[k]; ok = 1;
          break;
        }
      }
      if (ok) continue;
      if (mn > b[i][j]) fl = 1;
      no[id (i, j)] = 1; ++ cnt;
    }
  }
  if (fl) return void (puts ("NO"));
  rep (i, 1, n) {
    rep (j, 1, m) {
      if (j < m) {
        if (b[i][j] == b[i][j + 1]) {
          e[id (i, j)].eb (id (i, j + 1));
          e[id (i, j + 1)].eb (id (i, j));
        }
      }
      if (i < n) {
        if (b[i][j] == b[i + 1][j]) {
          e[id (i, j)].eb (id (i + 1, j));
          e[id (i + 1, j)].eb (id (i, j));
        }
      }
    }
  }
  rep (i, 1, n * m) p[i] = i;
  shuffle (p + 1, p + n * m + 1, rnd);
  rep (i, 1, n * m) {
    if (! no[p[i]] || match[p[i]]) continue;
    if (! dfs (p[i])) break;
    while (top) vis[stk[top --]] = 0;
  }
  bool flag = 1;
  rep (i, 1, n) {
    rep (j, 1, m) {
      if (! match[id (i, j)] && no[id (i, j)]) {
        flag = 0; break;
      }
      if (match[id (i, j)] == id (i, j + 1)) { 
        a[i][j] = 1, a[i][j + 1] = b[i][j] - 1;
        c[i][j] = 'R', c[i][j + 1] = 'L';
      } 
      if (match[id (i, j)] == id (i + 1, j)) {
        a[i][j] = 1, a[i + 1][j] = b[i][j] - 1;
        c[i][j] = 'D', c[i + 1][j] = 'U';
      }
    }
  }
  if (! flag) return void (puts ("NO"));
  puts ("YES");
  rep (i, 1, n) {
    rep (j, 1, m) {
      printf ("%d ", a[i][j]);
    } puts ("");
  }
  rep (i, 1, n) {
    rep (j, 1, m) {
      putchar (c[i][j]), putchar (' ');
    } puts ("");
  }
}
int main () {
  // freopen ("1.in", "r", stdin);
  // freopen ("1.out", "w", stdout);
  for (int T (rd ()); T; -- T) solve ();
  cerr << 1.0 * clock () / CLOCKS_PER_SEC << endl;
}

标签:Off,no,int,Showing,CF1416F,id,bool,rep,match
From: https://www.cnblogs.com/lalaouyehome/p/18546052

相关文章

  • 真题练习6-Excel电子表格-全国计算机等级考试二级MS Office高级应用与设计考试【汪老
    视频解析真题练习6-Excel电子表格_哔哩哔哩_bilibili题库下载全国计算机等级考试题库下载(用电脑下载安装):请点击题目要求某公司销售部门主管大华拟对本公司产品前两季度的销售情况进行统计,按下述要求帮助大华完成统计工作:1.在考生文件夹下,将“Excel素材.xlsx”文件另存为“......
  • laravel PhpOffice 读取表格数据
    /***更新安通船期*Description*AuthorAllen*Date2024-11-11*@paramRequest$request[description]*@return[type][description]*/publicfunctionupdateAntongShipDate(Request$request){......
  • Goffloader:内存执行,无需磁盘
    免责声明该公众号分享的安全工具和项目均来源于网络,仅供安全研究与学习之用,如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本公众号无关。安全公司Praetorian发布了GoffLoader,这是一种旨在简化BOF文件和非托管CobaltStrikePE文件直接在内存中执行的工具,而......
  • WPS Office手机去广高级版
    工具介绍功能特点     WPSOffice是使用人数最多的移动办公软件,独有手机阅读模式,字体清晰翻页流畅;完美支持文字,表格,演示,PDF等51种文档格式;新版本具有海量精美模版及高级功能安装环境[名称]:WPSOffice高级版[大小]:140M[版本]:v18.8.1[语言]:简体中文 [安装环境]:a......
  • ONLYOFFICE 8.2版本使用心得与评测
    文章目录ONLYOFFICE8.2版本使用心得与评测一、界面与操作体验二、兼容性与文件格式支持三、强大的协作功能四、个性化的品牌定制功能五、电子表格与演示文稿功能六、新功能的体验与感悟七、开源社区的力量总结ONLYOFFICE8.2版本使用心得与评测自从ONLYOFFICE这款......
  • 【就业反馈】2401期GIS开发特训营最高薪资13000元,人均1.4个offer
    总有人问想学GIS开发零基础能学会吗?学完真的能推荐就业吗?当然啦!!!新中地2401期GIS开发特训营毕业学员,就业反馈来啦!2401期GIS开发特训营,24年6月21日结业2401期就业数据反馈2401期就业数据反馈2401期班就业反馈图在新中地GIS开发特训营,很多人几乎都是从零......
  • 真题练习44-Word字处理-全国计算机等级考试一级计算机基础及MS Office应用考试【汪老
    第44组请根据题目要求,完成下列操作:在考生文件夹下,打开文档WORD.DOCX,按照要求完成下列操作并以该文件名(WORD.DOCX)保存文档。1.将标题段(“模型变量构建”)的文本效果设置为内置样式“渐变填充–灰色”,并修改其阴影效果为“透视/左上”、阴影颜色为蓝色(标准色);将标题段文字设置为......
  • 真题练习45-PowerPoint演示文稿-全国计算机等级考试一级计算机基础及MS Office应用考
    第45组1.新建演示文稿yswg.pptx,共4张幻灯片,每张幻灯片的页脚插入与其幻灯片编号相同的数字,例如第四张幻灯片,页脚内容为“4”。2.为整个演示文稿应用“丝状”主题,放映方式为“观众自行浏览(窗口)”。按各幻灯片页脚内容从大到小重排幻灯片的顺序。3.第一张幻灯片版式为“标题幻灯......
  • ONLYOFFICE 8.2深度测评:开源的办公套件
    本文一、OCR与PDF功能升级,实现文档管理智能化1.PDF编辑与OCR文本识别2.丰富的PDF标记和注释选项二、表格功能的深度增强,数据分析更高效1.新增数据透视表功能2.自动填充和智能建议三、实时协作功能升级,团队合作更加顺畅1.多人在线协作,实时编辑2.文档加密与权限管......
  • ONLYOFFICE 8.2:功能升级与高效办公的新境界
    ONLYOFFICE8.21.关于ONLYOFFICE2.协作编辑PDF3.改进的简洁界面4.优化性能5.文档编辑器中的新功能6.体验感想前言:最近,在大家的无限期待下,ONLYOFFICE迎来了8.2版本的更新,带来了诸多令人期待的新特性和改进。作为一位热爱探索新技术、追求高效办公的用户,我迫不......