[CF1416F] Showing Off
如果把方向看做有向边,整个图是一个内向基环树。
所以考虑哪些点有可能放在基环树的非环部分上,当且仅当一个点周围有严格小于他的点。
由于图一定是二分图(黑白染色),没有奇环,所有偶环一定可以拆成二元环,所以可以看做找匹配。两个点能匹配当且仅当他们 \(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的更多相关文章
- Android showing LoadingView or EmptyView for Activity or Fragment
这几天利用一些时间,整理了一下,写了一个简单的工具类,用来快速的显示LoadingView或者EmptyView,以前都是定义一个layout,根布局为FrameLayout,再在layout布局文件 ...
- 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 ...
- [Hive - Tutorial] Creating, Showing, Altering, and Dropping Tables
Creating, Showing, Altering, and Dropping Tables See Hive Data Definition Language for detailed info ...
- 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 ...
- 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 ...
- Showing progress bar in a status bar pane
在工具卡显示进度条,原文链接:http://www.codeproject.com/Articles/35/Showing-progress-bar-in-a-status-bar-pane 1.构造 ...
- 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 ...
- 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: ...
- 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 ...
- Eclipse启动报错[ out of memory error has occurred ]或[ An internal error occurred while showing an internal error ]
自我总结,有什么需要纠正或更好的方案,请告知,谢谢! 最近上来看到好多同学都遇到了这个问题,之前我也好几次碰到这个问题,很是恼火,什么没干,eclipse一开电脑就卡死了,后来发现不管是新打开ecli ...
随机推荐
- 手把手教你使用人工智能生成游戏 3D 素材
引言 生成式 AI 已成为游戏开发中艺术工作流的重要组成部分.然而,正如我在 之前的文章 中描述的,从文本到 3D 的实用性仍落后于 2D.不过,这种情况正在改变.本文我们将重新审视 3D 素材生成的 ...
- 每日一库:pprof简介
pprof简介 pprof是Go语言的一个性能分析库,它可以帮助开发者找出程序中的性能瓶颈.pprof提供了CPU分析.内存分析.阻塞分析等多种性能分析功能. 以下是pprof的主要特性: CPU分析 ...
- 用 Rust 的 declarative macro 做了个小东西
最近几天在弄 ddnspod 的时候,写了个宏: custom_meta_struct 解决什么问题 #[derive(Debug, Clone, serde::Serialize, serde::D ...
- 在Vue2和Vue3中JSX的使用集锦
Vue2安装JSX支持 有时候,我们使用渲染函数(render function)来抽象组件,而渲染函数使用Vue的h函数来编写Dom元素相对template语法差别较大,体验不佳,这个时候就派 JS ...
- Solution Set -「ABC 192」
「ABC 113A」Star Link. 略. #include<cstdio> int x; int main() { scanf("%d",&x); for ...
- 记一次 .NET 某餐饮小程序 内存暴涨分析
一:背景 1. 讲故事 前些天有位朋友找到我,说他的程序内存异常高,用 vs诊断工具 加载时间又太久,让我帮忙看一下到底咋回事,截图如下: 确实,如果dump文件超过 10G 之后,市面上那些可视化工 ...
- Spring-Boot-Starter 学习笔记(1)
Spring-Boot-Starter 1. 准备配置类和 Bean 对象 Spring Boot 提供了两个注解: @Configuration:Spring 提供的配置类注解,作用在类上,代表整个 ...
- MySQL系列之——MySQL体系结构、基础管理(用户、权限管理、连接管理、多种启动方式介绍、初始化配置、多实例的应用)
文章目录 一 体系结构 1.1 C/S(客户端/服务端)模型介绍 1.2 实例介绍 1.3 mysqld程序运行原理 1.3.1 mysqld程序结构 1.3.2 一条SQL语句的执行过程 1.3.2 ...
- android 中ids.xml资源的使用
ids.xml 前面我们见识过ids.xml文件,但是这个文件是什么意思呢?我们来看下文档中的介绍: 先看下它给的例子: XML file saved at res/values/ids.xml: 使 ...
- android studio error
Invalid method receiver.: Invalid method receiver.java.lang.IllegalStateException: Invalid method re ...