题目链接

如果把方向看做有向边,整个图是一个内向基环树。

所以考虑哪些点有可能放在基环树的非环部分上,当且仅当一个点周围有严格小于他的点。

由于图一定是二分图(黑白染色),没有奇环,所有偶环一定可以拆成二元环,所以可以看做找匹配。两个点能匹配当且仅当他们 \(s\) 相等。

发现一个周围没有严格小于他的点,必须要匹配。有的点可以参与匹配可以不参与匹配。所以可以跑有源汇上下界网络流。

// LUOGU_RID: 139219522
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+9,INF=1e9;
const char ch[]="UDLR";
int T,a[N],n,m,s,t,hd[N],e_num,hx[N],p,vh[N],q[N],l,r,b[N],v[N],g[N],in[N],ans;
struct edge{
int v,nxt,f;
}e[N<<4];
void add_edge(int u,int v,int f)
{
// printf("%d %d %d\n",u,v,f);
e[++e_num]=(edge){v,hd[u],f};
hd[u]=e_num;
e[++e_num]=(edge){u,hd[v],0};
hd[v]=e_num;
}
int bfs()
{
for(int i=0;i<=t;i++)
vh[i]=hd[i],v[i]=0;
v[q[l=r=1]=s]=1;
while(l<=r)
{
for(int i=hd[q[l]];i;i=e[i].nxt)
if(e[i].f&&!v[e[i].v])
v[q[++r]=e[i].v]=v[q[l]]+1;
++l;
}
return v[t];
}
int dfs(int x,int fl)
{
if(x==t)
return fl;
int k;
for(int&i=vh[x];i;i=e[i].nxt)
{
if(v[e[i].v]==v[x]+1&&e[i].f&&(k=dfs(e[i].v,min(fl,e[i].f))))
{
e[i].f-=k,e[i^1].f+=k;
return k;
}
}
return 0;
}
int dinic()
{
int ans=0,k;
while(bfs())
while(k=dfs(s,INF))
ans+=k;
return ans;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m),p=n*m;
for(int i=0;i<p;i++)
scanf("%d",a+i);
for(int i=0;i<=p+3;i++)
in[i]=hd[i]=0,b[i]=-1;
ans=0;
e_num=1;
for(int i=0;i<p;i++)
{
int fl=0;
if((i%m^i/m)&1)
{
if(i-m>=0&&a[i-m]==a[i])
add_edge(i,i-m,1);
if(i+m<p&&a[i+m]==a[i])
add_edge(i,i+m,1);
if(i%m&&a[i-1]==a[i])
add_edge(i,i-1,1);
if(i%m^m-1&&a[i+1]==a[i])
add_edge(i,i+1,1);
}
if(i-m>=0&&a[i-m]<a[i])
fl=1;
if(i+m<p&&a[i+m]<a[i])
fl=1;
if(i%m&&a[i-1]<a[i])
fl=1;
if(i%m^m-1&&a[i+1]<a[i])
fl=1;
if(fl)
{
if((i%m^i/m)&1)
add_edge(p,i,1);
else
add_edge(i,p+1,1);
}
else
{
if((i%m^i/m)&1)
in[p]--,in[i]++;
else
in[p+1]++,in[i]--;
}
}
add_edge(p+1,p,INF);
for(int i=0;i<=p+1;i++)
{
if(in[i]<0)
add_edge(i,p+3,-in[i]);
else
add_edge(p+2,i,in[i]),ans+=in[i];
}
s=p+2,t=p+3;
int k=dinic();
if(k^ans)
{
puts("NO");
continue;
}
int s=1;
for(int i=0;i<p;i++)
{
int fl=0;
if((i%m^i/m)&1)
{
if(i-m>=0&&a[i-m]==a[i])
{
s+=2;
if(e[s].f)
b[i]=0,b[i-m]=1,g[i]=a[i]/2+(a[i]&1),g[i-m]=a[i]/2;
}
if(i+m<p&&a[i+m]==a[i])
{
s+=2;
if(e[s].f)
b[i]=1,b[i+m]=0,g[i]=a[i]/2+(a[i]&1),g[i+m]=a[i]/2;
}
if(i%m&&a[i-1]==a[i])
{
s+=2;
if(e[s].f)
b[i]=2,b[i-1]=3,g[i]=a[i]/2+(a[i]&1),g[i-1]=a[i]/2;
}
if(i%m^m-1&&a[i+1]==a[i])
{
s+=2;
if(e[s].f)
b[i]=3,b[i+1]=2,g[i]=a[i]/2+(a[i]&1),g[i+1]=a[i]/2;
}
}
if(i-m>=0&&a[i-m]<a[i])
fl=1;
if(i+m<p&&a[i+m]<a[i])
fl=1;
if(i%m&&a[i-1]<a[i])
fl=1;
if(i%m^m-1&&a[i+1]<a[i])
fl=1;
if(fl)
s+=2;
}
for(int i=0;i<p;i++)
{
if(b[i]==-1)
{
if(i-m>=0&&a[i-m]<a[i])
b[i]=0,g[i]=a[i]-a[i-m];
else if(i+m<p&&a[i+m]<a[i])
b[i]=1,g[i]=a[i]-a[i+m];
else if(i%m&&a[i-1]<a[i])
b[i]=2,g[i]=a[i]-a[i-1];
else if(i%m^m-1&&a[i+1]<a[i])
b[i]=3,g[i]=a[i]-a[i+1];
}
}
puts("YES");
for(int i=0;i<p;i++)
{
printf("%d ",g[i]);
if(i%m==m-1)
puts("");
}
for(int i=0;i<p;i++)
{
printf("%c ",ch[b[i]]);
if(i%m==m-1)
puts("");
}
}
}

[CF1416F] Showing Off的更多相关文章

  1. Android showing LoadingView or EmptyView for Activity or Fragment

    这几天利用一些时间,整理了一下,写了一个简单的工具类,用来快速的显示LoadingView或者EmptyView,以前都是定义一个layout,根布局为FrameLayout,再在layout布局文件 ...

  2. How to: Fix a network printer suddenly showing as offline in Windows Vista, 7 or 8 « Robin's Blog

    This post has become quite popular – so I've updated it with a bit more detail, plus some people's e ...

  3. [Hive - Tutorial] Creating, Showing, Altering, and Dropping Tables

    Creating, Showing, Altering, and Dropping Tables See Hive Data Definition Language for detailed info ...

  4. Showing All Messages : error: open /Users/apple/Library/Developer/Xcode/DerivedData/xxx-dkhmpttmnuppvbcxijlcxacfpzcl/Build/Products/Debug-iphoneos/xxx.app/EaseUIResource.bundle/arrow@2x.png: N

    2报错 Showing All Messages : error: open /Users/apple/Library/Developer/Xcode/DerivedData/xxx-dkhmpttm ...

  5. 3 Ways to Force Unmount in Linux Showing “device is busy”

    3 Ways to Force Unmount in Linux Showing “device is busy” Updated August 8, 2019By Bobbin ZachariahL ...

  6. Showing progress bar in a status bar pane

    在工具卡显示进度条,原文链接:http://www.codeproject.com/Articles/35/Showing-progress-bar-in-a-status-bar-pane 1.构造 ...

  7. MBProgressHUD not showing

    In my app, I am loading a resource heavy view that takes about 1 to 2 seconds to load. So I am loadi ...

  8. Showing 2 changed files with 3 additions and 3 deletions.

    4  lib/matplotlib/__init__.py View   @@ -126,9 +126,9 @@ def compare_versions(a, b):     else: ...

  9. Apache Tomcat Not Showing in Eclipse Server Runtime Environments

    In my case I needed to install "JST Server Adapters". I am running Eclipse 3.6 Helios RCP ...

  10. Eclipse启动报错[ out of memory error has occurred ]或[ An internal error occurred while showing an internal error ]

    自我总结,有什么需要纠正或更好的方案,请告知,谢谢! 最近上来看到好多同学都遇到了这个问题,之前我也好几次碰到这个问题,很是恼火,什么没干,eclipse一开电脑就卡死了,后来发现不管是新打开ecli ...

随机推荐

  1. Socket.io入门

    Socket.io入门 根据官方文档socket.io使用必须客户端根服务端一致,socket.io不兼容webSocket或者其他模块,因为socket.io在连接时做了自定义处理, 所以不同的长连 ...

  2. Web应用防火墙--规则防护

    一.什么是Web应用防火墙? Web应用防火墙对网站.APP的业务流量安全及合规性保护,对业务流量的识别恶意特征提取.分析识别出恶意流量并进行处理, 将正常安全的流量回源到业务服务器, 保护网站核心业 ...

  3. 「joisc 2019 - d2t2」ふたつの料理 Two Dishes

    [link.](E - ふたつの料理 (Two Dishes) (atcoder.jp) 我要放假 神仙题. 首先可以把两根轴拉成平面(which is a common trick),把决策的过程看 ...

  4. Python 有趣的模块之pynupt——通过pynput控制鼠标和键盘

    写在前面 Python中有许多有趣和强大的模块,其中一个非常有趣的模块就是pynupt.pynupt是基于pynput模块的一个封装,用于控制鼠标和键盘.它可以实现自动化操作和游戏外挂等功能. 本文将 ...

  5. [HNCTF 2022 WEEK2]e@sy_flower

    花指令分析 如果没接触过花指令,先看这个博客,大致了解一下花指令 https://www.cnblogs.com/Here-is-SG/p/15802040.html 点击此处下载附件 查壳 32位, ...

  6. 千呼万唤始出来 JDK 21 LTS, 久等了

    平地起惊雷!!! 目录 英雄的迟暮 大人时代变了 JDK 21 LTS 前 JAVA并发编程模型 JDK 21 LTS 中的 JAVA 并发编程模型 虚拟线程 VS 线程池 The Last 你可以称 ...

  7. 树莓派3B/3B+的串口使用

    树莓派包含两个串口,一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0).硬件串口由硬件实现,有单独的波特率时钟源,性能高.可靠.mini串口时钟源是由CPU ...

  8. Matlab 实现连续PID环节与标记系统-3dB点

    Matlab 实现连续PID环节 连续PID环节传递函数: \[\frac{O(s)}{I(s)} = K_P \cdot \left( 1 + \frac{K_{I}}{s} + K_D\cdot ...

  9. 10 Myths About Introverts

    By Carl King [ Translations: Spanish| German | Dutch | Italian | Portuguese ] I wrote this list in l ...

  10. 【ZT】关于字符集

    utf8 全包容了gbk ,并不是说超集和子集:8i 的数据库 的 utf8 是  4位定长的字符编码:9i 和以上数据库的utf8   有4位定长AL32UTF8和  不定长的  UTF8  ,都是 ...