#Tarjan,贪心#LOJ 3684 「COCI 2022.3」Usmjeravanje
分析
可以发现题目实际上求的是最小强连通分量个数。
并且每个强连通分量必然是由最多两段区间 \(a_l\sim a_r,b_L\sim b_R\) 组成的
只要存在一条路 \(b_R->a_l,a_r->b_L\) 那么这个区间就能连在一起。
将所有的边按 \(a\) 先升序,再 \(b\) 降序的顺序排序,然后按顺序枚举,观察到当前边也许会和后面的边有交。
如果当前边不是 \(b_i\) 连向 \(a_i\) 一定不优,反转之后把有交的边删掉,可以维护 \(b\) 的最大值,如果 \(b\) 不超过最大值就证明有交。
然后定向之后跑一遍Tarjan就可以了。
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
const int N=400011;
struct node{int y,next;}e[N<<1]; struct rec{int x,y,rk;}a[N];
int dfn[N],low[N],as[N],n,m,k,et,tot,v[N],st[N],Top,scc; bool ans[N];
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
int min(int a,int b){return a<b?a:b;}
bool cmp(rec x,rec y){return x.x<y.x||(x.x==y.x&&x.y>y.y);}
void add(int x,int y){e[++et]=(node){y,as[x]},as[x]=et;}
void tarjan(int x){
dfn[x]=low[x]=++tot,v[x]=1,st[++Top]=x;
for (int i=as[x];i;i=e[i].next)
if (!dfn[e[i].y]){
tarjan(e[i].y);
low[x]=min(low[x],low[e[i].y]);
}else if (v[e[i].y]) low[x]=min(low[x],dfn[e[i].y]);
if (dfn[x]==low[x]){
int y; ++scc;
do{
y=st[Top--],v[y]=0;
}while (y!=x);
}
}
int main(){
n=iut(),m=iut(),k=iut();
for (int i=1;i<n;++i) add(i,i+1);
for (int i=1;i<m;++i) add(i+n,i+1+n);
for (int i=1;i<=k;++i) a[i]=(rec){iut(),iut(),i};
sort(a+1,a+1+k,cmp);
for (int i=1,mx=0;i<=k;++i)
if (mx<a[i].y) add(a[i].y+n,a[i].x),mx=a[i].y,ans[a[i].rk]=1;
else add(a[i].x,a[i].y+n);
for (int i=1;i<=n+m;++i) if (!dfn[i]) tarjan(i);
printf("%d",scc);
for (int i=1;i<=k;++i) putchar(i==1?10:32),putchar(ans[i]+48);
return 0;
}
#Tarjan,贪心#LOJ 3684 「COCI 2022.3」Usmjeravanje的更多相关文章
- [LOJ#515]「LibreOJ β Round #2」贪心只能过样例
[LOJ#515]「LibreOJ β Round #2」贪心只能过样例 试题描述 一共有 \(n\) 个数,第 \(i\) 个数 \(x_i\) 可以取 \([a_i , b_i]\) 中任意值. ...
- Loj #2324. 「清华集训 2017」小 Y 和二叉树
Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...
- [LOJ#2328]「清华集训 2017」避难所
[LOJ#2328]「清华集训 2017」避难所 试题描述 "B君啊,你当年的伙伴都不在北京了,为什么你还在北京呢?" "大概是因为出了一些事故吧,否则这道题就不叫避难所 ...
- Loj #2331. 「清华集训 2017」某位歌姬的故事
Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...
- Loj #2321. 「清华集训 2017」无限之环
Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...
- Loj 2320.「清华集训 2017」生成树计数
Loj 2320.「清华集训 2017」生成树计数 题目描述 在一个 \(s\) 个点的图中,存在 \(s-n\) 条边,使图中形成了 \(n\) 个连通块,第 \(i\) 个连通块中有 \(a_i\ ...
- 【刷题】LOJ 6227 「网络流 24 题」最长k可重线段集问题
题目描述 给定平面 \(\text{xoy}\) 上 \(n\) 个开线段组成的集合 \(\text{I}\) ,和一个正整数 \(k\) ,试设计一个算法. 从开线段集合 \(\text{I}\) ...
- LOJ#2351. 「JOI 2018 Final」毒蛇越狱
LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...
- [LOJ#2330]「清华集训 2017」榕树之心
[LOJ#2330]「清华集训 2017」榕树之心 试题描述 深秋.冷风吹散了最后一丝夏日的暑气,也吹落了榕树脚下灌木丛的叶子.相识数年的Evan和Lyra再次回到了小时候见面的茂盛榕树之下.小溪依旧 ...
- [LOJ#2329]「清华集训 2017」我的生命已如风中残烛
[LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...
随机推荐
- Kafka本地单实例安装
下载安装 从国内镜像站点下载并安装Kafka安装包,以下载并安装v3.2.3版本为例. $ tar -xzf kafka_2.12-3.2.3.tgz $ cd kafka_2.12-3.2.3 启动 ...
- 项目实战:Qt管道焊接参数条码打印系统(条码打印机TSC 244 Pro、打印条码、打印中文、打印字符、多张连续打印)
需求 电脑端通过条码打印机TSC-TTP244 Pro: 1. 打印出尺寸为60*30cm 2. 条码打印机TSC-TTP244 Pro 不干胶纸 (不需要碳带,热敏纸) 3. window ...
- Apple设备屏幕尺寸和方向
表格中包括了各种型号的iPad.iPhone.以及iPod touch等设备的详细信息,涵盖了从iPad Pro到各代iPhone和iPod touch的多个型号. 这些信息可用于开发应用程序时优化界 ...
- 【开发工具】Linux 服务器 Shell 脚本简单应用(MySql备份等脚本)
上一章介绍完基础[开发工具]Linux 服务器 Shell 脚本简单入门,这一章结合实际运用 对于 do while if else等流程控制基础不再说明,和编程语言大同小异,可以在实际的脚本使用中学 ...
- 【LeetCode二叉树#15】二叉搜索树的最小绝对差(巩固迭代中序遍历#2)
二叉搜索树的最小绝对差(迭代法中序遍历巩固) 力扣题目链接(opens new window) 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值. 示例: 提示:树中至 ...
- Java --- 多线程 创建线程的方式四: 使用线程池
1 package bytezero.thread2; 2 3 import java.security.Provider; 4 import java.util.concurrent.Executo ...
- (转载)Transfer-Encoding:chunked详解
原文链接:Transfer-Encoding:chunked详解_transfer-encoding: chunked_公众号:流花鬼的博客-CSDN博客 概念 分块传输编码(Chunked tran ...
- MySQL基础篇快速记忆和查询
查询 语法: SELECT 标识选择哪些列 FROM 标识从哪个表中选择 去重(Distinct) 在SELECT语句中使用关键字DISTINCT去除重复行 SELECT DISTINCT depar ...
- Zabbix“专家坐诊”第182期问答汇总
问题一: Q:像烽火.浪潮这种没有ilo的设备怎么监控他们的硬件状态呢? A:如果没有ilo,可以使用其他硬件监控软件,例如HP Insight Manager.IBM Director.Dell O ...
- php time 时间 前台拿到 需要*1000能正确显示 dayjs(time*1000).format('YYYY-MM-DD HH:mm:ss')
php time 时间 前台拿到 需要1000能正确显示 dayjs(time1000).format('YYYY-MM-DD HH:mm:ss')