[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 ...
随机推荐
- Codespaces个性化后台服务器配置指南
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 前文概览 在前文<浏览器上写代码,4核8G微软服 ...
- 2、Spring之IOC概述
2.1.IOC思想 2.1.1.传统方式获取资源 组件主动地从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式: 提高了学习成本,同时也降低了开发的效率. 2. ...
- c++中的宏#define用途
宏的一些作用,包括但不限于这些 定义一个变量.字符串.类型 定义一个函数.条件表达式 条件编译.调试信息,异常类 定义结构体.命名空间 定义模版.枚举.函数对象 #define宏定义在C++中用于定义 ...
- 开源XL-LightHouse与Flink、ClickHouse之类技术相比有什么优势
Flink是一款非常优秀的流式计算框架,而ClickHouse是一款非常优秀的OLAP类引擎,它们是各自所处领域的佼佼者,这一点是毋庸置疑的.Flink除了各种流式计算场景外也必然可以用于流式统计,C ...
- 手动实现Transformer
Transformer和BERT可谓是LLM的基础模型,彻底搞懂极其必要.Transformer最初设想是作为文本翻译模型使用的,而BERT模型构建使用了Transformer的部分组件,如果理解 ...
- pandas处理大数据题目的操作
1.用法:DataFrame.drop(labels=None, axis=0, index=None, columns=None, inplace=False) 2.参数说明: labels:要删除 ...
- Python并发编程——multiprocessing模块、Process类、Process类的使用、守护进程、进程同步(锁)、队列、管道、共享数据 、信号量、事件、 进程池
文章目录 一 multiprocessing模块介绍 二 Process类的介绍 三 Process类的使用 四 守护进程 五 进程同步(锁) 六 队列(推荐使用) 七 管道 八 共享数据 九 信号量 ...
- Keycloak 创建和修改自定义用户信息
前言 公司在用 Keycloak 作为认证服务器,之前在系统数据库里存的,后来想了想是不是可以在 Keycloak 中存.在网上找的方法大多都是通过 admin 接口去改,但这种方法就需要两种解决方案 ...
- torch.nn.ReLU(inplace=True)的具体含义:
首先根据源文档中的ReLU(x)=max(0,x),得出结论.大于0的数值不变,小于0的数据变成0. 补充:这里需要注意的是 ReLU并没有限制数据的大小. 这是对应的文档链接:https://pyt ...
- Caused by: liquibase.exception.ValidationFailedException: Validation Failed:1 change sets check sum
db/changelog/mysql/changelog-0001-307096-1.0.sql::1.0::buoluo.meng was: 8:a5d8f616a121230c204fd2b878 ...