欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。
2sat 学习资料
https://blog.csdn.net/ljw_study_in_CSDN/article/details/108896054?spm=1001.2014.3001.5506
求解最强联通分量
https://www.sohu.com/a/245954819_100201031
https://www.luogu.com.cn/blog/dzz-best-programmer/tarjan
https://codeforces.com/contest/875/problem/C
一个数字x的大写形式用 x’表示。
比如2的大写用2‘。大写的字典序要比小写的小。
给定n个由m个数字组成的数组,改变其中几个数字的大小写,使得n个数字串从前到后按照字典序非下降排列。
一个数字要么大写,要么小写,直接想到思路就是用2sat表示。
为每个数字建立改变大小写标记。
n
o
d
e
[
i
∗
2
]
,
n
o
d
e
[
i
∗
2
+
1
]
分
别
代
表
数
字
i
要
小
写
和
大
写
。
node[i*2], node[i*2+1] 分别代表数字i要小写和大写。
node[i∗2],node[i∗2+1]分别代表数字i要小写和大写。
分析一下2sat建立边的过程。
对于2个数组来说,大小关系是由第1位不相同的数字决定的。
假设2个数组A, B(位置关系,A在B前面)第1位不同的下标为j。
有以下4种情况。
1, 2是分析A[j]==B[j]的情况
- A.size == j 说明A, B前j位都相同,且A已经比较完了,那显然B>=A的,所以无论中间数字大小怎么改变都不影响B>=A, 不需要建立边。
- B.size ==j, 由于上面已经包含了B.size>=A.size的情况,这里只要分析A.size>B.size, 如果这个条件成立那么A>B, 此时无论数字怎么变A>B,无解。
- A[j]
- A[j]>B[j], 说明A>B, A[j]必须大写,B[j]必须小写。
#include#include #include #include #include #include #include
本人码农,希望通过自己的分享,让大家更容易学懂计算机知识。



