首页 > 其他分享 >[CF1416F] Showing Off

[CF1416F] Showing Off

时间:2023-12-11 20:44:45浏览次数:29  
标签:匹配 int Showing CF1416F 当且 基环树 && 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("");
		}
	}
}

标签:匹配,int,Showing,CF1416F,当且,基环树,&&,Off
From: https://www.cnblogs.com/mekoszc/p/17895504.html

相关文章

  • 最新版Office2024安装教程
    一.介绍:Office版本都是每三年发布一个版本,从Office2007、2010、2013、2016、2019,2021到现在的2024。二.下载:资源下载三.安装教程:1.用到的软件是开源的脚本,有两个:YAOCTRU和YAOCTRI,其中YAOCTRU用来下载Office,YAOCTRI用来安装Office。解压YAOCTRU后,运行YAOCTRU_Generator.cm......
  • 万字长文专访“AI之父”Geoffrey Hinton: 我使用ChatGPT之后,为什么也开始害怕现在AI技
     “蜻蜓的幼虫就像水下的怪兽,”Hinton说。“它就像电影《异形》中的场景,蜻蜓从这个怪兽的背部破壳而出。幼虫经历了一个变成汤的阶段,然后蜻蜓就从这种汤中诞生。”在他的比喻中,幼虫象征着用于训练现代神经网络的数据;而蜻蜓则代表了由此诞生的敏捷的人工智能。深度学习——Hinto......
  • MySQL 数据库操作指南:LIMIT,OFFSET 和 JOIN 的使用
    限制结果您可以通过使用"LIMIT"语句来限制查询返回的记录数量。以下是一个示例,获取您自己的Python服务器中"customers"表中的前5条记录:importmysql.connectormydb=mysql.connector.connect(host="localhost",user="yourusername",password="yourpassword",......
  • MySQL 数据库操作指南:LIMIT,OFFSET 和 JOIN 的使用
    限制结果您可以通过使用"LIMIT"语句来限制查询返回的记录数量。以下是一个示例,获取您自己的Python服务器中"customers"表中的前5条记录:importmysql.connectormydb=mysql.connector.connect(host="localhost",user="yourusername",password="yourpassword",......
  • 2023 (ICPC) Jiangxi Provincial Contest -- Official Contest
    Preface伟大的徐神终于来和我们一起训练了,然后这场中期一眼秒了可做题中最难的G虽然中间因为我搞错了徐神的意图给徐神原来正确的主席树删了搞了个错的上去浪费了快一个小时但无所谓最后结束前把所有可做题全写了强势捧杯(打弱省省赛打出自信了属于是)A.DrillWoodtoMakeFi......
  • pageoffice 6 实现数据区域填充(插入文本、图片、word、excel等)
    在实际的Word文档开发中,经常需要自动填充数据到Word模板中,以生成动态的Word文档。例如:1、我们可以根据数据库表中已保存的个人信息,设计好一个简历模板docx文件,然后通过代码将这些个人信息填充到Word模板中,从而自动生成一份简历。2、如果需要将图片插入到Word模板指定位置,比如......
  • 界面控件DevExpress中文教程 - 如何用Office File API组件填充PDF表单
    DevExpressOfficeFileAPI是一个专为C#,VB.NET和ASP.NET等开发人员提供的非可视化.NET库。有了这个库,不用安装MicrosoftOffice,就可以完全自动处理Excel、Word等文档。开发人员使用一个非常易于操作的API就可以生成XLS,XLSx,DOC,DOCx,RTF,CSV和SnapReport等企业级文......
  • PageOfficeV6.0给文档中的Table插入新行并赋值
    转载:文档中的Table插入新行并赋值文档中的Table插入新行并赋值查看本示例演示效果本示例关键代码的编写位置Vue+Springboot注意本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径,用户名等做适当修改即可使用。在项目的开发中会遇到这样的需求:要......
  • 网页在线安全浏览Office Word文档,只读打开/禁止编辑/禁止复制/禁止另存/禁止打印/禁止
    在企业OA系统或者在线协作办公场景中,有一些合同公文或者客户数据等重要文档需要我们在线共享给其他人,但是我们只希望其他人只能预览阅读文档,不能随便编辑修改文档,也禁止复制共享Word文档的内容到其他文档或者编辑器,不能将共享文件另存为本地文件夹,并且禁止用户打印该Word文档,那么......
  • Golang标准库:非类型安全操作(Arbitrary 类型 Pointer 类型 Sizeof 函数 Offsetof 函数)
    unsafe库徘徊在“类型安全”边缘,由于它们绕过了Golang的内存安全原则,一般被认为使用该库是不安全的。但是,在许多情况下,unsafe库的作用又是不可替代的,灵活地使用它们可以实现对内存的直接读写操作。在reflect库、syscall库以及其他许多需要操作内存的开源项目中都有对它的引用。un......