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

题目

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

思路

对于限制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.xdnf.cn/news/141891.html

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

相关文章

python九九乘法表

编写程序&#xff0c;输出九九乘法表。 源代码&#xff1a; for a in range(1, 10): for b in range(1, a1): print(f"{a}*{b}{a * b}", end" ") print() 列出测试数据和实验结果截图&#xff1a;

机器学习第十一课--K-Means聚类

一.聚类的概念 K-Means算法是最经典的聚类算法&#xff0c;几乎所有的聚类分析场景&#xff0c;你都可以使用K-Means&#xff0c;而且在营销场景上&#xff0c;它就是"King"&#xff0c;所以不管从事数据分析师甚至是AI工程师&#xff0c;不知道K-Means是”不可原谅…

Linux基本操作符(1)

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 目录 Linux的登录 Linux下基本指令 指令操作的理解 几个与用户操作符 ls 指令 pwd命令 cd 指令 touch指令 mkdir指令 rmdir指令 && rm 指令 什么叫操作系统&#xff0c;我相信如果是学计算机的都听说过&…

LeetCode每日一题:1993. 树上的操作(2023.9.23 C++)

目录 1993. 树上的操作 题目描述&#xff1a; 实现代码与解析&#xff1a; 模拟 dfs 原理思路&#xff1a; 1993. 树上的操作 题目描述&#xff1a; 给你一棵 n 个节点的树&#xff0c;编号从 0 到 n - 1 &#xff0c;以父节点数组 parent 的形式给出&#xff0c;其中 p…

Euro-NCAP-HWA测试流程中文版V1.1(2023发布)

定义 在本协议中,使用了以下术语: Vehicle undertest (VUT) – 指根据本规程测试的车辆,车上有碰撞前的碰撞缓解或避免系统 Global VehicleTarget (GVT) – 指本协议中使用的车辆目标,其定义见TB025—Euro-NCAP全球车辆目标规范v1.0 辅助其他车辆(SOV)--指最新的 AEB …

基于微信小程序的校园商铺系统,附源码、数据库

文章目录 第一章 简介第二章 技术栈第三章&#xff1a;总体设计第四章系统详细设计4.1 前台功能模块4.2后台功能模块4.2.1管理员功能模块 五 源码咨询 第一章 简介 今天&#xff0c;为大家带来的事基于微信小程序的校园商铺系统。本系统的主要意义在于&#xff0c;全力以赴为用…

JAVA学习-全网最详细

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

小程序中如何导出会员卡的档案信息

对于医院、美容院等特殊商家&#xff0c;可能需要在给会员添加一些档案。例如今天客户是什么情况&#xff0c;做了什么服务&#xff0c;解决了什么问题。添加这些档案后&#xff0c;系统会保存这些信息&#xff0c;供下次来的时候使用&#xff0c;或者为商家日后做营销提供依据…

社区团购美团和多多买菜小程序购物车

概述 微信小程序购物车列表demo 详细 需求 显示食物名称、价格、数量。 点击相应商品增加按钮,购买数量增加1,点击食物减少按钮,购买数量减一 显示购买总数和总金额 查看当前购买的商品 效果图(数据来自本地模拟) 目录结构 实现过程 主要wxml <view classfoods>…

实现爬虫加速的可实现办法

网络爬虫在数据采集和信息监测中发挥着重要作用。然而&#xff0c;由于网络环境复杂和大量数据需求&#xff0c;爬虫速度可能面临挑战。本文将为您分享一些实现爬虫加速的可行方法&#xff0c;帮助您让爬虫快如闪电&#xff01;让我们一起探索吧&#xff01; 一、多线程并发请…

第一百五十四回 如何实现滑动菜单

文章目录 概念介绍实现方法示例代码体验分享 我们在上一章回中介绍了滑动窗口相关的内容相关的内容&#xff0c;本章回中将介绍如何实现 滑动菜单.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在本章回中介绍的滑动菜单表示屏幕上向左或者向右滑动滑动时弹…

扩散模型:DDPM代码的学习(基于minist数据集)

文章目录 序言一参考资料①代码来源②相关概念理解③公式推导及训练流程讲解④搜索问题的网站⑤模型运行的环境 二代码解读①模型②训练③测试 三主要训练过程的解析 序言 本文主要对一个基于minist数据集搭建的DDPM模型代码中各个模块的含义进行解析&#xff0c;初步记录了自…

自拟实现消息队列(MQ)基于Rabbit MQ(含概念和源码)巨详细!!!!!含思维导图

MQ目录 MQ基本概念什么是MQ&#xff1f;MQ的应用场景 首先先明白需求持久化分析那么MQ如何设计持久化&#xff1f; 可靠性分析高效性分析MQ核心概念&#xff08;装配层&#xff09;实现MQ组件思维导图创建项目导入数据库下载SqLite。 创建组件实体类创建交换机&#xff08;要加…

php框架thinkPHP6的安装教程

1&#xff0c;composer官网下载最新版本 composerhttps://getcomposer.org/download/ 2&#xff0c;双击下载后的运行文件&#xff0c;一直点击next就行了 上面这个路径根据自己安装的php版本位置选择&#xff08;没有的可以下载一个phpstudy&#xff09;&#xff0c;最后需要…

SQL死锁进程内容查询语句

1.方式1 SELECT object_name(A.resource_associated_entity_id) as TABLENAME, A.request_session_id AS SPID,DB_NAME(B.dbid) AS DBName,B.blocked,B.dbid,B.program_name,B.waitresource,B.lastwaittype,B.loginame,B.hostname,B.login_time,B.last_batch--,B.* FROM sy…

Mybatis自动映射Java对象 与 MySQL8后的JSON数据

文章目录 Mybatis自动映射Java对象 与 MySQL8后的JSON数据1.转化成为正常Json类型1.1 JsonTypeHander1.2 ListJsonTypeHandler 负责List<T> 类型1.3 实体类1.4 mapper1.5 测试类 2. 存储为携带类型的Json Mybatis自动映射Java对象 与 MySQL8后的JSON数据 1.转化成为正常…

一、imx6ull 最新交叉编译工具下载地址,及安装方法

IMX6ULL为Cortex-A7单核处理器&#xff0c;架构为32位&#xff0c;支持硬件浮点功能。所以下载如下图所示交叉编译工具 linaro GNU-A 针对Cortex-A系列版本 ARM官方稳定版本&#xff0c; ARM官网下载地址:https://developer.arm.com/downloads/-/gnu-a 百度网盘地址&#xff…

vuejs - - - - - 使用code编辑器codemirror

使用code编辑器codemirror 0. 效果图1. 依赖安装2. 组件封装3. 组件使用 0. 效果图 列表实现参考: 列表实现代码 1. 依赖安装 npm install codemirror codemirror-editor-vue3 jsonlint-mod 2. 组件封装 code-mirror-editor.vue <template><VueCodeMirrorclas…

4 vCPU 实例达成 100 万 JSON API 请求/秒的优化实践

“性能工程” &#xff08;Performance engineering&#xff09;是个日渐流行的概念。顾名思义“性能工程”是包含在系统开发生命周期中所应用的一个技术分支&#xff0c;其目的就是确保满足非功能性的性能需求&#xff0c;例如&#xff1a;性能、可靠性等。由于现代软件系统变…

Java函数式接口(Consumer、Function、Predicate、Supplier)详解及代码示例

函数式接口 java.util.function : Consumer :消费型函数接口 void accept(T t) Function :函数型接口 R apply(T t) Predicate :判断型接口 boolean test(T t) Supplier :供给型接口 T get() Consumer - 消费型函数接口 该接口代表了一个接受一个参数并且不返回结果的操作。…