【2-SAT】【前缀和优化建图】【ICPC网络赛第二场】C. Covering

news2024/12/22 23:42:57

题目

在这里插入图片描述
在这里插入图片描述

思路

对于限制2,可以发现,如果 i i i 不选,那么 i − 1 i-1 i1 i + 1 i+1 i+1 就一定要选,2-SAT可以很好地解决

对于限制1,其实就是把 i i i 分成了若干个集合,每个集合只能选1个点。但如果用2-SAT做就会有 O ( n 2 ) O(n^2) O(n2) 条边,所以需要考虑前缀和优化建图。

首先看看暴力建的图长啥样:
在这里插入图片描述

现在我们额外开2*n个点,分别用于前缀和后缀
在这里插入图片描述

显然 9 → 15 9→15 915 等价于 9 → 10 → 15 9→10→15 91015,而类似的,我们会发现只要将第二层和第三层每一层的每个节点之间都互相连边就可以了,然后再稍稍优化下得到:
在这里插入图片描述

可以发现,我们这个图和原图是等价的。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e6+77;
int dfn[N],low[N],b[N],s[N],c[N],ls[N],cnt,id,top,tot,a[N],tt;
vector<int> p[N],ans;
map<int,int> mp;
struct E
{
	int to,next;
}e[N<<1];
void add(int u,int v)
{
	e[++cnt].to=v; e[cnt].next=ls[u]; ls[u]=cnt;
}
void tarjan(int u)
{
	dfn[u]=low[u]=++tot; b[u]=1;
	s[++top]=u; 
	for(int i=ls[u]; i; i=e[i].next)
	{
		int v=e[i].to;
		if(!dfn[v]) tarjan(v),low[u]=min(low[u],low[v]);
		else if(b[v]) low[u]=min(low[u],dfn[v]);
	}
	if(low[u]==dfn[u])
	{
		id++;
		while(s[top+1]!=u)
		{
			c[s[top]]=id;
			b[s[top]]=0; top--;
		}
	}
}
void solve()
{
	int n;
	cin>>n;
	for(int i=1; i<=n; i++)
	{
		cin>>a[i];
	}
	
	for(int i=1; i<n; i++)
	{
		int v=a[i]*n+a[i+1],t=0;
		if(!mp[v])
		{
			mp[v]=++tt;
			t=tt;
		}
		else t=mp[v];
		p[t].push_back(i);
	}
	
	for(int i=2; i<=n; i++)
	{
		add(i+n,i-1);
		if(i!=n) add(i+n,i+1);
	}
	
	for(int i=1; i<=n; i++)
	{
		add(i,i+2*n);
		add(i+3*n,i+n);
	}
	
	add(n+1,1); add(n,n+n);//1±ØÐëÑ¡ n²»ÄÜÑ¡
	
	for(int i=1; i<=tt; i++)
	{
		for(int j=0; j<p[i].size()-1; j++)
		{
			add(p[i][j]+2*n,p[i][j+1]+2*n);
			add(p[i][j+1]+3*n,p[i][j]+3*n);
		}
		for(int j=0; j<p[i].size(); j++)
		{
			if(j<p[i].size()-1)
			{
				add(p[i][j]+2*n,p[i][j+1]+n);
			}
			if(j)
			{
				add(p[i][j],p[i][j-1]+3*n);
			}
		}
	}
	
	for(int i=1; i<=4*n; i++) if(!dfn[i]) tarjan(i);
	
	for(int i=1; i<=n; i++)
	{
		if(c[i]==c[i+n])
		{
			cout<<"NO"; return;
		}
	}
	for(int i=1; i<=n; i++)
	{
		if(c[i]<c[i+n]) ans.push_back(i);
	}
	cout<<ans.size()<<"\n";
	for(int i=0; i<ans.size(); i++) cout<<ans[i]<<" ";
}
signed main()
{
	ios::sync_with_stdio(false); cin.tie(0),cout.tie(0);
	
	int T=1;
//	cin>>T;
	while(T--)
	{
		solve();
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1041420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2、SpringBoot_依赖介绍

三、SpringBoot介绍 1.parent 前言&#xff1a;之前是使用spring/springmvc 开发&#xff0c;整合不同的组件会有很多依赖&#xff0c;这些依赖会涉及到很多的版本信息&#xff0c;版本信息多了之后可能会导致版本冲突问题概述&#xff1a;把很多组件技术的搭配放到一起&…

ruoyi-vue项目的打包、与运行

ruoyi-vue项目的打包、与运行 打包打包后文件&#xff0c;及其运行 打包 打包后文件&#xff0c;及其运行 注意&#xff1a;要&#xff08;带配置&#xff09;打开redis redis-server.exe redis.windows.conf

细胞机器人系统的概念

摘要 本文讨论了一种新型机器人系统的理论和工程的概念基础。该系统由协作完成任务的自主机器人单元组成。本文在描述了该系统与细胞自动机和神经网络的相关性和差异后&#xff0c;建立了该系统的基础属性及其对机器人单元结构的影响、它们操作的空间以及它们完成全局任务的算法…

SPA项目的登录注册实现,post/get请求以及跨域问题

目录 前言 一. 登录&#xff0c;注册静态页面 1.1 ElementUI简介 1.2 基于SPA项目完成登录 1.2.1 在SPA项目中添加elementui依赖 1.2.2 在main.js中添加elementui模块 1.2.3 在src目录下创建views目录&#xff0c;用于存放vue组件 1.2.4 配置路由 1.2.5 修改项目端口并启…

企业如何实现设备管理数字化?企业有什么办法做到降本增效?

随着时代的发展&#xff0c;科学技术的进步以及自动化水平的不断提高&#xff0c;设备的维护保养成为日常工作中不可或缺的事项。但是&#xff0c;许多工作人员对于设备操作和保养规程的不熟悉&#xff0c;导致误操作、保养不到位或不能及时发现设备故障隐患等情况的大量出现。…

【vue】利用axios发送请求

这里写目录标题 一、项目环境配置二、利用axios发送POST请求登录三、异步实现&#xff1a;利用axios发送POST请求登录&#xff08;json&#xff09;四、异步实现&#xff1a;利用axios发送POST请求登录&#xff08;表单&#xff09;五、token存储六、token使用七、全局的axios配…

基于springboot地方废物回收机构管理系统springboot11

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

2023-9-25 排队打水

题目链接&#xff1a;排队打水 #include <iostream> #include <algorithm>using namespace std;typedef long long LL;const int N 100010;int n; int t[N];int main() {scanf("%d", &n);for(int i 0; i < n; i ) scanf("%d", &t…

服务接口调用OpenFeign_入门案列

构建cloud-consumer-feign-order80工程 修改POM文件 <!-- 引入OpenFeign依赖 --> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>编写YML文件…

Linux 处理文件( touch 命令、cp 命令、mv 命令、rm 命令)

Linux 处理文件 创建文件&#xff08; touch 命令&#xff09;&#xff0c;复制文件&#xff08; cp 命令&#xff09;&#xff0c;重命名文件&#xff08; mv 命令&#xff09;&#xff0c;删除文件&#xff08;rm 命令&#xff09; 文章目录 Linux 处理文件一、创建文件&…

【Linux】【网络】传输层协议:TCP

文章目录 TCP 协议1. TCP 协议段格式2. TCP 报头解析3. TCP 的可靠性4. 面向字节流5. 粘包问题6. 连接队列维护 TCP 的 确认应答机制TCP 的 超时重传机制TCP 的 三次握手TCP 的 四次挥手setsockopt 函数&#xff1a;设置套接字选项&#xff0c;解决 TIME_WAIT 状态引起的 bind …

力扣2861 补9.21

2861. 最大合金数 好蛮好蛮&#xff0c;我连题目都读不懂了&#xff0c;丝毫不明白咋做。 看了灵神题解&#xff0c;嗯&#xff0c;就好家伙&#xff0c;所有合金都需要由同一台机器制造。题目老是看漏&#xff0c;也就是只能选择其中一个机器造合金&#xff0c;这题能用二分也…

电脑WIFI突然消失

文章目录 1. 现象2. 解决办法1&#xff1a;重新启用无线网卡设置3. 解决办法2&#xff1a;更新无线网卡驱动4. 解决办法3&#xff1a;释放静电5. 解决办法4&#xff1a;拆机并重新插拔无线网卡 1. 现象 如下图&#xff1a;电脑在使用过程中WIFI消失 设备管理器中的无线网卡驱…

Redis安装部署与数据类型

目录 一、数据库类型 二、Redis简介 三、Redis 的优点 Redis 具有以下几个优点&#xff1a; Redis为什么这么快&#xff1f; 四、Redis安装部署 五、Redis 数据库常用命令 Redis 多数据库常用命令 六、Redis数据类型 String数据类型 List数据类型 Hash数据类型&…

【Python基础】常用模块学习:sys|os|pytest

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

数据库原理与分析实验三

目录 1、实验目的 2、实验预习与准备 3、实验内容及步骤 本博客为数据库课布置的实验二的作业。 1、实验目的 &#xff08;1&#xff09; 掌握Select子句的功能和检索数据的方法 &#xff08;2&#xff09; 掌握对查询结果排序的方法 2、实验预习与准备 &#xf…

Python爬虫技术系列-02HTML解析-xpath与lxml

Python爬虫技术系列-02HTML解析-xpath与lxml 2 XPath介绍与lxml库2.1 XPath概述2.2 lxml库介绍2.2.1 lxml库安装2.2.2 lxml库基本使用2.2.3 lxml案例a.读取数据并补全b.读取数据并选取节点&#xff1a; 2 XPath介绍与lxml库 参考连接&#xff1a; XPath教程 https://www.w3sch…

85、Redis连接相关的命令, key相关命令

本次讲解要点&#xff1a; Redis连接相关的命令&#xff0c; key相关命令&#xff0c; 启动redis服务器&#xff1a; 打开小黑窗&#xff1a; C:\Users\JH>e: E:>cd E:\install\Redis6.0\Redis-x64-6.0.14\bin E:\install\Redis6.0\Redis-x64-6.0.14\bin>redis-serve…

「UG/NX」Block UI 选择单元SelectElement

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#

SpringBoot 学习(三)Web 开发

3. SpringBoot Web 开发 3.1 导入静态资源 (1) webjars 导入 jquery 依赖 <dependency><groupId>org.webjars</groupId><artifactId>jquery</artifactId><version>3.6.0</version> </dependency>访问 jquery.js 文件 http:/…