题目链接

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

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

由于图一定是二分图(黑白染色),没有奇环,所有偶环一定可以拆成二元环,所以可以看做找匹配。两个点能匹配当且仅当他们 \(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. SElinux 导致 Keepalived 检测脚本无法执行

    哈喽大家好,我是咸鱼 今天我们来看一个关于 Keepalived 检测脚本无法执行的问题 一位粉丝后台私信我,说他部署的 keepalived 集群 vrrp_script 模块中的脚本执行失败了,但 ...

  2. [Love] VSCODE 调试 LOVE 引擎游戏

    VSCODE调试LOVE引擎游戏 安装插件 配置插件 按 CTRL + SHIFT + P,打开Preferences: Open User Settings (JSON),为settings.jso ...

  3. Linux 内核设备驱动程序的IO寄存器访问 (上)

    Linux 内核提供了一套可缓存的设备 IO 寄存器访问机制,即 regmap.regmap 机制支持以统一的接口,访问多种不同类型的设备 IO 寄存器,如内存映射的设备 IO 寄存器,和需要通过 I ...

  4. Eclipse修改Web项目名称

    Eclipse修改Web项目名称需要两步: 1:修改该项目目录下:.project文件 <projectDescription><name>SpringMVC-Annotati ...

  5. Vika and Her Friends

    Smiling & Weeping ----早知道思念那么浓烈,不分手就好了 题目链接:Problem - A - Codeforces 题目大意:有n个Vika的朋友在一个n*m的方格中去捉 ...

  6. 【题解】Educational Codeforces Round 142(CF1792)

    没有手速,再加上被 E 卡了,废掉了. A.GamingForces 题目描述: Monocarp 正在玩电脑游戏.他打算杀死 \(n\) 个怪兽,第 \(i\) 个的血量为 \(h_i\). Mon ...

  7. js原生 toggle函数编写

    工作中遇到了需要动态切换slide下拉框展示与隐藏,同时需要切换元素上附加的样式,以下脚本为实现此功能的实践. //元素点击时切换隐藏与展示逻辑 var slidsDownShow = documen ...

  8. 20个最佳实践提升Terraform工作流程|Part 1

    Terraform 是管理基础设施及代码(IaC)最常用的工具之一,它能使我们安全且可预测地对基础设施应用更改.刚开始上手 Terraform 可能会感觉有些不容易,但很快就能对该工具有基本的了解,随 ...

  9. Skynet通讯遇到的奇怪问题

    问题 最近在做一个内部通讯的服务器, 用的自带的gateserver和socketchannel做通讯, 在使用skynet.unpack或者string.unpack("XXXX" ...

  10. Solution Set -「ABC 197」

    「ABC 197A」Rotate Link. 略. #include<bits/stdc++.h> using namespace std; int main(){ char a,b,c; ...