AT1899 画像処理高橋君 题解
题目链接:AT1899 画像処理高橋君
+AT1899 画像処理高橋君 题解
+题目链接:AT1899 +画像処理高橋君
原题是日文的,我就不翻译了(
--题意:给出压缩后的图像,求压缩前的图像
+
压缩是指对于各个像素,在其周围8个方向的像素中,只要有一个黑色像素,其像素就会变黑的处理题意:给出压缩后的图像,求压缩前的图像 +压缩是指对于各个像素,在其周围8个方向的像素中,只要有一个黑色像素,其像素就会变黑的处理
从题意中第二句话可以初步推断出,只要是周围8个方向上都是黑色的像素就是压缩前存在的黑色像素
例如
从题意中第二句话可以初步推断出,只要是周围8个方向上都是黑色的像素就是压缩前存在的黑色像素
+例如
###..
###..
.....
-压缩前的图像就是
##...
+压缩前的图像就是
##...
.....
-.....
_这么说来只要扫一遍,把和白色像素相接的黑色像素全部变为白色不就好了?_
-但是如果是下面这种情况
###.
+.....
+这么说来只要扫一遍,把和白色像素相接的黑色像素全部变为白色不就好了?
+但是如果是下面这种情况
###.
##.#
..##
-..##
用刚才的思路做,会得到这样的图像
#...
+..##
用刚才的思路做,会得到这样的图像
+#...
....
....
-...#
这样就出现了问题
-如果把得到的这个图像压缩,得到的应该是
#... ##..
+...#
这样就出现了问题
+如果把得到的这个图像压缩,得到的应该是
#... ##..
.... -> ##..
.... ..##
-...# ..##
这样就还得再检查一遍得到的图像是否合法
-代码如下
#include<bits/stdc++.h>
+...# ..##
+这样就还得再检查一遍得到的图像是否合法
+代码如下
#include<bits/stdc++.h>
using namespace std;
int n,m;
char a[205][205];//记录压缩后的图像(即输入的图像)
@@ -905,7 +912,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/02/11/cf652b-z-sort-ti-jie/index.html b/2021/02/11/cf652b-z-sort-ti-jie/index.html
index 5274c4c771..37a8d6ffb7 100644
--- a/2021/02/11/cf652b-z-sort-ti-jie/index.html
+++ b/2021/02/11/cf652b-z-sort-ti-jie/index.html
@@ -472,7 +472,9 @@ CF652B z-sort 题解
- CF652B z-sort 题解
题目链接:CF652B z-sort
+ CF652B z-sort 题解
+题目链接:CF652B
+z-sort
题意:一种叫Z排序的方法,奇数位递增,偶数位递减,给定数组请用此方法排序
@@ -864,7 +866,7 @@
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/02/11/cf676a-nicholas-and-permutation-ti-jie/index.html b/2021/02/11/cf676a-nicholas-and-permutation-ti-jie/index.html
index 165bd215ff..ce6afce8e0 100644
--- a/2021/02/11/cf676a-nicholas-and-permutation-ti-jie/index.html
+++ b/2021/02/11/cf676a-nicholas-and-permutation-ti-jie/index.html
@@ -468,17 +468,29 @@ CF676A Nicholas and Permutation
- CF676A Nicholas and Permutation 题解
题目链接:CF676A Nicholas and Permutation
+ CF676A Nicholas and
+Permutation 题解
+题目链接:CF676A
+Nicholas and Permutation
题意:给定数组,可以让两个数的位置交换,让最大值和最小值的位置的差的绝对值最大
-先用$c$记录最大值位置,$d$记录最小值位置
-然后取$4$种情况中绝对值最大的
-第$1$种,$d$与第$1$个元素交换
-第$2$种,$d$与第$n$个元素交换
-第$3$种,$c$与第$1$个元素交换
-第$4$种,$c$与第$n$个元素交换
-代码实现还是比较简单的
#include<bits/stdc++.h>
+先用\(c\)记录最大值位置,\(d\)记录最小值位置
+然后取\(4\)种情况中绝对值最大的
+第\(1\)种,\(d\)与第\(1\)个元素交换
+第\(2\)种,\(d\)与第\(n\)个元素交换
+第\(3\)种,\(c\)与第\(1\)个元素交换
+第\(4\)种,\(c\)与第\(n\)个元素交换
+代码实现还是比较简单的
#include<bits/stdc++.h>
using namespace std;
#define R register
int n,k,a=-1,b=INT_MAX,c,d;//最大值初始化为-1,最小值初始化为很大的数(2147483647)
@@ -859,7 +871,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/02/11/cf708a-letters-cyclic-shift-ti-jie/index.html b/2021/02/11/cf708a-letters-cyclic-shift-ti-jie/index.html
index b586d32c48..65c6ca3dbf 100644
--- a/2021/02/11/cf708a-letters-cyclic-shift-ti-jie/index.html
+++ b/2021/02/11/cf708a-letters-cyclic-shift-ti-jie/index.html
@@ -472,7 +472,10 @@ CF708A Letters Cyclic Shift 题
- CF708A Letters Cyclic Shift 题解
题目链接:CF708A Letters Cyclic Shift
+ CF708A Letters Cyclic Shift
+题解
+题目链接:CF708A
+Letters Cyclic Shift
题意:一次变换指将字母变为它前面一个字母,例如a
变成z
,b
变成a
,给定字符串,找出一个非空子串进行变换使得改变后字典序尽可能小
@@ -481,7 +484,8 @@ 子串,因此只能改变到下一个不为a
的位置
+
再看题目,要求改变的是非空子串,因此只能改变到下一个不为a
的位置
因此aabcdefabb
改变后变为aaabcdeabb
还有一种情况要特判 例如aaaaa
题目要求你必须选择一个非空子串,这种情况只要把最后一个字符改变就行了
@@ -865,7 +869,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/02/17/ubuntu20.04-zhuo-mian-tu-biao-xian-shi-yi-chang-ji-jie-jue-fang-fa/index.html b/2021/02/17/ubuntu20.04-zhuo-mian-tu-biao-xian-shi-yi-chang-ji-jie-jue-fang-fa/index.html
index fb5958a860..0455c622cf 100644
--- a/2021/02/17/ubuntu20.04-zhuo-mian-tu-biao-xian-shi-yi-chang-ji-jie-jue-fang-fa/index.html
+++ b/2021/02/17/ubuntu20.04-zhuo-mian-tu-biao-xian-shi-yi-chang-ji-jie-jue-fang-fa/index.html
@@ -468,31 +468,39 @@ ubuntu20.04 桌面图标显示
- ubuntu20.04 桌面图标显示异常及解决方法
前言
更新至ubuntu20.04后,出现了一些以前没有的问题
+ ubuntu20.04
+桌面图标显示异常及解决方法
+前言
+更新至ubuntu20.04后,出现了一些以前没有的问题
桌面上有些图标不显示
-
-一、具体表现
例如有一次我在做备忘录时
+一、具体表现
+例如有一次我在做备忘录时
我习惯地打开终端
cd 桌面
gedit 账号.txt
桌面效果
-
然后我写了一些东西,保存后,桌面变成了这样 (注:并非每次都会出现这种问题)
-
打开文件夹,显示我桌面上的文件都存在,但是桌面上不显示,双击文件原来的位置也没有用
+
+然后我写了一些东西,保存后,桌面变成了这样
+(注:并非每次都会出现这种问题)
+
+打开文件夹,显示我桌面上的文件都存在,但是桌面上不显示,双击文件原来的位置也没有用
-
-
-二、原因
这种情况是$\text{gnome\ shell}$出现了异常
+二、原因
+这种情况是\(\text{gnome\ shell}\)出现了异常
众所周知重启电脑能解决大部分问题,但是总不能动不动就重启吧?
-
-
-三、解决方法
按下alt+F2
,会跳出一个窗口,然后输入一个r
(重启gnome shell)
+三、解决方法
+按下alt+F2
,会跳出一个窗口,然后输入一个r
(重启gnome
+shell)
然后再看一眼桌面,就恢复了
-
-
-总结
碰到gnome shell问题,重启它一般能解决
+总结
+碰到gnome shell问题,重启它一般能解决
@@ -850,7 +858,7 @@ 总结
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/02/23/zheng-shu-de-hua-fen-dong-tai-gui-hua/index.html b/2021/02/23/zheng-shu-de-hua-fen-dong-tai-gui-hua/index.html
index b3ccf7aadd..4e1ba04d5b 100644
--- a/2021/02/23/zheng-shu-de-hua-fen-dong-tai-gui-hua/index.html
+++ b/2021/02/23/zheng-shu-de-hua-fen-dong-tai-gui-hua/index.html
@@ -468,28 +468,31 @@ 整数的划分 动态规划
- 整数的划分 动态规划
题目描述
+ 整数的划分 动态规划
+题目描述
每个非负整数都可以被拆分,比如说
2 = 2
2 = 1+1
3 = 3
3 = 2+1
3 = 1+1+1
-输入格式
一个非负整数$n(0 \leq n \leq 100)$
-输出格式
输出可以被拆分的方案数
-输入样例
4
-输出样例
5
-样例解释
4 = 4
+输入格式 一个非负整数\(n(0
+\leq n \leq 100)\)
+输出格式 输出可以被拆分的方案数
+输入样例
4
+输出样例
5
+样例解释
4 = 4
4 = 3+1
4 = 2+2
4 = 2+1+1
4 = 1+1+1+1
共5种
-本题是我在学 $dp$ 时候做的一道题
-看到题目首先来一发暴力搜索
+本题是我在学 \(dp\)
+时候做的一道题
+看到题目首先来一发暴力搜索
-
-40分解法
#include<bits/stdc++.h>
+40分解法
+#include<bits/stdc++.h>
using namespace std;
#define int long long
#define R register
@@ -524,27 +527,85 @@ printf("%lld\n",ans+1);//不拆也是一种
return 0;
}
-如果认为暴力能过,那请看以下数据
输入: 100
+如果认为暴力能过,那请看以下数据
输入: 100
输出: 190569292
-综上所述,这道题正解是$dp$
+综上所述,这道题正解是\(dp\)
-
-100分 解法一
设 $dp[i][j]$ 表示 $i$ 拆分成 $j$ 个数的方案数
-我们可以把 $j$ 看作 $j$ 个桶,$i$ 就是 $i$ 个$1$
-1.$dp[i-1][j-1]$
一个桶里已经放了一个 $1$ 了,还有 $i-1$ 个 $1$ 要划分到 $j-1$ 个桶考虑$i-1$的$j-1$划分($1$本身作为一个划分)保证划分中包含$1$
-
-- $dp[i-j][j]$
先在每一个桶里都放个 $1$,还有 $i-j$ 个 $1$ 要划分到这 $j$ 个桶里($i-j$不作为单独作为划分,因此还是划分为$j$组),考虑 $i-j$ 的 $j$ 划分,在合法的情况下保证划分中不包含$1$
$[$ 对于 $i$ 的 $j$ 划分$a_k$( $\sum\limits_{k=1}^{j}{a_k}=i,a_k\in \mathbb{Z}_+$ ),都有 $a_k>0$ ,因此 $a_k-1$ 对应了 $i-j$ 的 $j$ 划分 $]$
+100分 解法一
+设 \(dp[i][j]\) 表示 \(i\) 拆分成 \(j\) 个数的方案数
+我们可以把 \(j\) 看作 \(j\) 个桶,\(i\) 就是 \(i\) 个\(1\)
+1.\(dp[i-1][j-1]\)
+一个桶里已经放了一个 \(1\) 了,还有
+\(i-1\) 个 \(1\) 要划分到 \(j-1\) 个桶考虑\(i-1\)的\(j-1\)划分(\(1\)本身作为一个划分)保证划分中包含\(1\)
+
+- \(dp[i-j][j]\) 先在每一个桶里都放个
+\(1\),还有 \(i-j\) 个 \(1\) 要划分到这 \(j\) 个桶里(\(i-j\)不作为单独作为划分,因此还是划分为\(j\)组),考虑 \(i-j\) 的 \(j\)
+划分,在合法的情况下保证划分中不包含\(1\) \([\)
+对于 \(i\) 的 \(j\) 划分\(a_k\)( \(\sum\limits_{k=1}^{j}{a_k}=i,a_k\in
+\mathbb{Z}_+\) ),都有 \(a_k>0\) ,因此 \(a_k-1\) 对应了 \(i-j\) 的 \(j\) 划分 \(]\)
所以状态转移方程就是
-$dp[i][j]=dp[i-j][j]+dp[i-1][j-1]$
- 注:对于当前状态的划分中包含 $1$ ($dp[i-1][j-1]$),不保证状态转移后仍有 $1$
-例如 $dp[7][3]$ 的一种划分方式 $1+2+4$
-$dp[7][3]$ $\xrightarrow{}$ $1+dp[6][2]$ $\xrightarrow{}$ $1+\frac{dp[4][2]}{+1}$ $\xrightarrow{}$ $1+\frac{1+dp[3][1]}{+1}$ $\xrightarrow{}$ $1+\frac{1}{+1}+\frac{3}{+1}$ $\xrightarrow{}$ $1+2+4$
+\(dp[i][j]=dp[i-j][j]+dp[i-1][j-1]\)
+注:对于当前状态的划分中包含 \(1\) (\(dp[i-1][j-1]\)),不保证状态转移后仍有
+\(1\)
+例如 \(dp[7][3]\) 的一种划分方式
+\(1+2+4\)
+\(dp[7][3]\) \(\xrightarrow{}\) \(1+dp[6][2]\) \(\xrightarrow{}\) \(1+\frac{dp[4][2]}{+1}\) \(\xrightarrow{}\) \(1+\frac{1+dp[3][1]}{+1}\) \(\xrightarrow{}\) \(1+\frac{1}{+1}+\frac{3}{+1}\) \(\xrightarrow{}\) \(1+2+4\)
边界:
-1.$0$ 的总方案数为 $1$
2.$j=1$ ,方案数就是 $1$
3.$i<j$ 时无法划分成 $j$ 个数,方案数为 $0$
4.$i=j$ 时方案数为 $1$
-最后答案就是 $\sum\limits_{i=1}^{n}{dp[n][i]}$
-时间复杂度 $O(n^2)$
-空间复杂度 $O(n^2)$
+1.\(0\) 的总方案数为 \(1\) 2.\(j=1\) ,方案数就是 \(1\) 3.\(i<j\) 时无法划分成 \(j\) 个数,方案数为 \(0\) 4.\(i=j\) 时方案数为 \(1\)
+最后答案就是 \(\sum\limits_{i=1}^{n}{dp[n][i]}\)
+时间复杂度 \(O(n^2)\)
+空间复杂度 \(O(n^2)\)
#include<bits/stdc++.h>
using namespace std;
#define int long long
@@ -565,12 +626,17 @@ return 0;
}
-
-100分 解法二
设 $dp[j]$ 为 $j$ 的所有划分方案数
-对于 $\forall j \in \mathbb{Z}_+$,$dp[j]=\sum\limits_{i=1}^{j}{dp[j-i]}$
-边界: $0$ 的方案数为 $1$
-时间复杂度 $O(n^2)$
-空间复杂度 $O(n)$
#include<bits/stdc++.h>
+100分 解法二
+设 \(dp[j]\) 为 \(j\) 的所有划分方案数
+对于 \(\forall j \in
+\mathbb{Z}_+\),\(dp[j]=\sum\limits_{i=1}^{j}{dp[j-i]}\)
+边界: \(0\)
+的方案数为 \(1\)
+时间复杂度 \(O(n^2)\)
+空间复杂度 \(O(n)\)
+
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define R register
@@ -937,7 +1003,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/03/02/ubuntu-nei-cun-zhan-yong-guo-gao-dao-zhi-qia-si-jie-jue-ban-fa/index.html b/2021/03/02/ubuntu-nei-cun-zhan-yong-guo-gao-dao-zhi-qia-si-jie-jue-ban-fa/index.html
index 0cb84c90cd..9c44eb57e2 100644
--- a/2021/03/02/ubuntu-nei-cun-zhan-yong-guo-gao-dao-zhi-qia-si-jie-jue-ban-fa/index.html
+++ b/2021/03/02/ubuntu-nei-cun-zhan-yong-guo-gao-dao-zhi-qia-si-jie-jue-ban-fa/index.html
@@ -468,41 +468,64 @@ ubuntu 内存占用过高导致
- ubuntu 内存占用过高导致卡死 解决办法
一、具体表现
例如下图
-
+ ubuntu
+内存占用过高导致卡死 解决办法
+一、具体表现
+例如下图
+
注:图示版本为ubuntu18.04,现在我用的是ubuntu20.04
-
-二、原因
查阅到了一些资料
+二、原因
+查阅到了一些资料
+
+在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然。这是Linux内存管理的一个优秀特性,在这方
+面,区别于 Windows的内存管理。主要特点是,无论物理内存有多大,Linux
+都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能。
+
+
+Linux 的这一特性,主要是利用空闲的物理内存,划分出一部份空间,做为
+cache 和 buffers ,以此提高数据访问性能。
+
-在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然。这是Linux内存管理的一个优秀特性,在这方 面,区别于 Windows的内存管理。主要特点是,无论物理内存有多大,Linux 都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能。
-Linux 的这一特性,主要是利用空闲的物理内存,划分出一部份空间,做为 cache 和 buffers ,以此提高数据访问性能。
-Linux 优先使用物理内存,当物理内存还有空闲时,linux是不会施放内存的,即时占用内存的程序已经被关闭了(这部分内存就用来做缓存了)。也就是说,即使你有很多内存,用过一段时间后,也会被占满。这样做的好处是,启动那些刚开启过的程序、或是读取刚存取过得数据会比较快,对于服务器很有好处。
+Linux
+优先使用物理内存,当物理内存还有空闲时,linux是不会施放内存的,即时占用内存的程序已经被关闭了(这部分内存就用来做缓存了)。也就是说,即使你有很多内存,用过一段时间后,也会被占满。这样做的好处是,启动那些刚开启过的程序、或是读取刚存取过得数据会比较快,对于服务器很有好处。
总结一下,我的这种情况就是swap空间开的太小了
-
-三、解决方案
把swap空间调大(建议在物理内存的两倍以上)
+三、解决方案
+把swap空间调大(建议在物理内存的两倍以上)
首先用gparted改一下磁盘分区,然后再配置(这两步缺一不可)
-可以参考一下这篇博客,写的很好(感谢)
+可以参考一下这篇博客,写的很好(感谢)
顺便提醒一下,每个人电脑都存在差异,我在参考那篇博客时就出现了一些不同之处
-因为我写本文的时候买的16GB内存条还没到,所以提前调成60GB的swap空间了 (好像大了点)
+因为我写本文的时候买的16GB内存条还没到,所以提前调成60GB的swap空间了
+(好像大了点)
经过实验证明,目前该方法完全解决了之前的问题(再次道歉 qwq)
如果要释放swap空间的话,可以用以下指令
sudo su
swapoff -a
swapon swapfile 注:也有用 swapon -a的,不过我这不行
-放几张图吧…(开了一堆窗口,然后不会卡死了)
-
+放几张图吧...(开了一堆窗口,然后不会卡死了)
+
全部关掉以后,一切正常!!成功!!
-
-四、其他优化
有时候缓存会过高,可以写个脚本及时释放缓存
-
+四、其他优化
+有时候缓存会过高,可以写个脚本及时释放缓存
+
-
-
-总结
调大swap空间
+总结
+调大swap空间
@@ -856,7 +879,7 @@ 总结
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/03/11/linux-ji-windows-dui-pai-cheng-xu-c/index.html b/2021/03/11/linux-ji-windows-dui-pai-cheng-xu-c/index.html
index 164b3295c3..231857b017 100644
--- a/2021/03/11/linux-ji-windows-dui-pai-cheng-xu-c/index.html
+++ b/2021/03/11/linux-ji-windows-dui-pai-cheng-xu-c/index.html
@@ -468,18 +468,20 @@ linux及windows对拍程序 C++<
- linux及windows对拍程序 C++
前言
OI赛制的比赛中,选手不能看到自己的成绩,那么如何保证代码正确呢?
-1.水品高 秒切
2.暴力+对拍 尝试调正解
+ linux及windows对拍程序 C++
+前言
+OI赛制的比赛中,选手不能看到自己的成绩,那么如何保证代码正确呢?
+1.水品高 秒切 2.暴力+对拍 尝试调正解
本文给出了linux和windows的对拍程序
-
-一、什么是对拍?
在比赛中,某道题已经写出了暴力解法(须保证正确),开始尝试写正解
+一、什么是对拍?
+在比赛中,某道题已经写出了暴力解法(须保证正确),开始尝试写正解
我们就可以用到对拍程序,用于对比暴力解法和尝试解法的输出结果,以判断该解法的是否是正解
注:暴力解法通常跑不了很大的点,因此对拍时数据不强,即使正确也未必是正解
那么对拍程序怎么写呢?
-
-二、怎么写对拍程序?
对拍程序的写法有很多种,但结构基本一致
+二、怎么写对拍程序?
+对拍程序的写法有很多种,但结构基本一致
while(1)//不一定要用死循环
{
生成随机数据
@@ -488,7 +490,7 @@ }
接下来,我将以A+B Problem为例
-首先,写暴力程序std.cpp
#include<bits/stdc++.h>
+首先,写暴力程序std.cpp
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define R register
@@ -504,7 +506,8 @@ while(b){a++,b--;}
printf("%lld\n",a);
return 0;
-}
接下来,尝试写正解my.cpp
#include<bits/stdc++.h>
+}
+接下来,尝试写正解my.cpp
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define R register
@@ -540,11 +543,13 @@ }
最后,记得要把这些文件都编译哦!
注:需要有可执行文件才能对拍,因此需要编译
-1.linux下的对拍程序
linux下的比对命令是diff
./std
的意思可以简单地认为是运行当前目录下std.cpp
编译后生成的可执行文件std
+1.linux下的对拍程序
+linux下的比对命令是diff
+./std
的意思可以简单地认为是运行当前目录下std.cpp
编译后生成的可执行文件std
本人使用的是vscode,编译后生成的可执行文件就是文件名
-注:如果您没有用类似的软件,您可以手动编译
cd code 注:该文件所在目录,我的叫code
-g++ std.cpp -o std
-C++对拍程序
#include<bits/stdc++.h>
+注:如果您没有用类似的软件,您可以手动编译
cd code 注:该文件所在目录,我的叫code
+g++ std.cpp -o std
####
+C++对拍程序 #include<bits/stdc++.h>
using namespace std;
#define int long long
#define R register
@@ -564,8 +569,7 @@ }
}
return 0;
-}
-Bash脚本
#!/bin/bash
+}
#### Bash脚本 #!/bin/bash
i=0
while true
do
@@ -579,11 +583,13 @@
break
fi
done
-注:可以用以下指令编辑.sh
文件
cd code 注:该文件所在目录
+注:可以用以下指令编辑.sh
文件 cd code 注:该文件所在目录
gedit checker.sh 注:新建文件
sh checker.sh 注:运行
-2.windows下的对拍程序
本人使用的Dev C++
-C++对拍程序
#include<bits/stdc++.h>
+2.windows下的对拍程序
+本人使用的Dev C++
+C++对拍程序
+#include<bits/stdc++.h>
using namespace std;
#define int long long
#define R register
@@ -604,7 +610,8 @@ }
return 0;
}
-bat脚本
@echo off
+bat脚本
+@echo off
::指不显示命令
set /a i=0
:loop
@@ -622,8 +629,8 @@
-
-总结
本文介绍了linux和windows下对拍程序的写法(共4种)
+总结
+本文介绍了linux和windows下对拍程序的写法(共4种)
对拍程序的思想简单,实现多样
在竞赛中能有所帮助
@@ -979,7 +986,7 @@ 总结
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/03/20/ubuntu-xian-shi-jian-pan-an-jian/index.html b/2021/03/20/ubuntu-xian-shi-jian-pan-an-jian/index.html
index 95c282408e..ed870350d6 100644
--- a/2021/03/20/ubuntu-xian-shi-jian-pan-an-jian/index.html
+++ b/2021/03/20/ubuntu-xian-shi-jian-pan-an-jian/index.html
@@ -468,29 +468,32 @@ ubuntu 显示键盘按键
- ubuntu 显示键盘按键
前言
在看一些主播玩游戏时,他们屏幕上会有一个虚拟键盘,可以显示按键
+ ubuntu 显示键盘按键
+前言
+在看一些主播玩游戏时,他们屏幕上会有一个虚拟键盘,可以显示按键
当时觉得很神奇,就想着给ubuntu也弄一个
庆幸的是,ubuntu的确有这种软件
-
-一、KeyMon简介
这个软件叫key-mon,全称Keyboard Status Monitor,即键盘状态监视器
-
注:截图时我按住了shfit键
+一、KeyMon简介
+这个软件叫key-mon,全称Keyboard Status
+Monitor,即键盘状态监视器
+ 注:截图时我按住了shfit键
不过相对于别的软件,这个就显得有些简单
-但不可否认的确有效果
+但不可否认的确有效果
-
-二、安装步骤
打开终端
+二、安装步骤
+打开终端
sudo apt install key-mon
安装即可
适用于ubuntu18.04,目前ubuntu20.04也可以用
-
-
-三、自定义设置
希望更好的体验?
+三、自定义设置
+希望更好的体验?
右键选择Settings...
设置就可以了
-
-总结
本文介绍了KeyMon的安装方法
+总结
+本文介绍了KeyMon的安装方法
显示键盘按键就这么简单
@@ -845,7 +848,7 @@ 总结
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/03/27/ubuntu-zhui-zhu-shu-biao-zhi-zhen-de-xiao-mao-oneko/index.html b/2021/03/27/ubuntu-zhui-zhu-shu-biao-zhi-zhen-de-xiao-mao-oneko/index.html
index 70c4fcfc12..cbf1600a27 100644
--- a/2021/03/27/ubuntu-zhui-zhu-shu-biao-zhi-zhen-de-xiao-mao-oneko/index.html
+++ b/2021/03/27/ubuntu-zhui-zhu-shu-biao-zhi-zhen-de-xiao-mao-oneko/index.html
@@ -468,20 +468,28 @@ ubuntu 追逐鼠标指针的小
- ubuntu 追逐鼠标指针的小猫~Oneko
前言
最近发现了一个有趣的软件 Oneko
+ ubuntu
+追逐鼠标指针的小猫~Oneko
+前言
+最近发现了一个有趣的软件 Oneko
可以让一只小猫追着鼠标指针跑
是不是很有趣?
-一、下载Oneko
打开终端
sudo apt install oneko
安装即可
+一、下载Oneko
+打开终端
sudo apt install oneko
安装即可
然后它就会在应用程序中了
-
-二、使用Oneko
只要输入这个指令就行
oneko
然后就会有以下效果
-
+二、使用Oneko
+只要输入这个指令就行
oneko
然后就会有以下效果
+
或者也可以添加到收藏夹后直接单击
不过关闭需要右键,选择Oneko STOP
-
-三、自定义Oneko
官方给的参数如下
+三、自定义Oneko
+官方给的参数如下
Usage: oneko [<options>]
Options are:
@@ -506,7 +514,8 @@
-1.常用指令
其他指令使用较少,您可以自行研究
+1.常用指令
+其他指令使用较少,您可以自行研究
-fg <color>
设置前景色
-bg <color>
设置背景色
-speed <dots>
设置跑步速度
@@ -516,17 +525,29 @@ 2.实际效果
例如:
+2.实际效果
+例如:
oneko -fg red
oneko -bg green
oneko -tora
oneko -dog
oneko -sakura
oneko -tomoyo
-效果如下
+效果如下
-
-总结
本文仅介绍了常用功能
+总结
+本文仅介绍了常用功能
Oneko真的很好玩呢!
安装和使用也挺简单的
@@ -882,7 +903,7 @@ 总结
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/05/07/ubuntu-vmware-bao-cuo-could-not-open...jie-jue-fang-fa/index.html b/2021/05/07/ubuntu-vmware-bao-cuo-could-not-open...jie-jue-fang-fa/index.html
index 20c851578f..c9989746c5 100644
--- a/2021/05/07/ubuntu-vmware-bao-cuo-could-not-open...jie-jue-fang-fa/index.html
+++ b/2021/05/07/ubuntu-vmware-bao-cuo-could-not-open...jie-jue-fang-fa/index.html
@@ -468,31 +468,44 @@ ubuntu VMware报错could not ope
- ubuntu VMware报错could not open…解决方法
前言
本人在使用VMware时报了这个错
+ ubuntu
+VMware报错could not open...解决方法
+前言
+本人在使用VMware时报了这个错
could not open /dev/vmmon:??????
经过多方查阅资料,为大家提供一个有效的解决办法
-
-一、具体表现
安装好VMware,虚拟机也创建完了
+一、具体表现
+安装好VMware,虚拟机也创建完了
一运行结果就报错了
-
一开始以为权限问题,用root打开也一样(显然没用)
+
+一开始以为权限问题,用root打开也一样(显然没用)
-
-二、解决方法
需要关闭安全启动 ($\mathrm{\color{black}{secure \ boot}}$)
-安全启动设计之初作用是防止恶意软件侵入
+二、解决方法
+需要关闭安全启动 (\(\mathrm{\color{black}{secure \
+boot}}\))
+安全启动设计之初作用是防止恶意软件侵入
事实上它能够做到的仅仅是当电脑引导器被病毒修改之后,它会给出提醒并拒绝启动
因此基本上没什么用
什么?在哪里关闭?? 当然是BIOS里
-进入BIOS (开机后出现电脑品牌的图标时狂按F12
)
-下面看我拍的照片就懂了吧…
-注:我的电脑是DELL的,其他品牌的我不知道
-
+进入BIOS
+(开机后出现电脑品牌的图标时狂按F12
)
+下面看我拍的照片就懂了吧...
+注:我的电脑是DELL的,其他品牌的我不知道
+
图片可能有点糊,还请谅解
改完记得保存哦!
然后打开ubuntu,虚拟机就可以正常运行了
-
-总结
本文介绍了因安全启动导致的报错的解决方法
+总结
+本文介绍了因安全启动导致的报错的解决方法
@@ -846,7 +859,7 @@ 总结
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/05/15/ubuntu-ibus-shu-ru-fa-tu-ran-wu-fa-shu-ru-yan-chi-guo-gao-jie-jue-fang-fa/index.html b/2021/05/15/ubuntu-ibus-shu-ru-fa-tu-ran-wu-fa-shu-ru-yan-chi-guo-gao-jie-jue-fang-fa/index.html
index d03f6eda14..80a589a361 100644
--- a/2021/05/15/ubuntu-ibus-shu-ru-fa-tu-ran-wu-fa-shu-ru-yan-chi-guo-gao-jie-jue-fang-fa/index.html
+++ b/2021/05/15/ubuntu-ibus-shu-ru-fa-tu-ran-wu-fa-shu-ru-yan-chi-guo-gao-jie-jue-fang-fa/index.html
@@ -468,35 +468,41 @@ ubuntu ibus输入法 突然无
- ubuntu ibus输入法 突然无法输入 (延迟过高) 解决方法
前言
ibus拼音输入法最近不知道为何出现了一些异常问题(经常卡死)
+ ubuntu
+ibus输入法 突然无法输入 (延迟过高) 解决方法
+前言
+ibus拼音输入法最近不知道为何出现了一些异常问题(经常卡死)
被困扰了很久后,终于找到了解决办法
upd.20220423
在中文维基上查到了这样的资料
由于读取sqlite词库时有大量的IO操作,ibus-pinyin在系统高负载时输入时有卡住的现象。
-upd.20220423
+upd.20220423
fcitx差点把你们可爱的q779给整没了,现在他继续用ibus了(重装了一遍)
-
-一、具体表现
写代码时,突然键盘像失灵了一样打不出字,过了好一会才慢慢显示出来
+一、具体表现
+写代码时,突然键盘像失灵了一样打不出字,过了好一会才慢慢显示出来
可以说延迟太高了
在此期间终端却可以打开,鼠标也可以正常移动
关闭窗口什么的都没问题,就是打不出字
-
-
-二、解决方法
如果您的ubuntu中除了ibus拼音输入还有英文输入,那这个方法必定有效
-
首先切换到en,即英语输入(右上角wifi图标旁边)
+二、解决方法
+如果您的ubuntu中除了ibus拼音输入还有英文输入,那这个方法必定有效
+
+首先切换到en,即英语输入(右上角wifi图标旁边)
然后ctrl+alt+t
打开终端
-输入
ibus restart
重启ibus拼音输入法
+输入
ibus restart
重启ibus拼音输入法
切换回ibus输入法,然后你原先输入的就出现了!
而且可以正常使用了!
-注意:如果重启时显示无法连接至ibus,可以看这里
+注意:如果重启时显示无法连接至ibus,可以看这里
-
-总结
本文介绍了ibus输入法突然无法输入(卡死)的解决方法
-众所周知,重启能解决大部分问题
+总结
+本文介绍了ibus输入法突然无法输入(卡死)的解决方法
+众所周知,重启能解决大部分问题
@@ -850,7 +856,7 @@ 总结
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/07/08/qian-tan-bu-ma-de-yuan-li-he-zheng-que-xing/index.html b/2021/07/08/qian-tan-bu-ma-de-yuan-li-he-zheng-que-xing/index.html
index d57226d3e1..28db00b2c5 100644
--- a/2021/07/08/qian-tan-bu-ma-de-yuan-li-he-zheng-que-xing/index.html
+++ b/2021/07/08/qian-tan-bu-ma-de-yuan-li-he-zheng-que-xing/index.html
@@ -468,167 +468,324 @@ 浅谈补码的原理和正确
- 浅谈补码的原理和正确性
前言
upd 2022.2.14 我就该早点看《计算机组成原理》,补码的定义就是
+ 浅谈补码的原理和正确性
+前言
+upd 2022.2.14
+我就该早点看《计算机组成原理》,补码的定义就是
-一个 $n$ 位二进制数 $N$ 的二进制补码定义为 $2^n-N$
+一个 \(n\) 位二进制数 \(N\) 的二进制补码定义为 \(2^n-N\)
不过本文还是严谨证明了它的正确性,以下为原文
补码是怎么来的?
-负数的补码为什么是按位取反(除了符号位)再加 $1$ ?
+负数的补码为什么是按位取反(除了符号位)再加 \(1\) ?
补码的正确性能保证吗?
补码背后的数学原理是什么?
本文围绕原理和正确性介绍了补码
-
-一、我们为什么用补码?
我们以 $8$ 位二进制数为例
-$8$ 位无符号数,可以表示 $0\sim255$ 以内的数(即 $00000000 \sim 11111111$ ),那么如果我们要表示负数呢?
-我们都知道正、负号能够表示正、负数,可是计算机“看不懂“,它只能识别 $0,1$
-于是,就出现了原码
-最高位表示数的正负,$0$ 表示 正 ,$1$ 表示负
-$8$ 位有符号数,以原码形式存储则可以表示 $0 \sim 127$(即 $00000000 \sim 01111111$ ) 和 $-127 \sim 0$ (即 $11111111 \sim 10000000$ )
-相信看到这里,你应该发现了:以原码形式存储时,$0$ 的值不唯一
-我们把 $\pm 0$ 的问题放一边,先来讨论一下编码的正确性
-计算 $1+(-1)$
-$00000001 + 10000001 = 10000010$
-然而 $10000010$ 转成十进制是 $-2$ !
+一、我们为什么用补码?
+我们以 \(8\) 位二进制数为例
+\(8\)
+位无符号数,可以表示 \(0\sim255\) 以内的数(即 \(00000000 \sim 11111111\)
+),那么如果我们要表示负数呢?
+我们都知道正、负号能够表示正、负数,可是计算机“看不懂“,它只能识别
+\(0,1\)
+于是,就出现了原码
+最高位表示数的正负,\(0\) 表示
+正 ,\(1\)
+表示负
+\(8\)
+位有符号数,以原码形式存储则可以表示 \(0 \sim 127\)(即 \(00000000 \sim 01111111\) ) 和 \(-127 \sim 0\) (即 \(11111111 \sim 10000000\) )
+相信看到这里,你应该发现了:以原码形式存储时,\(0\) 的值不唯一
+我们把 \(\pm 0\)
+的问题放一边,先来讨论一下编码的正确性
+计算 \(1+(-1)\)
+\(00000001 + 10000001 =
+10000010\)
+然而 \(10000010\) 转成十进制是 \(-2\) !
由此可知原码不可以直接进行运算,或者可以认为以原码的编码方式运算是错误的
那么问题来了,正数的表示都符合我们的习惯,那么问题一定出在负数上
-
-二、补码是怎么来的?
各大教科书上都会告诉你,正数的补码就是它的原码,负数的补码就是原码按位取反(除了符号位)再加 $1$
+二、补码是怎么来的?
+各大教科书上都会告诉你,正数的补码就是它的原码,负数的补码就是原码按位取反(除了符号位)再加
+\(1\)
你是不是也很迷惑?补码到底为什么是这么算出来的?
-我们还是以 $8$ 位有符号数为例
-我们知道,两个数如果互为相反数则和为$0$ ,例如 $1+(-1)=0$
-那么正确的编码方式中 $1+(-1)$ 一定等于 $0$
-我们设 $-1$ 的编码为 $\phi$ ,可得 $00000001 + \phi = 0$
-$\therefore \phi = 11111111$(注:计算过程将在下文中讲述,这里只需要知道结果)
-那么就很清楚了,如果我们已知编码 $\phi$ ,它的相反数的编码就是 $0 - \phi$
-现在我们来讨论一下 $\pm 0$ 的问题,显而易见,$10000000$ 肯定是不符合常理的( $00000000 + 10000000 \ne 00000000$ )
-那么 $10000000$ 对应的相反数的编码是什么呢?
-设 $10000000 + \phi = 0$ 解得 $\phi = 100000000$ (注意位数!)
-我们会发现 $00000000 \sim 11111111$ 已经无法表示了
-那 $0$ 呢?$0$ 的相反数还是 $0$ ,就是它本身
-事已至此,干脆就让它们单身着吧。 既然 $10000000$ 的第一位是 $1$ ,表示负数,那就规定它为负数,因此 $10000000$ 就代替了 $-128$
-因为 $10000000$ 没有对应的相反数的编码,所以没有 $+128$
-然后每个数都有了自己对应的编码,$1 \sim 127$ 对应 $-1 \sim -127$ ,加上两个单身汉 $0$ 和 $-128$
+我们还是以 \(8\)
+位有符号数为例
+我们知道,两个数如果互为相反数则和为\(0\) ,例如 \(1+(-1)=0\)
+那么正确的编码方式中 \(1+(-1)\)
+一定等于 \(0\)
+我们设 \(-1\) 的编码为 \(\phi\) ,可得 \(00000001 + \phi = 0\)
+\(\therefore \phi =
+11111111\)(注:计算过程将在下文中讲述,这里只需要知道结果)
+那么就很清楚了,如果我们已知编码 \(\phi\) ,它的相反数的编码就是 \(0 - \phi\)
+现在我们来讨论一下 \(\pm 0\)
+的问题,显而易见,\(10000000\)
+肯定是不符合常理的( \(00000000 + 10000000 \ne
+00000000\) )
+那么 \(10000000\)
+对应的相反数的编码是什么呢?
+设 \(10000000 + \phi = 0\) 解得
+\(\phi = 100000000\) (注意位数!)
+我们会发现 \(00000000 \sim
+11111111\) 已经无法表示了
+那 \(0\) 呢?\(0\) 的相反数还是 \(0\) ,就是它本身
+事已至此,干脆就让它们单身着吧。 既然 \(10000000\) 的第一位是 \(1\) ,表示负数,那就规定它为负数,因此
+\(10000000\) 就代替了 \(-128\)
+因为 \(10000000\)
+没有对应的相反数的编码,所以没有 \(+128\)
+然后每个数都有了自己对应的编码,\(1 \sim
+127\) 对应 \(-1 \sim -127\)
+,加上两个单身汉 \(0\) 和 \(-128\)
这种编码就叫补码
-那么为什么负数的补码是原码按位取反再加 $1$ 呢?
-我们再看 $1+(-1)=0$ 的例子
-设 $00000001 + \phi = 00000000$
-$\therefore \phi = 00000000-00000001$
+那么为什么负数的补码是原码按位取反再加 \(1\) 呢?
+我们再看 \(1+(-1)=0\) 的例子
+设 \(00000001 + \phi =
+00000000\)
+\(\therefore \phi =
+00000000-00000001\)
一个小的数减一个大的数,怎么办?
首先我们应该都知道溢出这一概念
-那么 $00000000$ 就可以看作 $11111111 + 00000001$
-$\therefore\ \phi = (11111111 + 00000001) - 00000001$
-$\qquad= (11111111-00000001) + 00000001$
+那么 \(00000000\) 就可以看作 \(11111111 + 00000001\)
+\(\therefore\ \phi = (11111111 + 00000001)
+- 00000001\)
+\(\qquad= (11111111-00000001) +
+00000001\)
注:这个就是简单的结合律
我们看前面一部分,不就是按位取反嘛(反码)!
-相信你现在应该理解了,如果我们要求正数 $\lambda$ 的相反数 $\mu$ 的补码
-$\mu = (11111111-\lambda) + 00000001$ ,
-即 $\lambda$)按位取反(包括符号位)再加 $1$ ,当然也是 $\mu$ 按位取反(除了符号位)再加 $1$ ,一样的
+相信你现在应该理解了,如果我们要求正数 \(\lambda\) 的相反数 \(\mu\) 的补码
+\(\mu = (11111111-\lambda) +
+00000001\) ,
+即 \(\lambda\))按位取反(包括符号位)再加 \(1\) ,当然也是 \(\mu\) 按位取反(除了符号位)再加 \(1\) ,一样的
-
-三、补码的正确性能保证吗?
1.符号位能保证本身的值、运算结果的值正确吗?
本身的值肯定正确,运算结果的值也正确
+三、补码的正确性能保证吗?
+1.符号位能保证本身的值、运算结果的值正确吗?
+本身的值肯定正确,运算结果的值也正确
运算都是从最低位运算到最高位,这个符号位又加在最高位,不可能影响运算,只可能被影响(注:接下来我们就来证明这个影响不会对运算结果的符号正确性产生影响)
-2.数学运算结果的符号能保证正确吗?
为了方便理解和证明,我们以 $4$ 位有符号数为例(即 $-8 \sim 7$ )
+2.数学运算结果的符号能保证正确吗?
+为了方便理解和证明,我们以 \(4\)
+位有符号数为例(即 \(-8 \sim
+7\) )
注意:正确性指在数学运算结果不溢出的情况下位运算的结果和数学运算的结果正确
-首先,易知任何合法的数与 $0$ 作运算结果一定正确
-1) 值的位运算结果不溢出时
1.正数+正数
数学运算结果:一定为正数,符号为正
-位运算结果:值的位运算不溢出,符号位 $0+0=0$,仍为正
-设这里两个数补码分别为$[0a_2a_1a_0], [0b_2b_1b_0]$
-令 $A = \sum\limits_{i=0}^{2}{a_i\times 2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}$,易知 $A,B \in \N$
-原式可化为 $A+B$
-且 $0 < A+B \le 7$
-值的位运算结果不溢出即 $-8 \le A+B \le 7$
-$\{x|0 < x \le 7\}\subsetneqq\{x|-8 \le x \le 7\}$
-故该情况$\color{red}{正确}$
-2.负数+负数
数学运算结果:一定为负数,符号为负
-位运算结果:值的位运算不溢出,符号位 $1+1=0$ ,变成了正
-设这里两个数补码分别为$[1a_2a_1a_0], [1b_2b_1b_0]$
-令 $A = \sum\limits_{i=0}^{2}{a_i\times 2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}$,易知 $A,B \in \N$
-原式可化为 $-8+A+(-8)+B = -16+A+B$
-且 $-8 \le A+B-16 < 0 \Rightarrow 8 \le A+B < 16$
-值的位运算结果不溢出即 $-8 \le A+B \le 7$
-$\{x|-8 \le x \le 7\}\cap\{x|8 \le x < 16\} = \varnothing$
-故该情况$\color{red}{不存在}$
-3.一正一负
a.正数绝对值大于负数绝对值
数学运算结果:一定为正数,符号为正
-位运算结果:值的位运算结果不溢出,符号位 $0+1=1$ ,变成了负
-设这里两个数补码分别为$[0a_2a_1a_0], [1b_2b_1b_0]$
-令 $A = \sum\limits_{i=0}^{2}{a_i\times 2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}$,易知 $A,B \in \N$
-原式可化为$A+(-8)+B = A+B-8$
-且 $0 < A+B-8 \le 7 \Rightarrow 8 < A+B \le 15$
-值的位运算的结果不溢出即 $-8 \le A+B \le 7$
-$\{x|-8 \le x \le 7\}\cap\{x|8 < x \le 15\} = \varnothing$
-故该情况$\color{red}{不存在}$
-b.正数绝对值等于负数绝对值
数学运算结果:$0$ ,符号为正
-位运算结果:值的位运算结果不溢出,符号位 $0+1=1$ ,变成了负
-设这里两个数补码分别为$[0a_2a_1a_0], [1b_2b_1b_0]$
-令 $A = \sum\limits_{i=0}^{2}{a_i\times 2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}$,易知 $A,B \in \N$
-原式可化为$A+(-8)+B = A+B-8 = 0 \Rightarrow A+B=8$
-值的位运算的结果不溢出即 $-8 \le A+B \le 7$
-$\{x|-8 \le x \le 7\}\cap\{x|x=8\} = \varnothing$
-故该情况$\color{red}{不存在}$
-c.正数绝对值小于负数绝对值
数学运算结果:一定为负数,符号为负
-位运算结果:值的位运算结果不溢出,符号为 $0 + 1 = 1$ ,仍为负
-设这里两个数补码分别为$[0a_2a_1a_0], [1b_2b_1b_0]$
-令 $A = \sum\limits_{i=0}^{2}{a_i\times 2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}$,易知 $A,B \in \N$
-原式可化为 $A+(-8)+B = A+B-8$
-且 $-8 \le A+B-8 < 0 \Rightarrow 0 \le A+B < 8$
-值的位运算结果不溢出即 $-8 \le A+B \le 7$
-$\{x|0 \le x < 8\}\subsetneqq\{x|-8 \le x \le 7\}$
-故该情况$\color{red}{正确}$
-2) 值的位运算结果溢出时
1.正数+正数
数学运算结果:一定为正数,符号为正
-位运算结果:值的位运算结果溢出,符号位 $0+0+1=1$ ,变成了负
-设这里两个数补码分别为$[0a_2a_1a_0], [0b_2b_1b_0]$
-令 $A = \sum\limits_{i=0}^{2}{a_i\times 2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}$,易知 $A,B \in \N$
-原式可化为 $A+B$
-且 $0 < A+B \le 7$
-值的位运算结果溢出即 $A+B>7$
-$\{x|0 < x \le 7\}\cap\{x|x>7\} = \varnothing$
-故该情况$\color{red}{不存在}$
-2.负数+负数
数学运算结果:一定为负数,符号为负
-位运算结果:值的位运算结果溢出,符号位 $1+1+1=1$ ,仍为负
-设这里两个数补码分别为$[1a_2a_1a_0], [1b_2b_1b_0]$
-令 $A = \sum\limits_{i=0}^{2}{a_i\times 2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}$,易知 $A,B \in \N$
-原式可化为 $-8+A+(-8)+B = A+B-16$
-且 $-8 \le A+B -16< 0 \Rightarrow 8 \le A+B < 16$
-值的位运算结果溢出即 $A+B>7$
-$\{x|8\le x < 16\}\subsetneqq\{x|x>7\}$
-故该情况$\color{red}{正确}$
-3.一正一负
a.正数绝对值大于负数绝对值
数学运算结果:一定为正数,符号为正
-位运算结果:值的位运算结果溢出,符号位 $0+1+1=0$ ,仍为正
-设这里两个数补码分别为$[0a_2a_1a_0], [1b_2b_1b_0]$
-令 $A = \sum\limits_{i=0}^{2}{a_i\times 2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}$,易知 $A,B \in \N$
-原式可化为 $A+(-8)+B = A+B-8$
-且 $0<A+B-8\le 7 \Rightarrow 8<A+B\le15$
-值的位运算结果溢出即 $A+B>7$
-$\{x|8< x \le 15\}\subsetneqq\{x|x>7\}$
-故该情况$\color{red}{正确}$
-b.正数绝对值等于负数绝对值
数学运算结果:$0$ ,符号为正
-位运算结果:值的位运算结果溢出,符号位 $0+1+1=0$ ,仍为正
-设这里两个数补码分别为$[0a_2a_1a_0], [1b_2b_1b_0]$
-令 $A = \sum\limits_{i=0}^{2}{a_i\times 2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}$,易知 $A,B \in \N$
-原式可化为 $A+(-8)+B = A+B-8 = 0 \Rightarrow A+B=8$
-值的位运算结果溢出即$A+B>7$
-$\{x|x=8\}\subsetneqq\{x|x>7\}$
-故该情况$\color{red}{正确}$
-c.正数绝对值小于负数绝对值
数学运算结果:一定为负数 ,符号为负
-位运算结果:值的位运算结果溢出,符号位 $0+1+1=0$ ,变成了正
-设这里两个数补码分别为$[0a_2a_1a_0], [1b_2b_1b_0]$
-令 $A = \sum\limits_{i=0}^{2}{a_i\times 2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}$,易知 $A,B \in \N$
-原式可化为 $A+(-8)+B = A+B-8$
-且 $-8\le A+B - 8<0 \Rightarrow 0 \le A+B <8$
-值的位运算结果溢出即 $A+B>7$
-$\{x|0 < x < 8\}\cap\{x|x>7\} = \varnothing$
-故该情况$\color{red}{不存在}$
-综上所述,所有存在的情况中,符号都是正确的,因此补码的正确性是可以保证的
+首先,易知任何合法的数与 \(0\) 作运算结果一定正确
+1) 值的位运算结果不溢出时
+1.正数+正数
+数学运算结果:一定为正数,符号为正
+位运算结果:值的位运算不溢出,符号位 \(0+0=0\),仍为正
+设这里两个数补码分别为\([0a_2a_1a_0],
+[0b_2b_1b_0]\)
+令 \(A = \sum\limits_{i=0}^{2}{a_i\times
+2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}\),易知 \(A,B \in \N\)
+原式可化为 \(A+B\)
+且 \(0 < A+B \le 7\)
+值的位运算结果不溢出即 \(-8 \le A+B \le
+7\)
+\(\{x|0 < x \le 7\}\subsetneqq\{x|-8 \le
+x \le 7\}\)
+故该情况\(\color{red}{正确}\)
+2.负数+负数
+数学运算结果:一定为负数,符号为负
+位运算结果:值的位运算不溢出,符号位 \(1+1=0\) ,变成了正
+设这里两个数补码分别为\([1a_2a_1a_0],
+[1b_2b_1b_0]\)
+令 \(A = \sum\limits_{i=0}^{2}{a_i\times
+2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}\),易知 \(A,B \in \N\)
+原式可化为 \(-8+A+(-8)+B =
+-16+A+B\)
+且 \(-8 \le A+B-16 < 0 \Rightarrow 8 \le
+A+B < 16\)
+值的位运算结果不溢出即 \(-8 \le A+B \le
+7\)
+\(\{x|-8 \le x \le 7\}\cap\{x|8 \le x <
+16\} = \varnothing\)
+故该情况\(\color{red}{不存在}\)
+3.一正一负
+a.正数绝对值大于负数绝对值
+数学运算结果:一定为正数,符号为正
+位运算结果:值的位运算结果不溢出,符号位 \(0+1=1\) ,变成了负
+设这里两个数补码分别为\([0a_2a_1a_0],
+[1b_2b_1b_0]\)
+令 \(A = \sum\limits_{i=0}^{2}{a_i\times
+2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}\),易知 \(A,B \in \N\)
+原式可化为\(A+(-8)+B = A+B-8\)
+且 \(0 < A+B-8 \le 7 \Rightarrow 8 <
+A+B \le 15\)
+值的位运算的结果不溢出即 \(-8 \le A+B \le
+7\)
+\(\{x|-8 \le x \le 7\}\cap\{x|8 < x \le
+15\} = \varnothing\)
+故该情况\(\color{red}{不存在}\)
+b.正数绝对值等于负数绝对值
+数学运算结果:\(0\)
+,符号为正
+位运算结果:值的位运算结果不溢出,符号位 \(0+1=1\) ,变成了负
+设这里两个数补码分别为\([0a_2a_1a_0],
+[1b_2b_1b_0]\)
+令 \(A = \sum\limits_{i=0}^{2}{a_i\times
+2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}\),易知 \(A,B \in \N\)
+原式可化为\(A+(-8)+B = A+B-8 = 0
+\Rightarrow A+B=8\)
+值的位运算的结果不溢出即 \(-8 \le A+B \le
+7\)
+\(\{x|-8 \le x \le 7\}\cap\{x|x=8\} =
+\varnothing\)
+故该情况\(\color{red}{不存在}\)
+c.正数绝对值小于负数绝对值
+数学运算结果:一定为负数,符号为负
+位运算结果:值的位运算结果不溢出,符号为 \(0 + 1 = 1\) ,仍为负
+设这里两个数补码分别为\([0a_2a_1a_0],
+[1b_2b_1b_0]\)
+令 \(A = \sum\limits_{i=0}^{2}{a_i\times
+2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}\),易知 \(A,B \in \N\)
+原式可化为 \(A+(-8)+B = A+B-8\)
+且 \(-8 \le A+B-8 < 0 \Rightarrow 0 \le
+A+B < 8\)
+值的位运算结果不溢出即 \(-8 \le A+B \le
+7\)
+\(\{x|0 \le x < 8\}\subsetneqq\{x|-8 \le
+x \le 7\}\)
+故该情况\(\color{red}{正确}\)
+2) 值的位运算结果溢出时
+1.正数+正数
+数学运算结果:一定为正数,符号为正
+位运算结果:值的位运算结果溢出,符号位 \(0+0+1=1\) ,变成了负
+设这里两个数补码分别为\([0a_2a_1a_0],
+[0b_2b_1b_0]\)
+令 \(A = \sum\limits_{i=0}^{2}{a_i\times
+2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}\),易知 \(A,B \in \N\)
+原式可化为 \(A+B\)
+且 \(0 < A+B \le 7\)
+值的位运算结果溢出即 \(A+B>7\)
+\(\{x|0 < x \le 7\}\cap\{x|x>7\} =
+\varnothing\)
+故该情况\(\color{red}{不存在}\)
+2.负数+负数
+数学运算结果:一定为负数,符号为负
+位运算结果:值的位运算结果溢出,符号位 \(1+1+1=1\) ,仍为负
+设这里两个数补码分别为\([1a_2a_1a_0],
+[1b_2b_1b_0]\)
+令 \(A = \sum\limits_{i=0}^{2}{a_i\times
+2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}\),易知 \(A,B \in \N\)
+原式可化为 \(-8+A+(-8)+B =
+A+B-16\)
+且 \(-8 \le A+B -16< 0 \Rightarrow 8 \le
+A+B < 16\)
+值的位运算结果溢出即 \(A+B>7\)
+\(\{x|8\le x <
+16\}\subsetneqq\{x|x>7\}\)
+故该情况\(\color{red}{正确}\)
+3.一正一负
+a.正数绝对值大于负数绝对值
+数学运算结果:一定为正数,符号为正
+位运算结果:值的位运算结果溢出,符号位 \(0+1+1=0\) ,仍为正
+设这里两个数补码分别为\([0a_2a_1a_0],
+[1b_2b_1b_0]\)
+令 \(A = \sum\limits_{i=0}^{2}{a_i\times
+2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}\),易知 \(A,B \in \N\)
+原式可化为 \(A+(-8)+B = A+B-8\)
+且 \(0<A+B-8\le 7 \Rightarrow
+8<A+B\le15\)
+值的位运算结果溢出即 \(A+B>7\)
+\(\{x|8< x \le
+15\}\subsetneqq\{x|x>7\}\)
+故该情况\(\color{red}{正确}\)
+b.正数绝对值等于负数绝对值
+数学运算结果:\(0\)
+,符号为正
+位运算结果:值的位运算结果溢出,符号位 \(0+1+1=0\) ,仍为正
+设这里两个数补码分别为\([0a_2a_1a_0],
+[1b_2b_1b_0]\)
+令 \(A = \sum\limits_{i=0}^{2}{a_i\times
+2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}\),易知 \(A,B \in \N\)
+原式可化为 \(A+(-8)+B = A+B-8 = 0
+\Rightarrow A+B=8\)
+值的位运算结果溢出即\(A+B>7\)
+\(\{x|x=8\}\subsetneqq\{x|x>7\}\)
+故该情况\(\color{red}{正确}\)
+c.正数绝对值小于负数绝对值
+数学运算结果:一定为负数 ,符号为负
+位运算结果:值的位运算结果溢出,符号位 \(0+1+1=0\) ,变成了正
+设这里两个数补码分别为\([0a_2a_1a_0],
+[1b_2b_1b_0]\)
+令 \(A = \sum\limits_{i=0}^{2}{a_i\times
+2^i}, B = \sum\limits_{i=0}^{2}{b_i \times 2^i}\),易知 \(A,B \in \N\)
+原式可化为 \(A+(-8)+B = A+B-8\)
+且 \(-8\le A+B - 8<0 \Rightarrow 0 \le
+A+B <8\)
+值的位运算结果溢出即 \(A+B>7\)
+\(\{x|0 < x < 8\}\cap\{x|x>7\} =
+\varnothing\)
+故该情况\(\color{red}{不存在}\)
+综上所述,所有存在的情况中,符号都是正确的,因此补码的正确性是可以保证的
-
-总结
本文简单解释了补码的原理
+总结
+本文简单解释了补码的原理
并证明了补码的正确性
-
参考文献
-[1] 《补码正确性的证明》
-[2] 《补码(为什么按位取反再加一):告诉你一个其实很简单的问题》
+
+参考文献
+[1] 《补码正确性的证明》
+
@@ -986,7 +1143,7 @@ 总结
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/07/09/wu-xu-shu-zu-jiao-huan-ren-yi-liang-ge-yuan-su-zui-shao-jiao-huan-ci-shu/index.html b/2021/07/09/wu-xu-shu-zu-jiao-huan-ren-yi-liang-ge-yuan-su-zui-shao-jiao-huan-ci-shu/index.html
index 69a63e456c..96de0f0742 100644
--- a/2021/07/09/wu-xu-shu-zu-jiao-huan-ren-yi-liang-ge-yuan-su-zui-shao-jiao-huan-ci-shu/index.html
+++ b/2021/07/09/wu-xu-shu-zu-jiao-huan-ren-yi-liang-ge-yuan-su-zui-shao-jiao-huan-ci-shu/index.html
@@ -472,14 +472,33 @@ 无序数组交换任意两个
- 无序数组交换任意两个元素 最少交换次数
题目描述
给定长度为 $n$ 的无序数组,将数组中的元素按从小到大的顺序排列,每次可以交换任意两个元素,最少要交换几次?
+ 无序数组交换任意两个元素
+最少交换次数
+题目描述
+给定长度为 \(n\)
+的无序数组,将数组中的元素按从小到大的顺序排列,每次可以交换任意两个元素,最少要交换几次?
-
-解题方法
解法一(较繁琐)
我们可以遍历一遍原数组,如果当前元素不在正确位置上,将该元素和此时在它正确位置上的元素交换
+解题方法
+解法一(较繁琐)
+我们可以遍历一遍原数组,如果当前元素不在正确位置上,将该元素和此时在它正确位置上的元素交换
这里有一个要注意的,某次交换后我们可能没有将交换和被交换数都放在正确位置上,且有可能在接下来的遍历中不会再次遍历到被交换数,因此交换后还要再判断,直到当前位置的数正确,显然不这么做不会影响正确结果
很容易证明这是最少的。
-设当前元素为 $\alpha$ (不在正确位置上),它与非 $\alpha$ 的正确位置上的元素 $\beta$ 交换,会有两种情况:第一种, $\beta$ 在正确位置上。由于最后 $\beta$ 一定会在正确位置上,且一定是 $\beta$ 和在 $\beta$ 正确位置上的元素交换(或 $\beta$ 本来就在正确位置),所以交换 $\alpha$ 和 $\beta$ 就是多余的;第二种, $\beta$ 不在正确位置上。显然对于每次必要交换,我们不在乎正确位置上的元素是什么,我们只需要将正确的元素与其交换就可以了,至于被交换的元素,我们会接下来处理它,所以交换 $\alpha$ 和 $\beta$ 是多余的
-由于我们要知道正确位置,所以要排序好的数组记录正确位置,时间复杂度 $O(n\log n)$
+设当前元素为 \(\alpha\)
+(不在正确位置上),它与非 \(\alpha\)
+的正确位置上的元素 \(\beta\)
+交换,会有两种情况:第一种, \(\beta\)
+在正确位置上。由于最后 \(\beta\)
+一定会在正确位置上,且一定是 \(\beta\)
+和在 \(\beta\) 正确位置上的元素交换(或
+\(\beta\) 本来就在正确位置),所以交换
+\(\alpha\) 和 \(\beta\) 就是多余的;第二种, \(\beta\)
+不在正确位置上。显然对于每次必要交换,我们不在乎正确位置上的元素是什么,我们只需要将正确的元素与其交换就可以了,至于被交换的元素,我们会接下来处理它,所以交换
+\(\alpha\) 和 \(\beta\) 是多余的
+由于我们要知道正确位置,所以要排序好的数组记录正确位置,时间复杂度
+\(O(n\log n)\)
主要代码如下
int fun(vector<int> a)
{
@@ -499,15 +518,24 @@ return ans;
}
-
-解法二
对于每个元素,我们将该元素和它的正确位置建边
-最后一定是 $1\sim n$ 个环(自环也算)
-对于有 $k$ 个元素的环,最少交换次数为 $k-1$
-假设共有 $p$ 个环,对于第 $i$ 个环,有 $k_i$ 个元素,则它的最少交换次数为 $k_i - 1$
-因此 $ans = \sum\limits_{i=1}^{p}{(k_i-1)} = \sum\limits_{i=1}^{p}{k_i} - p$
-显然 $n = \sum\limits_{i=1}^{p}{k_i}$
-所以答案就是 $n-p$ ,即元素个数 - 环的个数
-由于我们要知道正确位置,所以要排序好的数组记录正确位置,时间复杂度 $O(n\log n)$
+解法二
+对于每个元素,我们将该元素和它的正确位置建边
+最后一定是 \(1\sim n\)
+个环(自环也算)
+对于有 \(k\)
+个元素的环,最少交换次数为 \(k-1\)
+假设共有 \(p\) 个环,对于第 \(i\) 个环,有 \(k_i\) 个元素,则它的最少交换次数为 \(k_i - 1\)
+因此 \(ans = \sum\limits_{i=1}^{p}{(k_i-1)}
+= \sum\limits_{i=1}^{p}{k_i} - p\)
+显然 \(n =
+\sum\limits_{i=1}^{p}{k_i}\)
+所以答案就是 \(n-p\) ,即元素个数 -
+环的个数
+由于我们要知道正确位置,所以要排序好的数组记录正确位置,时间复杂度
+\(O(n\log n)\)
主要代码如下(注:其实可以不用递归)
vector<int> a;
map<int,int>mp;
@@ -885,7 +913,7 @@
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/07/10/quan-yuan-zui-duan-lu-johnson-suan-fa/index.html b/2021/07/10/quan-yuan-zui-duan-lu-johnson-suan-fa/index.html
index d894bf6ba2..3921e8ab53 100644
--- a/2021/07/10/quan-yuan-zui-duan-lu-johnson-suan-fa/index.html
+++ b/2021/07/10/quan-yuan-zui-duan-lu-johnson-suan-fa/index.html
@@ -468,48 +468,130 @@ 全源最短路 Johnson算法
- 全源最短路 Johnson算法
本文写于较早时期,之前对Dijkstra的理解不是很透彻
+ 全源最短路 Johnson算法
+本文写于较早时期,之前对Dijkstra的理解不是很透彻
已经修改了部分显然错误的内容,有空会再仔细检查的
-
-题意简述:给定一个包含 $n$ 个结点和 $m$ 条带权边的有向图,求全源最短路,可能有负权重的边、重边、自环,部分数据卡 SPFA 算法(还特地针对了SLF优化)
+
+题意简述:给定一个包含 \(n\) 个结点和 \(m\)
+条带权边的有向图,求全源最短路,可能有负权重的边、重边、自环,部分数据卡
+SPFA 算法(还特地针对了SLF优化)
题意很明确,就是卡SPFA、Dijkstra、Floyd的
-这题用SPFA可以被卡成$O(n^2m)$,Dijkstra不能处理负权重的边,Floyd$O(n^3)$肯定超时
+这题用SPFA可以被卡成\(O(n^2m)\),Dijkstra不能处理负权重的边,Floyd\(O(n^3)\)肯定超时
说了这么多,就是为了引出我们要讲的 Johnson 算法
-Johnson算法可以判断给定的图中有无负环,在无负环时能给出全源最短路时间复杂度 $O(n^2\log m)$ (Dijkstra采用优先队列优化,详细的分析可以看这边link)
+Johnson算法可以判断给定的图中有无负环,在无负环时能给出全源最短路时间复杂度
+\(O(n^2\log m)\)
+(Dijkstra采用优先队列优化,详细的分析可以看这边link)
Johnson算法的核心为重新赋予权值,使得边权变成非负的新边权,而在运行过程中以Bellman-Ford和Dijkstra(以下提到的Dijkstra都用优先队列优化)作为自己的子程序
-一、算法原理
以下推导过程部分参照《算法导论》
-对于给定有向图 $G=(V,E)$ ,权重函数为 $w:E \rightarrow R$ ,如果所有的边权重都为非负值,则只需在每一个结点上跑Dijkstra即可,时间复杂度$O(V^2\log E)$;如果存在边权重为负值的边,但没有负环,则我们只需要预处理出一种新的权重函数 $w^{\prime}:E \rightarrow R$ 使得所有的边权重为非负值再跑Dijkstra即可
-则新的权重函数 $w^{\prime}$ 一定满足以下两个条件:
-
-- 对于结点 $u,v \in V$ ,路径 $p$ 为使用权重函数 $w^{\prime}$ 时 $u$ 到 $v$ 的一条最短路径,当且仅当 $p$ 为使用权重函数 $w$ 时 $u$ 到 $v$ 的一条最短路径
-- 对于任何边 $(u,v) \in E$ ,$w^{\prime}(u,v)$ 为非负值 (Dijkstra不可以处理负权重的边)
+一、算法原理
+以下推导过程部分参照《算法导论》
+对于给定有向图 \(G=(V,E)\)
+,权重函数为 \(w:E \rightarrow R\)
+,如果所有的边权重都为非负值,则只需在每一个结点上跑Dijkstra即可,时间复杂度\(O(V^2\log
+E)\);如果存在边权重为负值的边,但没有负环,则我们只需要预处理出一种新的权重函数
+\(w^{\prime}:E \rightarrow R\)
+使得所有的边权重为非负值再跑Dijkstra即可
+则新的权重函数 \(w^{\prime}\)
+一定满足以下两个条件:
+
+- 对于结点 \(u,v \in V\) ,路径 \(p\) 为使用权重函数 \(w^{\prime}\) 时 \(u\) 到 \(v\) 的一条最短路径,当且仅当 \(p\) 为使用权重函数 \(w\) 时 \(u\) 到 \(v\) 的一条最短路径
+- 对于任何边 \((u,v) \in E\) ,\(w^{\prime}(u,v)\) 为非负值
+(Dijkstra不可以处理负权重的边)
-设函数 $h:V\rightarrow \mathbb{R}$ 将结点映射到实数上
-对于任何边$(u,v) \in E$,定义 $w^{\prime}(u,v) = w(u,v) + h(u) - h(v)$
-我们先假设图 $G$ 没有负环,设路径 $p$ 为使用权重函数 $w^{\prime}$ 时 $v_0$ 到 $v_k$的一条最短路径$(v_0,v_k \in V)$ ,当且仅当 $p$ 为使用权重函数 $w$ 时 $v_0$ 到 $v_k$ 的一条最短路径
-则可以证明 $w^{\prime}(p) = w(p) + h(v_0)-h(v_k)$
-因为 $h$ 为将结点映射到实数上的函数,函数的值不受边权重的影响,所以对于一条为使用权重函数 $w$ 时 $v_0$ 到 $v_k$ 比 $p$ 要长的路径 $q$ ,在使用权重函数 $w^{\prime}$ 时 $q$ 一定比 $p$ 长
-我们再来看看负环的问题,对于环$c = \langle v_0, v_1, … v_k\rangle$ ,其中 $v_0 = v_k$ ,则有 $w^{\prime}(c) = w(c) + h(v_0) -h(v_k) = w(c)$
-则对于 $c$ 使用权重函数 $w$ 时为负环,当且仅当使用权重函数 $w$ 时为负环
-那么 $h$ 函数该如何处理呢?
-我们可以新建一个虚拟结点 $s$ ,并将 $s$ 和其他所有结点建边权重为 $0$ 的边,在 $s$ 结点跑一次Bellman-Ford(SPFA当然可以),求出 $s$ 到其他结点的最短路,则对于任何 $v \in V$ , $h(v)$ 的值即为 $s$ 到 $v$ 的最短路径长,在跑的过程中如果一条路径中某个结点被松弛超过 $n$ 次,则一定存在负环,并返回存在负环的信息(SPFA判负环的方法就不延伸了)
-因为 $s$ 结点入度为 $0$ ,所以其他的路径中不会包含 $s$ 结点
-那么为什么无负环时使用权重函数 $w^{\prime}$ ,边权重一定为非负呢?
-设现在的图为 $G^{\prime} = (V^{\prime},E^{\prime})$ ,$V^{\prime} = V \cup \{s\}$ ,$E^{\prime} = E \cup \{(s,v),v\in E\}$
-根据三角形不等式,可知对于任意结点 $u,v \in V^{\prime}$ ,若 $\exists (u,v) \in E^{\prime}$,则有
-现在我们只需要在每个结点上跑一次Dijkstra即可
-时间复杂度 $O(V^2 \log E)$ (SPFA时间复杂度最坏 $O(VE)$ ,预处理时间复杂度 $O(VE)$ )
-二、参考代码
模板题代码如下 (注:输出按该题要求写的)
+h(u) + w(u,v) \ge h(v)&\Rightarrow w(u,v) + h(u) - h(v) \ge 0
+\\\\&\Rightarrow w^{\prime}(u,v) \ge 0
+\end{aligned}
+\] 现在我们只需要在每个结点上跑一次Dijkstra即可
+时间复杂度 \(O(V^2 \log
+E)\) (SPFA时间复杂度最坏 \(O(VE)\) ,预处理时间复杂度 \(O(VE)\) )
+二、参考代码
+模板题代码如下 (注:输出按该题要求写的)
#include <bits/stdc++.h>
using namespace std;
#define int long long
@@ -627,6 +709,7 @@ }
return 0;
}
+
@@ -983,7 +1066,7 @@
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/07/21/meng-ti-huo-er-wen-ti-ji-qi-tui-guang/index.html b/2021/07/21/meng-ti-huo-er-wen-ti-ji-qi-tui-guang/index.html
index 96b2a5d17e..b5d9847dc6 100644
--- a/2021/07/21/meng-ti-huo-er-wen-ti-ji-qi-tui-guang/index.html
+++ b/2021/07/21/meng-ti-huo-er-wen-ti-ji-qi-tui-guang/index.html
@@ -468,53 +468,89 @@ 蒙提霍尔问题及其推广
- 蒙提霍尔问题及其推广
前言
蒙提霍尔问题在《人教版A版数学选择性必修三》上作为阅读与思考的材料出现
+ 蒙提霍尔问题及其推广
+前言
+蒙提霍尔问题在《人教版A版数学选择性必修三》上作为阅读与思考的材料出现
本文会提供一种简单的解法并推广这个著名的问题
-
-蒙提霍尔问题
一、背景
三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let’s Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)
+蒙提霍尔问题
+一、背景
+三门问题(Monty Hall
+problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let's
+Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)
-
-二、简介
参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门是否会增加参赛者赢得汽车的几率
-
(注:以上摘自百度)
+二、简介
+参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门是否会增加参赛者赢得汽车的几率
+
+(注:以上摘自百度)
-
-三、分析
题面没什么好说的,我们直接来讨论概率问题
+三、分析
+题面没什么好说的,我们直接来讨论概率问题
根据直觉,我们可能会有以下两种判断
-
-- 三扇门中有车的概率都是 $\dfrac{1}{3}$ ,因此不必换门
-- 既然打开了一扇山羊门,那车在剩下两扇门中的概率都为 $\dfrac{1}{2}$ ,因此不必换门
+
+- 三扇门中有车的概率都是 \(\dfrac{1}{3}\) ,因此不必换门
+- 既然打开了一扇山羊门,那车在剩下两扇门中的概率都为 \(\dfrac{1}{2}\) ,因此不必换门
那么到底哪个是对的呢?(其实都不对)
首先我们先来明确概率是什么
我们称第一次选择后并在剩余的门中开启了一扇有山羊的门后可以选择的门的数量为可选门
(注:说的有一些绕,但是这样的思路对于该问题的推广很有帮助)
-在可选门中换到车门的概率就是 可选门中车门的数量除以可选门的数量
+在可选门中换到车门的概率就是
+可选门中车门的数量除以可选门的数量
接下来我们来分类讨论选择换门后得到车的概率(注:车门指门后是汽车,山羊门指门后是山羊)
-
-- 第一次选择的是车门(概率为 $\dfrac{1}{3}$ ),可选门有 $1$ 扇,其中还有 $0$ 扇车门,因此 $P_1=\dfrac{1}{3}\times\dfrac{0}{1} = 0$
-- 第一次选择的是山羊门(概率为 $\dfrac{2}{3}$ ),可选门有 $1$ 扇,其中还有 $1$ 扇车门,因此 $P_2=\dfrac{2}{3}\times\dfrac{1}{1} = \dfrac{2}{3}$
+
+- 第一次选择的是车门(概率为 \(\dfrac{1}{3}\) ),可选门有 \(1\) 扇,其中还有 \(0\) 扇车门,因此 \(P_1=\dfrac{1}{3}\times\dfrac{0}{1} =
+0\)
+- 第一次选择的是山羊门(概率为 \(\dfrac{2}{3}\) ),可选门有 \(1\) 扇,其中还有 \(1\) 扇车门,因此 \(P_2=\dfrac{2}{3}\times\dfrac{1}{1} =
+\dfrac{2}{3}\)
-加起来就是选择换门后得到车的概率 $\dfrac{2}{3}$
-而不换门得到车的概率为 $\dfrac{1}{3}$
-是不是很反直觉?
+加起来就是选择换门后得到车的概率 \(\dfrac{2}{3}\)
+而不换门得到车的概率为 \(\dfrac{1}{3}\)
+是不是很反直觉?
-
-四、推广
现在我们来讨论蒙提霍尔问题的推广(uva10491)
-设有 $a$ 扇山羊门, $b$ 扇车门,主持人打开 $c$ 扇山羊门( $a,b,c\in \mathbb{Z},1\le a,b \le 10000 , 0\le c < a$ )
-显然不换门得到车的概率为 $\dfrac{b}{a+b}$
+四、推广
+现在我们来讨论蒙提霍尔问题的推广(uva10491)
+设有 \(a\) 扇山羊门, \(b\) 扇车门,主持人打开 \(c\) 扇山羊门( \(a,b,c\in \mathbb{Z},1\le a,b \le 10000 , 0\le c
+< a\) )
+显然不换门得到车的概率为 \(\dfrac{b}{a+b}\)
那么选择换门后得到车的概率是多少呢?
-第一次选择后剩余的门为 $(a+b-1)$ 扇,可选门的数量为 $(a+b-c-1)$
+第一次选择后剩余的门为 \((a+b-1)\)
+扇,可选门的数量为 \((a+b-c-1)\)
继续来分类讨论
-
-- 第一次选择的是车门(概率为 $\dfrac{b}{a+b}$),可选门中车门的数量为 $(b-1)$ 扇,因此 $P_1 = \dfrac{b}{a+b}\times\dfrac{b-1}{a+b-c-1}$
-- 第一次选择的是山羊门(概率为 $\dfrac{a}{a+b}$ ),可选门中车门的数量为 $b$ 扇,因此 $P_2 = \dfrac{a}{a+b}\times\dfrac{b}{a+b-c-1}$
+
+- 第一次选择的是车门(概率为 \(\dfrac{b}{a+b}\)),可选门中车门的数量为
+\((b-1)\) 扇,因此 \(P_1 =
+\dfrac{b}{a+b}\times\dfrac{b-1}{a+b-c-1}\)
+- 第一次选择的是山羊门(概率为 \(\dfrac{a}{a+b}\) ),可选门中车门的数量为
+\(b\) 扇,因此 \(P_2 =
+\dfrac{a}{a+b}\times\dfrac{b}{a+b-c-1}\)
-加起来就是选择换门后得到车的概率为 $\dfrac{ab+b(b-1)}{(a+b)(a+b-c-1)}$
-很容易证明换门后得到车的概率一定更大(除了c=0时概率相等)
+加起来就是选择换门后得到车的概率为 \(\dfrac{ab+b(b-1)}{(a+b)(a+b-c-1)}\)
+很容易证明换门后得到车的概率一定更大(除了c=0时概率相等)
-
-总结
本文介绍并推广了蒙提霍尔问题
+总结
+本文介绍并推广了蒙提霍尔问题
@@ -867,7 +903,7 @@ 总结
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/07/22/dao-shu-de-ji-ben-gong-shi-tui-dao/index.html b/2021/07/22/dao-shu-de-ji-ben-gong-shi-tui-dao/index.html
index 10686fc3ad..7b3b670a20 100644
--- a/2021/07/22/dao-shu-de-ji-ben-gong-shi-tui-dao/index.html
+++ b/2021/07/22/dao-shu-de-ji-ben-gong-shi-tui-dao/index.html
@@ -468,170 +468,308 @@ 导数的基本公式推导
- 导数的基本公式推导
主要推导了人教版A版数学选择性必修二上直接给出的基本的导数公式
+ 导数的基本公式推导
+主要推导了人教版A版数学选择性必修二上直接给出的基本的导数公式
本文写于作者初三暑假,更新于高一暑假
可能含有很多不足,如果您方便的话可以联系我修改 awa
大概率会在高二暑假再更新一次吧
-
-一、导数的四则运算法则
设 $f(x),~g(x)$ 均为可导函数
-命题:${[f(x) \pm g(x)]}^{\prime} = f^{\prime}(x) \pm g^{\prime}(x)$
+
+一、导数的四则运算法则
+设 \(f(x),~g(x)\)
+均为可导函数
+命题:\({[f(x) \pm
+g(x)]}^{\prime} = f^{\prime}(x) \pm g^{\prime}(x)\)
证明:
-
-命题:$[f(x)g(x)]^{\prime}=f^{\prime}(x)g(x)+f(x)g^{\prime}(x)$
+{[f(x) \pm g(x)]}^{\prime}&=\lim\limits_{\Delta x\to
+0}{\dfrac{f(x+\Delta x)-f(x) \pm\left[g(x+\Delta x)-g(x)\right]}{\Delta
+x}}
+\\\\&=\lim\limits_{\Delta x\to 0}{\dfrac{f(x+\Delta x)-f(x)}{\Delta
+x}} \pm \lim\limits_{\Delta x\to 0}{\dfrac{g(x+\Delta x)-g(x)}{\Delta
+x}}
+\\\\&=f^{\prime}(x)\pm g^{\prime}(x)
+\end{aligned}
+\]
+
+命题:\([f(x)g(x)]^{\prime}=f^{\prime}(x)g(x)+f(x)g^{\prime}(x)\)
证明:
-
-命题:$\left[\dfrac{f(x)}{g(x)}\right]^{\prime} = \dfrac{f^{\prime}(x)g(x)-f(x)g^{\prime}(x)}{\left[g(x)\right]^2}$
+&=\lim\limits_{\Delta x \to 0}{\dfrac{f(x+\Delta x)g(x+\Delta
+x)-f(x)g(x)}{\Delta x}}
+\\\\&=\lim\limits_{\Delta x \to 0}{\dfrac{f(x+\Delta x)g(x+\Delta
+x)-f(x)g(x+\Delta x)+f(x)g(x+\Delta x)-f(x)g(x)}{\Delta x}}
+\\\\&=\lim\limits_{\Delta x\to 0}{\dfrac{f(x+\Delta x)-f(x)}{\Delta
+x}}\lim\limits_{\Delta x\to 0}{g(x+\Delta x)}+f(x)\lim\limits_{\Delta
+x\to 0}{\dfrac{g(x+\Delta x)-g(x)}{\Delta x}}
+\\\\&=f^{\prime}(x)g(x)+f(x)g^{\prime}(x)
+\end{aligned}
+\]
+
+命题:\(\left[\dfrac{f(x)}{g(x)}\right]^{\prime} =
+\dfrac{f^{\prime}(x)g(x)-f(x)g^{\prime}(x)}{\left[g(x)\right]^2}\)
证明:
-
-二、复合函数的求导法则(链式法则)
命题:设函数 $y=f(u)$ 在 $u=g(x)$ 处可导,而 $u=g(x)$ 在 $x$ 处可导,
-则函数 $y=f(g(x))$ 在 $x$ 处可导,且
-证明:
-因为 $u=g(x)$ 在 $x$ 处可导,所以它在这一点也是连续的
-也就是 $\Delta u \to 0$ 当 $\Delta x \to 0$ ,故
-
-三、基本初等函数的导数公式
命题:若 $f(x)=x^a(a\in \mathbb{N})$ ,则 $f^{\prime}(x) = a x^{a-1}$
+{\left[f(g(x))\right]}^{\prime}&=\lim\limits_{\Delta u \to
+0}\dfrac{\Delta y}{\Delta u}\lim\limits_{\Delta x \to 0}\dfrac{\Delta
+u}{\Delta x}
+\\\\&=f^{\prime}(u)g^{\prime}(x)
+\\\\&=f^{\prime}(g(x))\cdot g^{\prime}(x)
+\end{aligned}
+\]
+
+三、基本初等函数的导数公式
+命题:若 \(f(x)=x^a(a\in
+\mathbb{N})\) ,则 \(f^{\prime}(x) = a
+x^{a-1}\)
证明:
-可以推广到 $a\in \mathbb{R}$ 的情况,即
-命题:若 $f(x)=x^a(a\in \mathbb{R})$ ,则 $f^{\prime}(x) = a x^{a-1}$
+f^{\prime}(x)&=\lim\limits_{\Delta x\to 0}{\dfrac{(x+\Delta
+x)^{a}-(x)^{a}}{\Delta x}}
+\\\\&=\lim\limits_{\Delta x\to
+0}{\dfrac{\sum\limits_{r=0}^{a}{C_{a}^{r}x^{a-r}\Delta
+x^{r}}-C_{a}^{0}x^{a}}{\Delta x}}
+\\\\&=\lim\limits_{\Delta x\to
+0}{\dfrac{\sum\limits_{r=1}^{a}{C_{a}^{r}x^{a-r}\Delta x^{r}}}{\Delta
+x}}
+\\\\&=\lim\limits_{\Delta x\to
+0}{\sum\limits_{r=2}^{a}{C_{a}^{r}x^{a-r}\Delta
+x^{r-1}+C_{a}^{1}x^{a-1}}}
+\\\\&=C_a^{1}x^{a-1}
+\\\\&=a x^{a-1}
+\end{aligned}
+\]
+可以推广到 \(a\in \mathbb{R}\)
+的情况,即
+命题:若 \(f(x)=x^a(a\in
+\mathbb{R})\) ,则 \(f^{\prime}(x) = a
+x^{a-1}\)
证明:
-令 $t=(1+\frac{\Delta x}{x})^a-1$ ,则
-
-命题:若 $f(x)=\sin x$ ,则 $f^{\prime}(x)=\cos x$
+f^{\prime}(x)&=x^a\lim\limits_{\Delta x \to
+0}\dfrac{t}{\ln\left(1+t\right)} \cdot \dfrac{a\ln\left(1+\frac{\Delta
+x}{x}\right)}{\Delta x}
+\\\\&=x^a\lim\limits_{\Delta x \to 0}\dfrac{t}{\ln\left(1+t\right)}
+\cdot \dfrac{\ln\left(1+\frac{\Delta x}{x}\right)}{\frac{\Delta x}{x}}
+\cdot\dfrac{a}{x}
+\\\\&=ax^{a-1}
+\end{aligned}
+\]
+
+命题:若 \(f(x)=\sin
+x\) ,则 \(f^{\prime}(x)=\cos
+x\)
证明:
-
-命题:若 $f(x)=\cos x$ ,则 $f^{\prime}(x) = -\sin x$
+f^{\prime}(x)&=\lim\limits_{\Delta x\to 0}{\dfrac{\sin (x+\Delta
+x)-\sin x}{\Delta x}}
+\\\\&=\lim\limits_{\Delta x\to 0}{\dfrac{\sin x \cos\Delta x+\sin
+\Delta x \cos x-\sin x}{\Delta x}}
+\\\\&=\lim\limits_{\Delta x\to 0}{\dfrac{\sin x(\cos\Delta
+x-1)+\sin\Delta x\cos x}{\Delta x}}
+\\\\&=\lim\limits_{\Delta x\to 0}{\dfrac{\sin
+x\left[\left(1-2\sin^2\frac{\Delta x}{2}\right)-1\right]+\cos
+x\left(2\sin\frac{\Delta x}{2}\cos \frac{\Delta x}{2}\right)}{\Delta x}}
+\\\\&=\lim\limits_{\Delta x\to 0}{\dfrac{2\sin\frac{\Delta
+x}{2}\cos\frac{\Delta x}{2}\cos x-2\sin^2\frac{\Delta x}{2}\sin
+x}{\Delta x}}
+\\\\&=\lim\limits_{\Delta x\to 0}{\dfrac{2\sin\frac{\Delta
+x}{2}\left(\cos\frac{\Delta x}{2}\cos x-\sin x\sin \frac{\Delta
+x}{2}\right)}{\Delta x}}
+\\\\&=\lim\limits_{\Delta x\to 0}{\dfrac{2\sin\frac{\Delta
+x}{2}\cos\left(\frac{\Delta x}{2}+x\right)}{\Delta x}}
+\\\\&=\lim\limits_{\Delta x\to 0}{\cos\left(\dfrac{\Delta
+x}{2}+x\right)\dfrac{\sin\frac{\Delta x}{2}}{\frac{\Delta x}{2}}}
+\\\\&=\lim\limits_{\Delta x\to 0}\cos\left(\dfrac{\Delta
+x}{2}+x\right)
+\\\\&=\cos x
+\end{aligned}
+\]
+
+命题:若 \(f(x)=\cos
+x\) ,则 \(f^{\prime}(x) = -\sin
+x\)
证明:
-
-命题:若 $f(x)=a^x (a>0,\text{且}a \ne 1)$ ,则 $f^{\prime}(x)=a^x\ln a$
-证明:
-令 $t=a^{\Delta x}-1$ ,则$\Delta x = \log_a(t+1)$
-即
-则原极限可化为
-特别地,当 $a=e$ 时,即 $f(x)=e^x$ ,有 $f^{\prime}(x)=e^x$
-
-命题:若 $f(x)=\log_ax(a>0,\text{且}a \ne 1)$ ,则 $f^{\prime}(x) = \dfrac{1}{x\ln a}$
-证明:
-令 $t=\dfrac{\Delta x}{x}$ ,则 $\dfrac{1}{\Delta x} = \dfrac{1}{tx}$
-$\therefore$ 原极限可化为
-特别地,当 $a=e$ 时,即 $f(x)=\ln x$ ,有 $f^{\prime}(x)=\dfrac{1}{x}$
-
-命题:若 $f(x)=\varphi ( \varphi \texttt{为常数})$ ,则 $f^{\prime}(x)=0$
-证明:
-
+f^{\prime}(x) &=\lim\limits_{\Delta x\to
+0}{\dfrac{\varphi-\varphi}{\Delta x}}
+\\&=0
+\end{aligned}
+\]
+
参考文献
-[1] 复合函数的导数(链式法则)
-[2] 基本初等函数的导数
+[1] 复合函数的导数(链式法则)
+[2] 基本初等函数的导数
@@ -989,7 +1127,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/09/qian-tan-wu-dao-lian-dlx/index.html b/2021/08/09/qian-tan-wu-dao-lian-dlx/index.html
index 642dd440c6..162adf5044 100644
--- a/2021/08/09/qian-tan-wu-dao-lian-dlx/index.html
+++ b/2021/08/09/qian-tan-wu-dao-lian-dlx/index.html
@@ -472,37 +472,125 @@ 浅谈舞蹈链(DLX)
- 浅谈舞蹈链(DLX)
前言
舞蹈链的名字真好玩…
+ 浅谈舞蹈链(DLX)
+前言
+舞蹈链的名字真好玩...
-
-一、舞蹈链概述
舞蹈链 (Dancing links),也叫 DLX ,是由 Donald Knuth 提出的数据结构,目的是快速实现他提出的X算法。X算法是一种递归算法,时间复杂度不确定,深度优先,通过回溯寻找精确覆盖问题所有可能的解
+一、舞蹈链概述
+舞蹈链 (Dancing links),也叫 DLX
+,是由 Donald Knuth
+提出的数据结构,目的是快速实现他提出的X算法。X算法是一种递归算法,时间复杂度不确定,深度优先,通过回溯寻找精确覆盖问题所有可能的解
(以上摘自维基百科)
舞蹈链的主要思想来源于双向链表
-我们设 $l[x]$ 表示元素 $x$ 的左指针, $r[x]$ 表示元素 $x$ 的右指针
-显然,如果想要删除元素 $x$ ,我们可以做以下操作
+我们设 \(l[x]\) 表示元素 \(x\) 的左指针, \(r[x]\) 表示元素 \(x\) 的右指针
+显然,如果想要删除元素 \(x\)
+,我们可以做以下操作
r[l[x]]=r[x]; // x左侧的元素的右指针指向x右侧的元素
l[r[x]]=l[x]; // x右侧的元素的左指针指向x左侧的元素
-那恢复元素 $x$ 呢? 我们可以发现删除 $x$ 的时候, $x$ 的左右指针并没有改变,即 $l[x]$ 和 $r[x]$ 并没有改变,于是我们可以做以下操作
+那恢复元素 \(x\) 呢?
+我们可以发现删除 \(x\) 的时候, \(x\) 的左右指针并没有改变,即 \(l[x]\) 和 \(r[x]\)
+并没有改变,于是我们可以做以下操作
r[l[x]]=x; // x左侧的元素的右指针重新指向x
l[r[x]]=x; // x右侧的元素的左指针重新指向x
-这样如果 $x$ 左右两侧没有改变,我们就可以恢复 $x$ 所在的位置
+这样如果 \(x\)
+左右两侧没有改变,我们就可以恢复 \(x\)
+所在的位置
那么精确覆盖问题又是什么呢?
-给定矩阵,要求选出一个由若干行组成的集合,使得每一列上都有且仅有一个 $1$
-例如该矩阵选出的行为 $1,4,5$ 行
+给定矩阵,要求选出一个由若干行组成的集合,使得每一列上都有且仅有一个
+\(1\)
+\[\begin{pmatrix}0&0&1&0&1&1&0
+\\ 1&0&0&1&0&0&1 \\
+0&1&1&0&0&1&0 \\
+1&0&0&1&0&0&0 \\
+0&1&0&0&0&0&1 \\
+0&0&0&1&1&0&1\end{pmatrix}\]
+例如该矩阵选出的行为 \(1,4,5\)
+行
我们来模拟一下朴素X算法求解的过程
以下过程用红色表示选择了这一行,绿色表示存在冲突的元素,灰色表示删除的行
1.选择第一行
-2.标记所有和第一行冲突的元素
-3.删除存在冲突的行
-4.接着选择第二行
-5.标记与第二行冲突的元素
-6.删除存在冲突的行
-7.发现没有可以选择的行了,而已选的不满足要求,回溯,选择第四行
-8.接下来的同理,不断执行,直到找到答案
-我们会发现, $X$ 算法花了大量的时间在找 $1$ ,而且删改很不方便
+\[\begin{pmatrix}\color{red}0&\color{red}0&\color{red}1&\color{red}0&\color{red}1&\color{red}1&\color{red}0
+\\ 1&0&0&1&0&0&1 \\
+0&1&1&0&0&1&0 \\
+1&0&0&1&0&0&0 \\
+0&1&0&0&0&0&1 \\
+0&0&0&1&1&0&1\end{pmatrix}\]
+2.标记所有和第一行冲突的元素
+\[\begin{pmatrix}\color{red}0&\color{red}0&\color{red}1&\color{red}0&\color{red}1&\color{red}1&\color{red}0
+\\ 1&0&0&1&0&0&1 \\
+0&1&\color{green}1&0&0&\color{green}1&0 \\
+1&0&0&1&0&0&0 \\
+0&1&0&0&0&0&1 \\
+0&0&0&1&\color{green}1&0&1\end{pmatrix}\]
+3.删除存在冲突的行
+\[\begin{pmatrix}\color{red}0&\color{red}0&\color{red}1&\color{red}0&\color{red}1&\color{red}1&\color{red}0
+\\ 1&0&0&1&0&0&1 \\
+\color{grey}0&\color{grey}1&\color{grey}1&\color{grey}0&\color{grey}0&\color{grey}1&\color{grey}0
+\\ 1&0&0&1&0&0&0 \\
+0&1&0&0&0&0&1 \\
+\color{grey}0&\color{grey}0&\color{grey}0&\color{grey}1&\color{grey}1&\color{grey}0&\color{grey}1\end{pmatrix}\]
+4.接着选择第二行
+\[\begin{pmatrix}\color{red}0&\color{red}0&\color{red}1&\color{red}0&\color{red}1&\color{red}1&\color{red}0
+\\
+\color{red}1&\color{red}0&\color{red}0&\color{red}1&\color{red}0&\color{red}0&\color{red}1
+\\
+\color{grey}0&\color{grey}1&\color{grey}1&\color{grey}0&\color{grey}0&\color{grey}1&\color{grey}0
+\\ 1&0&0&1&0&0&0 \\
+0&1&0&0&0&0&1 \\
+\color{grey}0&\color{grey}0&\color{grey}0&\color{grey}1&\color{grey}1&\color{grey}0&\color{grey}1\end{pmatrix}\]
+5.标记与第二行冲突的元素
+\[\begin{pmatrix}\color{red}0&\color{red}0&\color{red}1&\color{red}0&\color{red}1&\color{red}1&\color{red}0
+\\
+\color{red}1&\color{red}0&\color{red}0&\color{red}1&\color{red}0&\color{red}0&\color{red}1
+\\
+\color{grey}0&\color{grey}1&\color{grey}1&\color{grey}0&\color{grey}0&\color{grey}1&\color{grey}0
+\\ \color{green}1&0&0&\color{green}1&0&0&0 \\
+0&1&0&0&0&0&\color{green}1 \\
+\color{grey}0&\color{grey}0&\color{grey}0&\color{grey}1&\color{grey}1&\color{grey}0&\color{grey}1\end{pmatrix}\]
+6.删除存在冲突的行
+\[\begin{pmatrix}\color{red}0&\color{red}0&\color{red}1&\color{red}0&\color{red}1&\color{red}1&\color{red}0
+\\
+\color{red}1&\color{red}0&\color{red}0&\color{red}1&\color{red}0&\color{red}0&\color{red}1
+\\
+\color{grey}0&\color{grey}1&\color{grey}1&\color{grey}0&\color{grey}0&\color{grey}1&\color{grey}0
+\\
+\color{grey}1&\color{grey}0&\color{grey}0&\color{grey}1&\color{grey}0&\color{grey}0&\color{grey}0
+\\
+\color{grey}0&\color{grey}1&\color{grey}0&\color{grey}0&\color{grey}0&\color{grey}0&\color{grey}1
+\\
+\color{grey}0&\color{grey}0&\color{grey}0&\color{grey}1&\color{grey}1&\color{grey}0&\color{grey}1\end{pmatrix}\]
+7.发现没有可以选择的行了,而已选的不满足要求,回溯,选择第四行
+\[\begin{pmatrix}\color{red}0&\color{red}0&\color{red}1&\color{red}0&\color{red}1&\color{red}1&\color{red}0
+\\ 1&0&0&1&0&0&1 \\
+\color{grey}0&\color{grey}1&\color{grey}1&\color{grey}0&\color{grey}0&\color{grey}1&\color{grey}0
+\\
+\color{red}1&\color{red}0&\color{red}0&\color{red}1&\color{red}0&\color{red}0&\color{red}0
+\\ 0&1&0&0&0&0&1 \\
+\color{grey}0&\color{grey}0&\color{grey}0&\color{grey}1&\color{grey}1&\color{grey}0&\color{grey}1\end{pmatrix}\]
+8.接下来的同理,不断执行,直到找到答案
+我们会发现, \(X\)
+算法花了大量的时间在找 \(1\)
+,而且删改很不方便
为了解决这个问题,舞蹈链就产生了
-模板题 $\to$ P4929 【模板】舞蹈链(DLX)
-(注:为了方便讲述,以下引用这篇博客中的图片(感谢图片的作者!))
+模板题 \(\to\) P4929
+【模板】舞蹈链(DLX)
+(注:为了方便讲述,以下引用这篇博客中的图片(感谢图片的作者!))
舞蹈链的结构即交叉十字循环双向链,本文中以数组形式实现链表
int n,m; // 行、列数
int u[MAXN],d[MAXN],l[MAXN],r[MAXN],h[MAXN];
@@ -510,9 +598,13 @@ int row[MAXN],col[MAXN],s[MAXN],ansk[MAXN],pos;
// 每个结点原先所在的行、列;每一列的结点个数;ansk记录搜索信息;结点总数
-如下图所示
别急!我们一步一步来实现这个复杂的数据结构
-首先初始化上方的列头结点
-我们可以称列头结点为限制,行头结点为决策 (注:这个做题的时候有用)
void init()
+如下图所示
+别急!我们一步一步来实现这个复杂的数据结构
+首先初始化上方的列头结点
+我们可以称列头结点为限制,行头结点为决策 (注:这个做题的时候有用)
+
void init()
{
for(R int i=0; i<=m; i++)
{
@@ -524,7 +616,9 @@ memset(h,-1,sizeof(h)); //每一行的头结点都为空
memset(s,0,sizeof(s)); //每一列的结点数都为0
pos=m+1; //已经搭建好了m个列头结点,下一个加入的结点从m+1开始编号
-}
接下来,我们来把插入结点的功能完成(注:这里比较复杂,可以感性理解一下)
void link(R int x,R int y)
+}
+接下来,我们来把插入结点的功能完成(注:这里比较复杂,可以感性理解一下)
+void link(R int x,R int y)
{
s[y]++; //所在的列结点数加1
row[pos]=x;col[pos]=y; //记录编号为pos的结点(即新加入的结点)的行和列
@@ -541,7 +635,7 @@ [h[x]]=pos;
}
pos++; //下一个结点不要标错号了
-}
现在我们来完成删除和恢复操作(差不多的)
inline void rm(R int y)
+}
现在我们来完成删除和恢复操作(差不多的) inline void rm(R int y)
{
l[r[y]]=l[y];r[l[y]]=r[y];//删除y列的结点(这个位置已经填满了)
for(R int i=d[y]; i!=y; i=d[i])
@@ -562,7 +656,8 @@ [col[j]]++;
}
r[l[y]]=y;l[r[y]]=y;
-}
然后可以开始跳舞了
主体部分,就是深度优先搜索
bool dance(R int dep)
+}
+然后可以开始跳舞了 主体部分,就是深度优先搜索 bool dance(R int dep)
{
if(!r[0])//所有的列头结点都被选了,说明成功了
{
@@ -583,10 +678,20 @@ }
rv(y);
return 0;
-}
如果您不太理解的话,可以看看下面的动图(注:其实和之前模拟的有些相似)
-算法执行过程 (注:图片是这篇博客的)
-
-最终的答案即下图 (选择 $1,4,5$ )
最后贴上完整代码
#include <bits/stdc++.h>
+}
+如果您不太理解的话,可以看看下面的动图(注:其实和之前模拟的有些相似)
+算法执行过程 (注:图片是这篇博客的)
+
+最终的答案即下图 (选择 \(1,4,5\) )
+ 最后贴上完整代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define R register
@@ -689,26 +794,31 @@ return 0;
}
-
-二、舞蹈链例题
如果您看到这里,还是很明白的话,那么我们来讲个例题
-题目链接:SP13980 SUDOGOB - Sudoku goblin
-题意:给定一个 $9 \times 9$ 的数独,输出可填的方案数,多组数据
-选择这个例题当然不是让你写暴搜的
+二、舞蹈链例题
+如果您看到这里,还是很明白的话,那么我们来讲个例题
+题目链接:SP13980
+SUDOGOB - Sudoku goblin
+题意:给定一个 \(9 \times
+9\) 的数独,输出可填的方案数,多组数据
+选择这个例题当然不是让你写暴搜的
首先考虑决策
-每个格子上填数字,至多有 $9\times 9\times 9 = 729$ 种决策
+每个格子上填数字,至多有 \(9\times 9\times
+9 = 729\) 种决策
再考虑限制
-
+
- 每个点只能填一个数
- 每行一个数只能填一次
- 每列一个数只能填一次
- 每个九宫格一个数只能填一次
-限制数为 $9\times 9 \times 4 = 324$
+限制数为 \(9\times 9 \times 4 =
+324\)
对于精准覆盖问题,我们本质上是在选择若干决策,使其恰好满足所有限制条件
因此这题可以用 DLX 求解
-那么 MAXN
只要开到 729*324 就行了(注:不过开大点保险)
-这题唯一的细节是插入结点的行、列,还是很简单的题目
-代码如下
#include <bits/stdc++.h>
+那么 MAXN
只要开到 729*324
+就行了(注:不过开大点保险)
+这题唯一的细节是插入结点的行、列,还是很简单的题目
+代码如下
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define R register
@@ -839,11 +949,12 @@ return 0;
}
当然,如果您有兴趣的话,可以去做下这道题
-
-这道题就是上一题的加强版,其实没什么区别,如果您理解了例题的话,这题就很简单了
+
+这道题就是上一题的加强版,其实没什么区别,如果您理解了例题的话,这题就很简单了
-
-总结
本文介绍了舞蹈链
+总结
+本文介绍了舞蹈链
@@ -1200,7 +1311,7 @@ 总结
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/10/ubuntu-qiang-zhi-xie-zai-vmware-player/index.html b/2021/08/10/ubuntu-qiang-zhi-xie-zai-vmware-player/index.html
index f2612e9cf3..3c4c19caa4 100644
--- a/2021/08/10/ubuntu-qiang-zhi-xie-zai-vmware-player/index.html
+++ b/2021/08/10/ubuntu-qiang-zhi-xie-zai-vmware-player/index.html
@@ -468,12 +468,17 @@ ubuntu 强制卸载vmware player
- ubuntu 强制卸载vmware player
不知道什么时候下了vmware-player,然后怎么都删不掉
-解决方法
打开终端,输入以下指令
locate vmware-player
然后会出现一大堆vmware player的文件
-复制一下,再把每一行都加上 sudo rm
或sudo rmdir
+ ubuntu 强制卸载vmware player
+不知道什么时候下了vmware-player,然后怎么都删不掉
+解决方法
+打开终端,输入以下指令
locate vmware-player
然后会出现一大堆vmware
+player的文件
+复制一下,再把每一行都加上
+sudo rm
或sudo rmdir
(注:这里注意一下删除顺序,rmdir似乎不能直接删除非空文件夹)
-非常简单,非常暴力,直接删除这些文件
-当然如果能正常卸载的话还是这个更好一点
sudo vmware-installer -u vmware-player
+非常简单,非常暴力,直接删除这些文件
+当然如果能正常卸载的话还是这个更好一点
+
sudo vmware-installer -u vmware-player
@@ -831,7 +836,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/13/pei-shu-ding-li-ji-qi-zheng-ming/index.html b/2021/08/13/pei-shu-ding-li-ji-qi-zheng-ming/index.html
index e84dfd996d..4c9c6fa5c9 100644
--- a/2021/08/13/pei-shu-ding-li-ji-qi-zheng-ming/index.html
+++ b/2021/08/13/pei-shu-ding-li-ji-qi-zheng-ming/index.html
@@ -468,36 +468,64 @@ 裴蜀定理及其证明
- 裴蜀定理及其证明
前言
原来裴蜀是法国数学家QwQ
+ 裴蜀定理及其证明
+前言
+原来裴蜀是法国数学家QwQ
-
-一、裴蜀定理
对于 $x,y$ 的二元一次不定方程 $ax+by=c$ ,其有解的充要条件为 $\gcd(a,b)\mid c$
-1.充分性证明
充分性:若 $\gcd(a,b)\mid c$ ,则 $ax+by=c$ 有解
-设 $k$ 为 $a,b$ 线性组合的最小非负解
-令 $q=\left\lfloor\dfrac{a}{k}\right\rfloor$ ,则有 $r=a \mod k = a-qk = a-q(ax+by) = a(1-qx)+b(-qy)$
-显然 $r$ 也为 $a,b$ 线性组合的解,且 $0\le r \le k$
-$\because k$ 为最小非负解
-$\therefore r=0$
-$\therefore k\mid a$
-同理 $k\mid b$
-令 $d=\gcd(a,b)$ ,则 $s\mid d$ 且 $d \ge s$
-$\because d\mid a,d\mid b$ 且 $s$ 为 $a,b$ 线性组合的解
-$\therefore d\mid s$
-$\because s>0$
-$\therefore d=s$
- 则 $ax+by=c$ 的最小非负解为 $\gcd(a,b)$
-显然 $\forall c=k\gcd(a,b),k\in \mathbb{Z}^+$ 是原方程的解
-2.必要性证明
必要性:若 $ax+by=c$ 有解,则 $\gcd(a,b)\mid c$
证明:
令 $d=\gcd(a,b)$ ,则 $d\mid a,d\mid b$
-$\because ax+by=c$ 有解
-$\therefore d\mid ax,d\mid by$
-$\therefore d\mid ax+by=c$
-3.推广
对于不定方程 $x_1y_1+x_2y_2+…+x_ny_n=k, \forall y_i \in \mathbb{Z}$ ,其有解的充要条件为 $\gcd\{x_i\}\mid k$
+一、裴蜀定理
+对于 \(x,y\)
+的二元一次不定方程 \(ax+by=c\) ,其有解的充要条件为 \(\gcd(a,b)\mid c\)
+1.充分性证明
+充分性:若 \(\gcd(a,b)\mid c\) ,则
+\(ax+by=c\) 有解
+设 \(k\) 为 \(a,b\) 线性组合的最小非负解
+令 \(q=\left\lfloor\dfrac{a}{k}\right\rfloor\)
+,则有 \(r=a \mod k = a-qk = a-q(ax+by) =
+a(1-qx)+b(-qy)\)
+显然 \(r\) 也为 \(a,b\) 线性组合的解,且 \(0\le r \le k\)
+\(\because k\) 为最小非负解
+\(\therefore r=0\)
+\(\therefore k\mid a\)
+同理 \(k\mid b\)
+令 \(d=\gcd(a,b)\) ,则 \(s\mid d\) 且 \(d
+\ge s\)
+\(\because d\mid a,d\mid b\) 且
+\(s\) 为 \(a,b\) 线性组合的解
+\(\therefore d\mid s\)
+\(\because s>0\)
+\(\therefore d=s\)
+则 \(ax+by=c\) 的最小非负解为 \(\gcd(a,b)\)
+显然 \(\forall c=k\gcd(a,b),k\in
+\mathbb{Z}^+\) 是原方程的解
+2.必要性证明
+必要性:若 \(ax+by=c\) 有解,则
+\(\gcd(a,b)\mid c\) 证明: 令 \(d=\gcd(a,b)\) ,则 \(d\mid a,d\mid b\)
+\(\because ax+by=c\) 有解
+\(\therefore d\mid ax,d\mid by\)
+\(\therefore d\mid ax+by=c\)
+3.推广
+对于不定方程 \(x_1y_1+x_2y_2+...+x_ny_n=k,
+\forall y_i \in \mathbb{Z}\) ,其有解的充要条件为 \(\gcd\{x_i\}\mid k\)
证明略
-
-二、裴蜀定理模板题
题目链接:P4549 【模板】裴蜀定理
+二、裴蜀定理模板题
+题目链接:P4549
+【模板】裴蜀定理
即推广结论裸题
-要注意负数要转成正数再算 $\gcd$
+要注意负数要转成正数再算 \(\gcd\)
代码如下
#include <bits/stdc++.h>
using namespace std;
@@ -519,8 +547,8 @@ return 0;
}
-
-总结
本文简单介绍了裴蜀定理
+总结
+本文简单介绍了裴蜀定理
@@ -873,7 +901,7 @@ 总结
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/15/qian-tan-ke-duo-li-shu-odt/index.html b/2021/08/15/qian-tan-ke-duo-li-shu-odt/index.html
index 57333abc69..64403aadfe 100644
--- a/2021/08/15/qian-tan-ke-duo-li-shu-odt/index.html
+++ b/2021/08/15/qian-tan-ke-duo-li-shu-odt/index.html
@@ -463,25 +463,45 @@ 浅谈珂朵莉树(ODT)
- 浅谈珂朵莉树(ODT)
前言
珂学家狂喜(
-
-一、珂朵莉树来源
珂朵莉树,原名老司机树(Old Driver Tree),在某场CF比赛中提出
+ 浅谈珂朵莉树(ODT)
+前言
+珂学家狂喜(
+
+一、珂朵莉树来源
+珂朵莉树,原名老司机树(Old Driver
+Tree),在某场CF比赛中提出
因为题目背景是《末日时在做什么?有没有空?可以来拯救吗?》中的珂朵莉,所以就叫珂朵莉树了
-
-二、珂朵莉树
题目链接:CF896C Willem, Chtholly and Seniorious
+
+二、珂朵莉树
+题目链接:CF896C
+Willem, Chtholly and Seniorious
题目要求维护一种数据结构,支持以下操作
-
-- 将 $[l,r]$ 区间内所有数加上 $x$
-- 将 $[l,r]$ 区间内所有数改成 $x$
-- 求 $[l,r]$ 区间第 $k$ 小的数
-- 求 $[l,r]$ 区间内所有数的 $x$ 次方的和取模 $y$
+
+- 将 \([l,r]\) 区间内所有数加上 \(x\)
+- 将 \([l,r]\)
+区间内所有数改成 \(x\)
+- 求 \([l,r]\) 区间第 \(k\) 小的数
+- 求 \([l,r]\) 区间内所有数的 \(x\) 次方的和取模 \(y\)
值得注意的是,数据为随机数据,说明没有故意构造卡的数据
-1.珂朵莉树有什么用?
最主要的就是区间内的推平操作了,即本题中的操作 $2$
+1.珂朵莉树有什么用?
+最主要的就是区间内的推平操作了,即本题中的操作 \(2\)
当然还有别的操作,那就不是最主要的了
-2.原理是什么?
写在前面:这个数据结构唯一前置知识就只有set
-a.存储
我们可以把区间看作若干个结点,每个结点都有自己的左端点 $l$ 、右端点 $r$ 以及值 $v$
-显然,一开始的时候每个结点的 $l=r=idx$ , $idx$ 指该元素在数组中的下标
+2.原理是什么?
+写在前面:这个数据结构唯一前置知识就只有set
+a.存储
+我们可以把区间看作若干个结点,每个结点都有自己的左端点 \(l\) 、右端点 \(r\) 以及值 \(v\)
+显然,一开始的时候每个结点的 \(l=r=idx\) , \(idx\) 指该元素在数组中的下标
我们可以把这些结点按左端点顺序存储在一个set
里
struct node
{
@@ -492,19 +512,35 @@ a.
return l<o.l;
}
};
-注意 int v
前的关键字 mutable
,这个关键字和const
恰好相反,意思是使v
始终允许修改,即使它是个常量
+注意 int v
前的关键字
+mutable
,这个关键字和const
恰好相反,意思是使v
始终允许修改,即使它是个常量
那么我们为什么要多次一举呢?过会再说(
-b.分割结点
显然每次推平操作并不能保证区间左、右端点恰好就在一个结点上,因此我们还需要对结点进行分割
-考虑查找一个结点,使得其左端点恰好为 $pos$ ,$pos$ 指某次操作中的一个分割点
-我们可以用set
中的lower_bound()
函数来找到第一个左端点大于等于 $pos$ 的结点
+b.分割结点
+显然每次推平操作并不能保证区间左、右端点恰好就在一个结点上,因此我们还需要对结点进行分割
+考虑查找一个结点,使得其左端点恰好为 \(pos\) ,\(pos\) 指某次操作中的一个分割点
+我们可以用set
中的lower_bound()
函数来找到第一个左端点大于等于
+\(pos\) 的结点
(注:因为我们是按左端点顺序排序的)
这个lower_bound()
会返回一个set
的常量迭代器
现在我们找到了一个结点,那么会出现以下三种情况
-第一种情况: $pos$ 恰好为一个结点的左端点,直接返回这个端点的迭代器(显然前提是这个结点不是s.end()
)
-那么其他情况得到的这个结点的左端点一定比 $pos$ 大
+第一种情况: \(pos\)
+恰好为一个结点的左端点,直接返回这个端点的迭代器(显然前提是这个结点不是s.end()
)
+那么其他情况得到的这个结点的左端点一定比 \(pos\) 大
因此可以尝试分割前一个结点,即把迭代器it--
-第二种情况:这个结点的右端点小于 $pos$ ,由于结点的端点一定是连续的,说明 $pos$ 是新加入的结点,直接 return s.end()
-第三种情况:最普遍的情况,找到了一个结点恰好包含 $pos$ ,因为我们要的是以 $pos$ 为左端点的结点,显然我们要把这个结点分割成 $node\{l,pos-1,v\}$ 和 $node\{pos,r,v\}$
+第二种情况:这个结点的右端点小于 \(pos\) ,由于结点的端点一定是连续的,说明
+\(pos\) 是新加入的结点,直接
+return s.end()
+第三种情况:最普遍的情况,找到了一个结点恰好包含
+\(pos\) ,因为我们要的是以 \(pos\)
+为左端点的结点,显然我们要把这个结点分割成 \(node\{l,pos-1,v\}\) 和 \(node\{pos,r,v\}\)
set<node>::iterator split(R int pos)
{
set<node>::iterator it=s.lower_bound({pos});
@@ -517,12 +553,15 @@ return s.insert({pos,r,v}).first;
// insert函数的返回值是pair类型的,而它的first恰好使我们需要的(新插入结点的指针)
}
-c.推平
解决了区间的端点问题,我们只要获取要求修改区间左、右端点的结点,把这一段删除,再插入要求赋的值和修改区间的左、右端点作为新的结点
+c.推平
+解决了区间的端点问题,我们只要获取要求修改区间左、右端点的结点,把这一段删除,再插入要求赋的值和修改区间的左、右端点作为新的结点
注意一定要先找右端点所在结点,再找左端点所在结点
为什么?因为我们再分割结点时大概率删除了部分结点,并加入新的结点,如果我们先找左端点所在结点,再找右端点所在结点,很有左端点所在结点的迭代器已经失效了
-例如有一个结点 $node\{l=1,r=5\}$ ,修改区间的左端点为 $1$ ,右端点为 $3$
+例如有一个结点 \(node\{l=1,r=5\}\)
+,修改区间的左端点为 \(1\) ,右端点为
+\(3\)
按先左再右的顺序,我们先会得到左端点所在结点
-$node\{l=1,r=5\}$
+\(node\{l=1,r=5\}\)
显然如果我们找右端点所在结点,会将左端点所在结点进行分割,那么原来的结点就没了,迭代器失效,然后RE
inline void assign(R int l,R int r,R int k)
{
@@ -530,7 +569,8 @@ c.
s.erase(itl,itr); // 删掉[itl,itr)中所有结点
s.insert({l,r,k}); // 插入新结点
}
-d.剩余操作
区间加,十分暴力,十分简单,我们只要找到左、右端点所在结点,然后直接把每个结点修改就行
+d.剩余操作
+区间加,十分暴力,十分简单,我们只要找到左、右端点所在结点,然后直接把每个结点修改就行
现在知道为什么要写mutable
了吧!因为split()
返回的是常量迭代器
inline void add(R int l,R int r,R int k)
{
@@ -538,8 +578,14 @@ for(R set<node>::iterator it=itl; it!=itr; it++)
it->v+=k; // 直接加
}
-区间第 $k$ 小数,我们只要把区间内的所有结点取出来从大到小排序即可
-注意每个结点指代的可能是一段区间,而我们要求的是第 $k$ 小的数,因此每遍历一个结点,如果 $k$ 大于该结点指代的区间长,则让 $k$ 减去该结点指代的区间长,否则第 $k$ 小的数就在该结点区间内,直接输出即可
+区间第 \(k\)
+小数,我们只要把区间内的所有结点取出来从大到小排序即可
+注意每个结点指代的可能是一段区间,而我们要求的是第 \(k\) 小的数,因此每遍历一个结点,如果 \(k\) 大于该结点指代的区间长,则让 \(k\) 减去该结点指代的区间长,否则第 \(k\)
+小的数就在该结点区间内,直接输出即可
struct Rank
{
int num,cnt;
@@ -569,9 +615,13 @@ =(ans%y+qpow(it->v,x,y)%y*(it->r-it->l+1)%y)%y; // 快速幂qpow()就不贴了
return ans;
}
-3.复杂度分析
set
实现的珂朵莉树复杂度为 $O(n\log^2n)$
-不过本人不是很会分析,这篇文章分析证明的很好,大家可以看看
-完整代码 (注:原题的随机数据是给定 $seed$ 等自行生成)
+3.复杂度分析
+set
实现的珂朵莉树复杂度为 \(O(n\log^2n)\)
+不过本人不是很会分析,这篇文章分析证明的很好,大家可以看看
+完整代码 (注:原题的随机数据是给定 \(seed\) 等自行生成)
#include <bits/stdc++.h>
using namespace std;
#define int long long
@@ -696,14 +746,22 @@
-
-
-三、珂朵莉树例题
(注:都是洛谷上的题~)
-1.P4979 矿洞:坍塌
题目链接:P4979 矿洞:坍塌
+三、珂朵莉树例题
+(注:都是洛谷上的题~)
+1.P4979 矿洞:坍塌
+题目链接:P4979
+矿洞:坍塌
题意:要求维护一个数据结构,支持对给定字符串进行如下操作
-A x y op
表示替换材料,将 $x$ 到 $y(1\le x\le y\le N)$
区间内的材料替换为op
,op
为$A,B,C$ 三种材料字符中的一个
-B x y
表示是否询问,即询问 $x$ 到 $y(1\le x\le y\le
N)$区间内的材料是否合法,合法输出Yes
,不合法输出No
+A x y op
表示替换材料,将 \(x\) 到 \(y(1\le
+x\le y\le N)\)
+区间内的材料替换为op
,op
为\(A,B,C\) 三种材料字符中的一个
+B x y
表示是否询问,即询问 \(x\) 到 \(y(1\le
+x\le y\le
+N)\)区间内的材料是否合法,合法输出Yes
,不合法输出No
合法指该区间连续且材料相等,并且该区间前一个和后一个材料不相同
几乎是板子题,没什么特别的,只要跟题目意思写查询操作就行
@@ -797,21 +855,35 @@ }
return 0;
}
-2.P5350 序列
题目链接:P5350 序列
+2.P5350 序列
+题目链接:P5350
+序列
题意:要求维护一个数据结构,支持对给定数组进行以下操作
-1 l r
求 $[l,r]$ 的区间和
-2 l r v
将 $[l,r]$ 赋值为 $v$
-3 l r v
将 $[l,r]$ 加上 $v$
-4 l1 r1 l2 r2
将 $[l_1,r_1]$ 复制到 $[l_2,r_2]$
-5 l1 r1 l2 r2
将 $[l_1,r_1]$ 和 $[l_2,r_2]$ 交换
-6 l r
将 $[l,r]$翻转
+1 l r
求 \([l,r]\)
+的区间和
+2 l r v
将 \([l,r]\)
+赋值为 \(v\)
+3 l r v
将 \([l,r]\)
+加上 \(v\)
+4 l1 r1 l2 r2
将 \([l_1,r_1]\) 复制到 \([l_2,r_2]\)
+5 l1 r1 l2 r2
将 \([l_1,r_1]\) 和 \([l_2,r_2]\) 交换
+6 l r
将 \([l,r]\)翻转
我直呼神仙题
本题前三个操作就是基本操作
后三个操作值得探讨
-首先是将 $[l_1,r_1]$ 中所有数复制到 $[l_2,r_2]$
-我们可以把 $[l_1,r_1]$ 中所有结点记录,然后直接用这些结点推平 $[l_2,r_2]$
+首先是将 \([l_1,r_1]\)
+中所有数复制到 \([l_2,r_2]\)
+我们可以把 \([l_1,r_1]\)
+中所有结点记录,然后直接用这些结点推平 \([l_2,r_2]\)
struct THR
{
int l,r,v;
@@ -826,8 +898,10 @@ for(R int i=0; i<vec.size(); i++)
assign(vec[i].l,vec[i].r,vec[i].v);
}
-其次是将 $[l_1,r_1]$ 和 $[l_2,r_2]$ 交换
-我比较懒,直接把 $[l_1,r_1]$ 复制到 $[n+1,n+r_1-l_1+1]$
+其次是将 \([l_1,r_1]\) 和
+\([l_2,r_2]\) 交换
+我比较懒,直接把 \([l_1,r_1]\)
+复制到 \([n+1,n+r_1-l_1+1]\)
然后就像当年 int c=a;a=b;b=c;
一样交换就行了
void Swap(R int l1,R int r1,R int l2,R int r2)
{
@@ -967,12 +1041,23 @@ }
return 0;
}
-3.CF343D Water Tree
题目链接:CF343D Water Tree
+3.CF343D Water Tree
+题目链接:CF343D
+Water Tree
-题意:给出一棵以 $1$ 为根节点的 $n$ 个节点的有根树。每个点有一个权值,初始为 $0$ ,支持以下操作
-1 u
将点 $u$ 和其子树上的所有节点的权值改为 $1$
-2 u
将点 $u$ 到 $1$ 的路径上的所有节点的权值改为 $0$
-3 u
询问 $u$ 的权值
+题意:给出一棵以 \(1\) 为根节点的 \(n\)
+个节点的有根树。每个点有一个权值,初始为 \(0\) ,支持以下操作
+1 u
将点 \(u\)
+和其子树上的所有节点的权值改为 \(1\)
+2 u
将点 \(u\) 到 \(1\) 的路径上的所有节点的权值改为 \(0\)
+3 u
询问 \(u\)
+的权值
简单的树链剖分+珂朵莉树
单点查询只要lower_bound()
就行了
@@ -1100,9 +1185,16 @@ }
return 0;
}
-4.CF915E Physical Education Lessons
题目链接:CF915E Physical Education Lessons
+4.CF915E Physical Education
+Lessons
+题目链接:CF915E
+Physical Education Lessons
-题意:区间赋值为 $1$ 或 $0$ ,求 $1$ 个数 (我用 $1$ 表示题目中的工作日)
+题意:区间赋值为 \(1\) 或 \(0\) ,求 \(1\) 个数 (我用 \(1\) 表示题目中的工作日)
这题比板子题还要简单
唯一要注意的是每次输出结果不能去扫一遍(复杂度爆炸),而是在每次修改时统计
@@ -1163,17 +1255,17 @@ return 0;
}
-
-
-总结
本文简单介绍了珂朵莉树
+总结
+本文简单介绍了珂朵莉树
顺便讲了几道简单的例题
-
-
-题外话
作为珂学家,怎么能少了这环节呢(
+题外话
+作为珂学家,怎么能少了这环节呢(
送上本人找到的高清无水印壁纸一份(
-
再来一个(
-
如果幸福有颜色的话,那一定是终末之红染尽的蓝色!
+
+再来一个(
+
+如果幸福有颜色的话,那一定是终末之红染尽的蓝色!
@@ -1543,7 +1635,7 @@
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/18/luo-gu-p1047-noip2005-pu-ji-zu-xiao-men-wai-de-shu-ti-jie/index.html b/2021/08/18/luo-gu-p1047-noip2005-pu-ji-zu-xiao-men-wai-de-shu-ti-jie/index.html
index 3a0637d27e..3f5aa37ac3 100644
--- a/2021/08/18/luo-gu-p1047-noip2005-pu-ji-zu-xiao-men-wai-de-shu-ti-jie/index.html
+++ b/2021/08/18/luo-gu-p1047-noip2005-pu-ji-zu-xiao-men-wai-de-shu-ti-jie/index.html
@@ -480,16 +480,23 @@ 洛谷P1047 [NOIP2005 普及组]
- 洛谷P1047 [NOIP2005 普及组] 校门外的树 题解
前言
如何把一道入门题写成省选题?(手动滑稽)
+ 洛谷P1047 [NOIP2005
+普及组] 校门外的树 题解
+前言
+如何把一道入门题写成省选题?(手动滑稽)
本题解是我在练习分块时突发奇想写的,真就把入门题写成省选题的感觉(
才发现原来这些简单题这么有趣(
-
-题目链接: P1047 [NOIP2005 普及组] 校门外的树
+
+题目链接: P1047
+[NOIP2005 普及组] 校门外的树
-题意:马路上砍树,问砍了 $m$ 次还有几棵树
+题意:马路上砍树,问砍了 \(m\) 次还有几棵树
-一、模拟解法(正常解法)
我们只要把每次砍掉的树标记一下,最后统计未标记的数量即可
-注意下标从 $0$ 开始,共 $n+1$ 个数
+一、模拟解法(正常解法)
+我们只要把每次砍掉的树标记一下,最后统计未标记的数量即可
+注意下标从 \(0\) 开始,共 \(n+1\) 个数
代码如下:
#include <bits/stdc++.h>
using namespace std;
@@ -511,7 +518,8 @@ printf("%lld\n",ans);
return 0;
}
-二、线段树解法(开始奇怪起来)
直接用线段树维护区间,没什么特别的
+二、线段树解法(开始奇怪起来)
+直接用线段树维护区间,没什么特别的
代码如下:
#include <bits/stdc++.h>
using namespace std;
@@ -590,7 +598,8 @@ printf("%lld\n",query(1,n,1,n,1));
return 0;
}
-三、分块解法 (开始毒瘤起来)
只有一个要注意的,就是每次暴力减的时候要防止减为负数
代码如下:
+三、分块解法 (开始毒瘤起来)
+只有一个要注意的,就是每次暴力减的时候要防止减为负数 代码如下:
#include <bits/stdc++.h>
using namespace std;
#define int long long
@@ -667,9 +676,11 @@ printf("%lld\n",sum(1,n));
return 0;
}
-四、珂朵莉树解法 (非常珂学)
一看这个推平操作,立马就想到了珂朵莉树
-如果不知道珂朵莉树的可以看看我写的这篇文章
-代码如下:
#include <bits/stdc++.h>
+四、珂朵莉树解法 (非常珂学)
+一看这个推平操作,立马就想到了珂朵莉树
+如果不知道珂朵莉树的可以看看我写的这篇文章
+代码如下: #include <bits/stdc++.h>
using namespace std;
#define int long long
#define R register
@@ -728,15 +739,18 @@ }
printf("%lld\n",sum(1,n));
return 0;
-}
+}
-
-总结
本文简单介绍了几种解法来解决此题
+总结
+本文简单介绍了几种解法来解决此题
-
-题外话
数据太水了,所以这几种做法的速度都很快
-附上提交记录叭…
-
+题外话
+数据太水了,所以这几种做法的速度都很快
+附上提交记录叭...
+
@@ -1105,7 +1119,7 @@
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/26/luo-gu-p1581-a-b-problem-sheng-ji-ban-ti-jie/index.html b/2021/08/26/luo-gu-p1581-a-b-problem-sheng-ji-ban-ti-jie/index.html
index a411928c60..ac031d474d 100644
--- a/2021/08/26/luo-gu-p1581-a-b-problem-sheng-ji-ban-ti-jie/index.html
+++ b/2021/08/26/luo-gu-p1581-a-b-problem-sheng-ji-ban-ti-jie/index.html
@@ -472,14 +472,21 @@ 洛谷P1581 A+B Problem(升级
- 洛谷P1581 A+B Problem(升级版)题解
+ 洛谷P1581 A+B
+Problem(升级版)题解
+
-题意:每一位进制不同,第一位进制为 $2$ ,第二位进制为 $3$ ,第 $i$ 位进制为第 $i$ 个质数,求A+B
+题意:每一位进制不同,第一位进制为 \(2\) ,第二位进制为 \(3\) ,第 \(i\) 位进制为第 \(i\) 个质数,求A+B
本题就是以普通的高精度加法为基础,改了一下进位的方式而已
这里我用的vector<int>
写的高精度
我们可以把每一位的进制打个表,在进位的时候取模就行了
-代码如下
#include<bits/stdc++.h>
+代码如下
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define R register
@@ -895,7 +902,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/26/luo-gu-p2865-usaco06nov-roadblocks-g-ti-jie/index.html b/2021/08/26/luo-gu-p2865-usaco06nov-roadblocks-g-ti-jie/index.html
index 3df728f731..863a6a8594 100644
--- a/2021/08/26/luo-gu-p2865-usaco06nov-roadblocks-g-ti-jie/index.html
+++ b/2021/08/26/luo-gu-p2865-usaco06nov-roadblocks-g-ti-jie/index.html
@@ -472,15 +472,32 @@ 洛谷P2865 [USACO06NOV]Roadbloc
- 洛谷P2865 [USACO06NOV]Roadblocks G 题解
题目链接:P2865 [USACO06NOV]Roadblocks G
+ 洛谷P2865
+[USACO06NOV]Roadblocks G 题解
+题目链接:P2865
+[USACO06NOV]Roadblocks G
-题意:求结点 $1$ 到结点 $n$ 的次短路,所有边有非负权重,边可以重复经过,无向图
+题意:求结点 \(1\)
+到结点 \(n\)
+的次短路,所有边有非负权重,边可以重复经过,无向图
如果是求最短路,那么一个dijkstra直接搞定
但是这题要求的是次短路,同样也可以dijkstra解决
-我们观察 $1$ 到 $v$ 的一条次短路 $p$
-要么存在 $1$ 到 $u$ 的一条最短路 $k_1$ ,使得 $k_1$ 加上 $(u,v)$ 等于 $p$
-要么存在 $1$ 到 $u$ 的一条次短路 $k_2$ ,使得 $k_2$ 加上 $(u,v)$ 等于 $p$
+我们观察 \(1\) 到 \(v\) 的一条次短路 \(p\)
+要么存在 \(1\) 到 \(u\) 的一条最短路 \(k_1\) ,使得 \(k_1\) 加上 \((u,v)\) 等于 \(p\)
+要么存在 \(1\) 到 \(u\) 的一条次短路 \(k_2\) ,使得 \(k_2\) 加上 \((u,v)\) 等于 \(p\)
因此我们只需要记录每个结点的最短距离和次短距离即可
(注:由于最短路径可能有多条,但是并不影响结果,因此我们假设只有一条路径)
由于每个结点都可以访问多次,那么怎么防止死循环呢?
@@ -924,7 +941,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/26/luo-gu-p4878-usaco05dec-layout-g-ti-jie/index.html b/2021/08/26/luo-gu-p4878-usaco05dec-layout-g-ti-jie/index.html
index d218a3b4d5..cd6dd60065 100644
--- a/2021/08/26/luo-gu-p4878-usaco05dec-layout-g-ti-jie/index.html
+++ b/2021/08/26/luo-gu-p4878-usaco05dec-layout-g-ti-jie/index.html
@@ -472,35 +472,61 @@ 洛谷P4878 [USACO05DEC]Layout G
- 洛谷P4878 [USACO05DEC]Layout G 题解
题目链接:P4878 [USACO05DEC]Layout G
+ 洛谷P4878 [USACO05DEC]Layout
+G 题解
+题目链接:P4878
+[USACO05DEC]Layout G
-题意:按编号排了 $n$ 只奶牛,有的奶牛间必须相距小于等于一个距离,有的奶牛间必须相距大于等于一个距离,问 $1$ 到 $n$ 的距离最大值
+题意:按编号排了 \(n\)
+只奶牛,有的奶牛间必须相距小于等于一个距离,有的奶牛间必须相距大于等于一个距离,问
+\(1\) 到 \(n\) 的距离最大值
-我们可以发现题目给的数据本质上就是 $v-u\ge d_i$ 或 $v-u \le d_i$
+我们可以发现题目给的数据本质上就是 \(v-u\ge
+d_i\) 或 \(v-u \le d_i\)
这是什么?差分约束!
-差分约束:根据三角不等式 $d_u + w(u,v) \ge d_v$ 的构成,我们可以把形如 $v-u\ge d_i$ 的不等式转化为
-$v-d_i\ge u$ (可以看作 $v$ 向 $u$ 连了一条边权为 $-d_i$ 的有向边),同理 $v-u \le d_i$ 转化为 $u+d_i \ge v$
+差分约束:根据三角不等式 \(d_u + w(u,v) \ge d_v\)
+的构成,我们可以把形如 \(v-u\ge d_i\)
+的不等式转化为
+\(v-d_i\ge u\) (可以看作 \(v\) 向 \(u\) 连了一条边权为 \(-d_i\) 的有向边),同理 \(v-u \le d_i\) 转化为 \(u+d_i \ge v\)
这里不过多讲解差分约束了
那么为什么差分约束后求最短路就是最大值呢?
因为求最短路是由无穷大向下不断约束得到的,因此得到的是最大值(同理求最长路就是最小值)
那我们只要按题意建图就行了
-要注意的是,每个奶牛 $i$ 满足 $d_{i-1} \le d_{i}$ ,其中 $d$ 表示所在位置,因此相邻的也要建边
+要注意的是,每个奶牛 \(i\) 满足
+\(d_{i-1} \le d_{i}\) ,其中 \(d\) 表示所在位置,因此相邻的也要建边
为什么要强调这一点呢?
如下图:
-
-如果没有建边,会发现答案为 $5$ (如上图所示)
-
+
+如果没有建边,会发现答案为 \(5\)
+(如上图所示)
+
如果建了边,答案才正确(该情况无解)
-那现在只要从 $1$ 开始跑SPFA就好了
-但是还有问题, $1$ 并不能保证与所有结点连通,而我们知道差分约束无解的情况就是图中有负环
-这个问题好解决,我们先在原图上建一个超级结点 $0$ 与所有结点相连(边权为 $0$ ),在 $0$ 跑一次SPFA判断即可判断解的情况
+那现在只要从 \(1\)
+开始跑SPFA就好了
+但是还有问题, \(1\)
+并不能保证与所有结点连通,而我们知道差分约束无解的情况就是图中有负环
+这个问题好解决,我们先在原图上建一个超级结点 \(0\) 与所有结点相连(边权为 \(0\) ),在 \(0\) 跑一次SPFA判断即可判断解的情况
说了这么多,是不是有点晕(
理一下思路:
-
+
- 差分约束建图
- 相邻编号建图
-- 建 $0$ 结点判断解的情况
-- 有解则从 $1$ 开始跑SPFA
+- 建 \(0\) 结点判断解的情况
+- 有解则从 \(1\) 开始跑SPFA
代码如下
#include <bits/stdc++.h>
@@ -939,7 +965,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/26/poj3723-conscription-ti-jie/index.html b/2021/08/26/poj3723-conscription-ti-jie/index.html
index fa34861f92..ad13feb9e7 100644
--- a/2021/08/26/poj3723-conscription-ti-jie/index.html
+++ b/2021/08/26/poj3723-conscription-ti-jie/index.html
@@ -472,15 +472,24 @@ POJ3723 Conscription 题解
- POJ3723 Conscription 题解
题目链接:POJ3723 Conscription
+ POJ3723 Conscription 题解
+
-题意:要招 $n$ 个女的, $m$ 个男的,原价 $10000$,如果招了关系亲密的(男女)人可以降价,求最小花费
+题意:要招 \(n\)
+个女的, \(m\) 个男的,原价 \(10000\),如果招了关系亲密的(男女)人可以降价,求最小花费
-首先,题目给出的格式 $x_i\ y_i\ d_i$ 很像图论题
-我们可以把每个人看作一个结点,为了防止男女编号相同的人搞混了,我们可以让女的编号为 $1 \sim n$ ,男的编号为 $n+1 \sim m$ ,显然这题要我们选出所有的结点且花费最小
+首先,题目给出的格式 \(x_i\ y_i\
+d_i\) 很像图论题
+我们可以把每个人看作一个结点,为了防止男女编号相同的人搞混了,我们可以让女的编号为
+\(1 \sim n\) ,男的编号为 \(n+1 \sim m\)
+,显然这题要我们选出所有的结点且花费最小
我们可以发现答案如果存在环则会产生矛盾,例如:a招了b,b招了c,c招了a,这说不通
那是最小生成树吗?不一定
-我们可以发现给定的这张图不一定是连通图,而我们要求的是花费最小的树型结构(感性理解下),那么这就是最大权森林问题,同样可以用最小生成树来求解(注:边权设为 $-d_i$)
+我们可以发现给定的这张图不一定是连通图,而我们要求的是花费最小的树型结构(感性理解下),那么这就是最大权森林问题,同样可以用最小生成树来求解(注:边权设为
+\(-d_i\))
由于不一定是树,所以不需要记录连了多少边
代码如下
#include <cstdio>
@@ -916,7 +925,7 @@
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/27/shu-lun-ti-xia-zuo-1/index.html b/2021/08/27/shu-lun-ti-xia-zuo-1/index.html
index 37ed57102c..eb0449af45 100644
--- a/2021/08/27/shu-lun-ti-xia-zuo-1/index.html
+++ b/2021/08/27/shu-lun-ti-xia-zuo-1/index.html
@@ -468,58 +468,96 @@ 数论题瞎做[1]
- 数论题瞎做[1]
某个学MO的朋友给我看的题
+ 数论题瞎做[1]
+某个学MO的朋友给我看的题
这题似乎是1994年国家数学集训队选拔考试D1T1
怪不得我做了好久(
upd.20220513 害,他半途而废退役了
-
+
题面:
-求四个所有的由四个自然数 $a,b,c,d$ 组成的数组,使数组中任意三个数的乘积除以剩下的一个数余数为 $1$
+求四个所有的由四个自然数 \(a,b,c,d\)
+组成的数组,使数组中任意三个数的乘积除以剩下的一个数余数为 \(1\)
题解:
(注:我写的可能有点不太正式,毕竟我只是个OIer)
由题意可得
-$abc \equiv 1 \mod d$
-$abd \equiv 1 \mod c$
-$acd \equiv 1 \mod b$
-$bcd \equiv 1 \mod a$
+\(abc \equiv 1 \mod d\)
+\(abd \equiv 1 \mod c\)
+\(acd \equiv 1 \mod b\)
+\(bcd \equiv 1 \mod a\)
可化为
-$d\mid (abc-1)$
-$c\mid (abd-1)$
-$b\mid (acd-1)$
-$a\mid (bcd-1)$
-$\therefore ab\mid (acd-1)(bcd-1) \Rightarrow ab\mid (abc^2d^2-acd-bcd+1)$
-$\therefore ab\mid (acd+bcd-1)$
-同理 $cd\mid (abc+abd-1)$
-$\therefore abcd\mid (a^2bc^2d+ab^2c^2d+a^2bc^2d+ab^2cd^2-abc-abd-acd-bcd+1)$
-$\therefore abcd\mid (abc+abd+acd+bcd-1)$
-设 $t=\dfrac{abc+abd+acd+bcd-1}{abcd}$
-$\therefore t=\dfrac{1}{a}+\dfrac{1}{b}+\dfrac{1}{c}+\dfrac{1}{d}-\dfrac{1}{abcd}$
-显然 $a,b,c,d$ 两两互质,且 $a \ge 2$
-由于不考虑顺序,则假设 $2\le a < b < c < d$
-$\therefore t< \dfrac{4}{a} \le 2$
-$\because t\in \mathbb{Z}^+$
-$\therefore a=2,3,t=1$
-当 $a=3$ 时,$t_{max} = \dfrac{1}{3}+\dfrac{1}{4}+\dfrac{1}{5}+\dfrac{1}{6}-\dfrac{1}{360} = \dfrac{341}{360}<1$$\quad\therefore$舍去
-当 $a=2$ 时,$t_{max} = \dfrac{1}{2}+\dfrac{1}{3}+\dfrac{1}{5}+\dfrac{1}{7}-\dfrac{1}{210} = \dfrac{246}{210}>1$
-$\therefore a =2$
-$\therefore \dfrac{1}{2}<\dfrac{3}{b}$
-$\therefore b=3,5$
-当 $b=5$ 时,$t_{max} = \dfrac{1}{2}+\dfrac{1}{5}+\dfrac{1}{7}+\dfrac{1}{9}-\dfrac{1}{630} = \dfrac{600}{630}<1$$\quad\therefore$舍去
-当 $b=3$ 时,$t_{max} = \dfrac{1}{2}+\dfrac{1}{3}+\dfrac{1}{5}+\dfrac{1}{7}-\dfrac{1}{210} = \dfrac{246}{210}>1$
-$\therefore b=3$
-$\therefore \dfrac{1}{6} < \dfrac{2}{c}$
-$\therefore c=7,11$
-当 $c=7$ 时,$t_{max} = \dfrac{1}{2}+\dfrac{1}{3}+\dfrac{1}{7}+\dfrac{1}{11}-\dfrac{1}{462} = \dfrac{492}{462}>1$
-当 $c=11$ 时,$t_{max} = \dfrac{1}{2}+\dfrac{1}{3}+\dfrac{1}{11}+\dfrac{1}{13}-\dfrac{1}{858} = \dfrac{858}{858}=1$
-显然当 $c=11$ 时 $d=13$
-则一组解为 $2,3,11,13$
-当 $c=7$ 时
-$\dfrac{1}{42}<\dfrac{1}{d}$
-$\therefore d=41$
-则另一组解为 $2,3,7,41$
-综上所述,答案为 $2,3,11,13$ 或 $2,3,7,41$
-
-为了验算结果我直接敲了个 $O(n^4)$ 的暴力(傻)
+\(d\mid (abc-1)\)
+\(c\mid (abd-1)\)
+\(b\mid (acd-1)\)
+\(a\mid (bcd-1)\)
+\(\therefore ab\mid (acd-1)(bcd-1)
+\Rightarrow ab\mid (abc^2d^2-acd-bcd+1)\)
+\(\therefore ab\mid
+(acd+bcd-1)\)
+同理 \(cd\mid (abc+abd-1)\)
+\(\therefore abcd\mid
+(a^2bc^2d+ab^2c^2d+a^2bc^2d+ab^2cd^2-abc-abd-acd-bcd+1)\)
+\(\therefore abcd\mid
+(abc+abd+acd+bcd-1)\)
+设 \(t=\dfrac{abc+abd+acd+bcd-1}{abcd}\)
+\(\therefore
+t=\dfrac{1}{a}+\dfrac{1}{b}+\dfrac{1}{c}+\dfrac{1}{d}-\dfrac{1}{abcd}\)
+显然 \(a,b,c,d\) 两两互质,且 \(a \ge 2\)
+由于不考虑顺序,则假设 \(2\le a < b <
+c < d\)
+\(\therefore t< \dfrac{4}{a} \le
+2\)
+\(\because t\in \mathbb{Z}^+\)
+\(\therefore a=2,3,t=1\)
+当 \(a=3\) 时,\(t_{max} =
+\dfrac{1}{3}+\dfrac{1}{4}+\dfrac{1}{5}+\dfrac{1}{6}-\dfrac{1}{360} =
+\dfrac{341}{360}<1\)\(\quad\therefore\)舍去
+当 \(a=2\) 时,\(t_{max} =
+\dfrac{1}{2}+\dfrac{1}{3}+\dfrac{1}{5}+\dfrac{1}{7}-\dfrac{1}{210} =
+\dfrac{246}{210}>1\)
+\(\therefore a =2\)
+\(\therefore
+\dfrac{1}{2}<\dfrac{3}{b}\)
+\(\therefore b=3,5\)
+当 \(b=5\) 时,\(t_{max} =
+\dfrac{1}{2}+\dfrac{1}{5}+\dfrac{1}{7}+\dfrac{1}{9}-\dfrac{1}{630} =
+\dfrac{600}{630}<1\)\(\quad\therefore\)舍去
+当 \(b=3\) 时,\(t_{max} =
+\dfrac{1}{2}+\dfrac{1}{3}+\dfrac{1}{5}+\dfrac{1}{7}-\dfrac{1}{210} =
+\dfrac{246}{210}>1\)
+\(\therefore b=3\)
+\(\therefore \dfrac{1}{6} <
+\dfrac{2}{c}\)
+\(\therefore c=7,11\)
+当 \(c=7\) 时,\(t_{max} =
+\dfrac{1}{2}+\dfrac{1}{3}+\dfrac{1}{7}+\dfrac{1}{11}-\dfrac{1}{462} =
+\dfrac{492}{462}>1\)
+当 \(c=11\) 时,\(t_{max} =
+\dfrac{1}{2}+\dfrac{1}{3}+\dfrac{1}{11}+\dfrac{1}{13}-\dfrac{1}{858} =
+\dfrac{858}{858}=1\)
+显然当 \(c=11\) 时 \(d=13\)
+则一组解为 \(2,3,11,13\)
+当 \(c=7\) 时
+\(\dfrac{1}{42}<\dfrac{1}{d}\)
+\(\therefore d=41\)
+则另一组解为 \(2,3,7,41\)
+综上所述,答案为 \(2,3,11,13\) 或
+\(2,3,7,41\)
+
+为了验算结果我直接敲了个 \(O(n^4)\)
+的暴力(傻)
@@ -881,7 +919,7 @@
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/27/uva10006-carmichael-numbers-ti-jie/index.html b/2021/08/27/uva10006-carmichael-numbers-ti-jie/index.html
index 5ea89ba56b..5bb8ff0215 100644
--- a/2021/08/27/uva10006-carmichael-numbers-ti-jie/index.html
+++ b/2021/08/27/uva10006-carmichael-numbers-ti-jie/index.html
@@ -472,20 +472,39 @@ UVA10006 Carmichael Numbers
- UVA10006 Carmichael Numbers
题目链接:UVA10006 Carmichael Numbers
+ UVA10006 Carmichael Numbers
+题目链接:UVA10006 Carmichael
+Numbers
-题意:若 $\forall x (1<x<n) ,x^n\equiv x \mod n$ ,且 $n$ 为合数,则称 $n$ 为Carmichael Numbers
,多组数据判断 $n$ 是否是这种数
-数据范围 $2<n<65000$
+题意:若 \(\forall x
+(1<x<n) ,x^n\equiv x \mod n\) ,且 \(n\) 为合数,则称 \(n\)
+为Carmichael Numbers
,多组数据判断 \(n\) 是否是这种数
+数据范围 \(2<n<65000\)
-合数好处理,直接 $O(\sqrt{n})$ 暴力判断即可
-那么 $x^n$ 怎么处理呢?
-如果我们去一个一个乘,时间复杂度 $O(n^2)$ ,直接TLE
+合数好处理,直接 \(O(\sqrt{n})\)
+暴力判断即可
+那么 \(x^n\) 怎么处理呢?
+如果我们去一个一个乘,时间复杂度 \(O(n^2)\) ,直接TLE
因此,我们要用到快速幂
-对于 $x^k$ ,根据整数的唯一分解定理和常识,$k$ 可以写成唯一的二进制形式
-则 $x^k$ 可以被分解为它二进制位上每一个 $1$ 的幂的乘积
-例如: $x^{(5)_{10}} = x^{(101)_2} = x^{(100)_2} \times x^{(1)_2} = x^{(4)_{10}} \times x^{(1)_{10}}$
-那么我们只需要把 $k$ 不断右移一位,看它最后一位是否为 $1$ ,是就乘上对应的数即可
-因此我们就可以在 $O(n\log{n})$的时间搞定这题了
+对于 \(x^k\)
+,根据整数的唯一分解定理和常识,\(k\)
+可以写成唯一的二进制形式
+则 \(x^k\)
+可以被分解为它二进制位上每一个 \(1\)
+的幂的乘积
+例如: \(x^{(5)_{10}} = x^{(101)_2} =
+x^{(100)_2} \times x^{(1)_2} = x^{(4)_{10}} \times
+x^{(1)_{10}}\)
+那么我们只需要把 \(k\)
+不断右移一位,看它最后一位是否为 \(1\)
+,是就乘上对应的数即可
+因此我们就可以在 \(O(n\log{n})\)的时间搞定这题了
代码如下:
#include <bits/stdc++.h>
using namespace std;
@@ -892,7 +911,7 @@
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/28/luo-gu-p1006-noip2008-ti-gao-zu-chuan-zhi-tiao-ti-jie/index.html b/2021/08/28/luo-gu-p1006-noip2008-ti-gao-zu-chuan-zhi-tiao-ti-jie/index.html
index 4cf249b13b..55ad65ca35 100644
--- a/2021/08/28/luo-gu-p1006-noip2008-ti-gao-zu-chuan-zhi-tiao-ti-jie/index.html
+++ b/2021/08/28/luo-gu-p1006-noip2008-ti-gao-zu-chuan-zhi-tiao-ti-jie/index.html
@@ -472,37 +472,60 @@ 洛谷P1006 [NOIP2008 提高组]
- 洛谷P1006 [NOIP2008 提高组] 传纸条
+ 洛谷P1006 [NOIP2008 提高组]
+传纸条
+题目链接:P1006
+[NOIP2008 提高组] 传纸条
-题意:网格图, $(1,1)$ 到 $(n,m)$ 找两条不重合的路径,最大价值
注:原题是 $(m,n)$ ,但我不习惯,所以就用 $(n,m)$ 替代(即 $n$ 行 $m$ 列)!
+题意:网格图, \((1,1)\) 到 \((n,m)\) 找两条不重合的路径,最大价值
+注:原题是 \((m,n)\)
+,但我不习惯,所以就用 \((n,m)\)
+替代(即 \(n\) 行 \(m\) 列)!
-解法一
最烂解法 ,但是能通过此题
-设 $dp[i][j][k][l]$ 表示第一条路径到 $(i,j)$ 的位置,第二条路径到 $(k,l)$ 的位置,能获得的最大价值
-由于两条路径正着走反着走都一样,所以我们可以看作从 $(1,1)$ 到 $(n,m)$ 的两条不重合的路径
-那么显然
-$dp[i][j][k][l] = \\ \max\{dp[i-1][j][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k-1][l],dp[i][j-1][k][l-1]\}+a[i][j]+a[k][l]$
-因为不重复,所以当 $i=k,j=l$ 时要减去 $a[i][j]$
-时间复杂度 $O(n^4)$
-空间复杂度 $O(n^4)$
-伪代码如下(懒的写了…)
+解法一
+最烂解法 ,但是能通过此题
+设 \(dp[i][j][k][l]\)
+表示第一条路径到 \((i,j)\)
+的位置,第二条路径到 \((k,l)\)
+的位置,能获得的最大价值
+由于两条路径正着走反着走都一样,所以我们可以看作从 \((1,1)\) 到 \((n,m)\) 的两条不重合的路径
+那么显然
+\(dp[i][j][k][l] = \\
+\max\{dp[i-1][j][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k-1][l],dp[i][j-1][k][l-1]\}+a[i][j]+a[k][l]\)
+因为不重复,所以当 \(i=k,j=l\)
+时要减去 \(a[i][j]\)
+时间复杂度 \(O(n^4)\)
+空间复杂度 \(O(n^4)\)
+伪代码如下(懒的写了...)
for i=1 to n:
for j=1 to m:
for k=1 to n:
for l=1 to m:
dp[i][j][k][l]=max{dp[i-1][j][k-1][l],dp[i-1][j][k][l-1],dp[i][j-1][k-1][l],dp[i][j-1][k][l-1]}+a[i][j]+!((i==k&&j==l))*a[k][l];
-答案就是 $dp[n][m][n][m]$
+答案就是 \(dp[n][m][n][m]\)
呕~这代码够烂的
-解法二
我们观察每个路径,由于它一定是一个斜线方向的(即只能右移下移)
+解法二
+我们观察每个路径,由于它一定是一个斜线方向的(即只能右移下移)
我们知道一个点的纵坐标,那么它的横坐标就是横纵坐标之和减去纵坐标
而两条路径的长度一定是相等的
那么就不用记录点的坐标了
-设 $dp[k][i][j]$ 表示横纵坐标和为 $k$ ,第一条路径终点纵坐标为 $i$ ,第二条路径终点纵坐标为 $j$ 时能获得的最大价值
+设 \(dp[k][i][j]\) 表示横纵坐标和为
+\(k\) ,第一条路径终点纵坐标为 \(i\) ,第二条路径终点纵坐标为 \(j\) 时能获得的最大价值
那么显然
- $dp[k][i][j]=\\\max\{dp[k-1][i-1][j],dp[k-1][i][j-1],dp[k-1][i][j],dp[k-1][i-1][j-1]\}+a[k-i][i]+a[k-j][j]$
-我们发现 $k$ 和 $k-1$ 的答案有关
+\(dp[k][i][j]=\\\max\{dp[k-1][i-1][j],dp[k-1][i][j-1],dp[k-1][i][j],dp[k-1][i-1][j-1]\}+a[k-i][i]+a[k-j][j]\)
+我们发现 \(k\) 和 \(k-1\) 的答案有关
那么我们可以弄个滚动数组,注意顺序即可通过此题
-时间复杂度 $O(n^3)$
-空间复杂度 $O(n^2)$
+时间复杂度 \(O(n^3)\)
+空间复杂度 \(O(n^2)\)
代码:
#include <bits/stdc++.h>
using namespace std;
@@ -894,7 +917,7 @@
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/28/luo-gu-p4085-usaco17dec-haybale-feast-g-ti-jie/index.html b/2021/08/28/luo-gu-p4085-usaco17dec-haybale-feast-g-ti-jie/index.html
index ee692b7a4c..d99a2badba 100644
--- a/2021/08/28/luo-gu-p4085-usaco17dec-haybale-feast-g-ti-jie/index.html
+++ b/2021/08/28/luo-gu-p4085-usaco17dec-haybale-feast-g-ti-jie/index.html
@@ -472,16 +472,31 @@ 洛谷P4085 [USACO17DEC]Haybale
- 洛谷P4085 [USACO17DEC]Haybale Feast G 题解
题目链接:P4085 [USACO17DEC]Haybale Feast G
+ 洛谷P4085
+[USACO17DEC]Haybale Feast G 题解
+题目链接:P4085
+[USACO17DEC]Haybale Feast G
-题意:给定 $2$ 个由 $N$ 个数字组成的数列 $F,S$ ,需要找到使得 $\sum_{k=i}^{j}F_k\ge M$ 的 $i,j$ 并输出在所有满足条件的 $i,j$ 中,$\max(S_i,S_{i+1},…S_{j-1},S_{j}$)的最小值,数列里每个数非负
+题意:给定 \(2\)
+个由 \(N\) 个数字组成的数列 \(F,S\) ,需要找到使得 \(\sum_{k=i}^{j}F_k\ge M\) 的 \(i,j\) 并输出在所有满足条件的 \(i,j\) 中,\(\max(S_i,S_{i+1},...S_{j-1},S_{j}\))的最小值,数列里每个数非负
-解法一
由非负这个条件我们可以得到一个重要结论
-对于区间 $A,B$ ,若 $A \subsetneqq B$ ,则 $A$ 的最大值小于等于 $B$ 的最大值
+解法一
+由非负这个条件我们可以得到一个重要结论
+对于区间 \(A,B\) ,若 \(A \subsetneqq B\) ,则 \(A\) 的最大值小于等于 \(B\) 的最大值
因此具有单调性
那么我们可以二分答案解决此题
-每次判断就 $O(n)$ 扫一遍看看有没有满足条件的区间即可
-时间复杂度 $O(n\log \max \{S_i\})$
+每次判断就 \(O(n)\)
+扫一遍看看有没有满足条件的区间即可
+时间复杂度 \(O(n\log \max
+\{S_i\})\)
代码如下
#include <bits/stdc++.h>
using namespace std;
@@ -522,11 +537,13 @@ proc(0,inf);
return 0;
}
-解法二
显然第一维限制我们可以用尺取法搞定
-因为我们要找到的 $i,j$ 一定是尽可能短的区间
+解法二
+显然第一维限制我们可以用尺取法搞定
+因为我们要找到的 \(i,j\)
+一定是尽可能短的区间
那么第二维限制我们可以用单调队列搞定
为什么?因为尺取法的端点是单调不下降的
-时间复杂度 $O(n)$
+时间复杂度 \(O(n)\)
代码如下
#include <bits/stdc++.h>
using namespace std;
@@ -935,7 +952,7 @@
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/28/ubuntu-wu-fa-lian-jie-zhi-ibus-jie-jue-fang-fa/index.html b/2021/08/28/ubuntu-wu-fa-lian-jie-zhi-ibus-jie-jue-fang-fa/index.html
index e3c78ba49f..141daf5cda 100644
--- a/2021/08/28/ubuntu-wu-fa-lian-jie-zhi-ibus-jie-jue-fang-fa/index.html
+++ b/2021/08/28/ubuntu-wu-fa-lian-jie-zhi-ibus-jie-jue-fang-fa/index.html
@@ -468,7 +468,9 @@ ubuntu 无法连接至ibus 解
- ubuntu 无法连接至ibus 解决方法
在终端中输入以下指令
+ ubuntu 无法连接至ibus
+解决方法
+在终端中输入以下指令
ibus-daemon -r -d -x
大概的意思就是把原来的进程杀掉然后启动ibus
然后ibus
它就回来了
@@ -830,7 +832,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/28/uva1121-subsequence-ti-jie/index.html b/2021/08/28/uva1121-subsequence-ti-jie/index.html
index 2c299bde04..0f1e3faed2 100644
--- a/2021/08/28/uva1121-subsequence-ti-jie/index.html
+++ b/2021/08/28/uva1121-subsequence-ti-jie/index.html
@@ -468,14 +468,21 @@ UVA1121 Subsequence 题解
- UVA1121 Subsequence 题解
题目链接:UVA1121 Subsequence
+ UVA1121 Subsequence 题解
+题目链接:UVA1121
+Subsequence
-题意:给定数组,找最短连续子序列使其和大于 $S$ ,多组数据
+题意:给定数组,找最短连续子序列使其和大于 \(S\) ,多组数据
-解法一
对于区间 $[l,r]$ ,若 $\sum_{i=l}^{r}a[i]\ge S$ ,那么 $\forall r’>r (r’ \le n)$ 该条件均成立
+解法一
+对于区间 \([l,r]\) ,若 \(\sum_{i=l}^{r}a[i]\ge S\) ,那么 \(\forall r'>r (r' \le n)\)
+该条件均成立
那么我们只要枚举左端点,二分查找满足条件的最左的右端点,然后找个最小值就行了
区间和用前缀和优化即可
-时间复杂度 $O(n\log n)$
+时间复杂度 \(O(n\log n)\)
代码如下
#include <bits/stdc++.h>
using namespace std;
@@ -511,18 +518,29 @@ while(Input())proc();
return 0;
}
-解法二
本解法就是尺取法
+解法二
+本解法就是尺取法
根据上面的结论,我们再想一想,有没有必要枚举左端点呢?
对于每个左端点,当且仅当右端点在尽可能左的位置时对答案有贡献
或者说对答案有贡献的每个左端点所对应的右端点是唯一确定的
显然右端点也是单调不降的
-我们可以设 $l$ 表示当前左端点的位置, $r$ 不断自增 $1$ 直到 $[l,r]$ 的和大于等于 $S$
-这时 $l,r$ 一定是对答案有贡献的一组,和最小值取个 $\min$
+我们可以设 \(l\)
+表示当前左端点的位置, \(r\) 不断自增
+\(1\) 直到 \([l,r]\) 的和大于等于 \(S\)
+这时 \(l,r\)
+一定是对答案有贡献的一组,和最小值取个 \(\min\)
那么怎么继续呢?
-我们把左端点 $l$ 不断自增 $1$ 直到此时 $[l,r]$ 的和小于 $S$ ,然后再继续拓展右端点
+我们把左端点 \(l\) 不断自增 \(1\) 直到此时 \([l,r]\) 的和小于 \(S\) ,然后再继续拓展右端点
不断重复以上过程直到右端点无法拓展且左端点无解时结束
-由于每个点只遍历至多 $2$ 次,因此
-时间复杂度 $O(n)$
+由于每个点只遍历至多 \(2\)
+次,因此
+时间复杂度 \(O(n)\)
代码如下
#include <bits/stdc++.h>
using namespace std;
@@ -910,7 +928,7 @@
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/28/vijos1659-he-xie-wang-guo-ti-jie/index.html b/2021/08/28/vijos1659-he-xie-wang-guo-ti-jie/index.html
index 8b200ed96a..b8d8d41aad 100644
--- a/2021/08/28/vijos1659-he-xie-wang-guo-ti-jie/index.html
+++ b/2021/08/28/vijos1659-he-xie-wang-guo-ti-jie/index.html
@@ -468,7 +468,9 @@ Vijos1659 河蟹王国 题解
- Vijos1659 河蟹王国 题解
题目链接:Vijos1659 河蟹王国
+ Vijos1659 河蟹王国 题解
+题目链接:Vijos1659
+河蟹王国
题意:维护一个数据结构,支持区间最大值查询、区间加操作
@@ -476,7 +478,7 @@ 我们在建树时将最大值搞好查询就好了
那么区间加怎么办?
显然区间加操作会将影响到的最大值增加同一个值,而改变后的最大值在上传时进行更新即可
-等于就把线段树板子搬过来改一改就过了… 因为基本原理差不多
+等于就把线段树板子搬过来改一改就过了... 因为基本原理差不多
代码如下
#include <bits/stdc++.h>
using namespace std;
@@ -559,6 +561,7 @@ }
return 0;
}
+
@@ -915,7 +918,7 @@
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/29/luo-gu-p1985-usaco07open-fliptile-s-ti-jie/index.html b/2021/08/29/luo-gu-p1985-usaco07open-fliptile-s-ti-jie/index.html
index b34237a8b1..95a045d946 100644
--- a/2021/08/29/luo-gu-p1985-usaco07open-fliptile-s-ti-jie/index.html
+++ b/2021/08/29/luo-gu-p1985-usaco07open-fliptile-s-ti-jie/index.html
@@ -468,22 +468,36 @@ 洛谷P1985 [USACO07OPEN] Flipti
- 洛谷P1985 [USACO07OPEN] Fliptile S 题解
题目链接:P1985 [USACO07OPEN] Fliptile S
+ 洛谷P1985 [USACO07OPEN]
+Fliptile S 题解
+题目链接:P1985
+[USACO07OPEN] Fliptile S
题意:二维的开关问题,一次改变该格和四连通格
-注:原题是 $(m,n)$ ,但本人不习惯这种表示,所以就用 $(n,m)$ 替代(即 $n$ 行 $m$ 列)!
+注:原题是 \((m,n)\)
+,但本人不习惯这种表示,所以就用 \((n,m)\) 替代(即 \(n\) 行 \(m\) 列)!
-首先看到题意马上想到搜索,发现状态数 $2^{nm}$ ,直接起飞
-显然我们可以发现对于一个位置,翻转次数至多 $2$ 次,否则是没有意义的
-
+首先看到题意马上想到搜索,发现状态数 \(2^{nm}\) ,直接起飞
+显然我们可以发现对于一个位置,翻转次数至多 \(2\) 次,否则是没有意义的
+
不同于链接中那题,本题的四连通会有一定影响,不可直接确定
如果您没做过那题没有关系 qwq
-我们考虑 $(1,1)$ ,如果它要翻转,那么一定会影响到 $(1,2)$ 和 $(2,1)$
+我们考虑 \((1,1)\)
+,如果它要翻转,那么一定会影响到 \((1,2)\) 和 \((2,1)\)
这样我们又要考虑它右边的,又要考虑它下面的,很麻烦
于是提出设想,如果第一行已经确定了,那是不是可以推出第二行?
答案是可以的
那么我们就可以枚举第一行的翻转状态,然后再逐行推结果
-时间复杂度 $O(nm2^m)$
+时间复杂度 \(O(nm2^m)\)
代码如下
#include <bits/stdc++.h>
using namespace std;
@@ -903,7 +917,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/29/luo-gu-p2882-usaco07mar-face-the-right-way-g-ti-jie/index.html b/2021/08/29/luo-gu-p2882-usaco07mar-face-the-right-way-g-ti-jie/index.html
index 7276566651..34aa4cc333 100644
--- a/2021/08/29/luo-gu-p2882-usaco07mar-face-the-right-way-g-ti-jie/index.html
+++ b/2021/08/29/luo-gu-p2882-usaco07mar-face-the-right-way-g-ti-jie/index.html
@@ -468,30 +468,53 @@ 洛谷P2882 [USACO07MAR]Face The
- 洛谷P2882 [USACO07MAR]Face The Right Way G 题解
题目链接:P2882 [USACO07MAR]Face The Right Way G
+ 洛谷P2882
+[USACO07MAR]Face The Right Way G 题解
+题目链接:P2882
+[USACO07MAR]Face The Right Way G
题意: 固定长度转向,求最小次数和相应的长度
(注:下文中的转向操作均以翻转一词替代 qwq)
-首先可以想到搜索,状态数 $2^n$ ,直接起飞
-那么我们来分析一下,可以看出对于一个位置,如果它被翻转了大于 $2$ 次,那这个一定不是必要的操作
-也就是说,一个位置只可能被翻转至多 $2$ 次
+首先可以想到搜索,状态数 \(2^n\)
+,直接起飞
+那么我们来分析一下,可以看出对于一个位置,如果它被翻转了大于 \(2\) 次,那这个一定不是必要的操作
+也就是说,一个位置只可能被翻转至多 \(2\) 次
而且通过观察样例,我们可以发现其实翻转的顺序和答案无关
-很容易想到我们要枚举 $k$ (转向的区间长度),然后进行检查
-怎么检查呢?我们要从左开始扫一遍,则至多翻转 $n-k+1$ 次,而每次翻转要 $k$ 个位置
-时间复杂度$O(n^3)$ ,显然 $n\le 5000$ 是过不了的
+很容易想到我们要枚举 \(k\)
+(转向的区间长度),然后进行检查
+怎么检查呢?我们要从左开始扫一遍,则至多翻转 \(n-k+1\) 次,而每次翻转要 \(k\) 个位置
+时间复杂度\(O(n^3)\) ,显然 \(n\le 5000\) 是过不了的
考虑优化翻转操作
-为了方便起见,我们可以把 B
的位置记为 1
,表示要翻转这个位置
-记 $f[i]$ 表示 $[i,i+k-1]$ 是否被翻转
-那么如果从左往右扫到一个位置 $i$ ,怎么判断这个位置要不要再翻转呢?
-我们可以发现,如果 $\sum_{j=i-k+1}^{i-1}f[j]$ 为奇数则该点需要翻转(这个东西自己想一想就知道了)
+为了方便起见,我们可以把 B
的位置记为
+1
,表示要翻转这个位置
+记 \(f[i]\) 表示 \([i,i+k-1]\) 是否被翻转
+那么如果从左往右扫到一个位置 \(i\)
+,怎么判断这个位置要不要再翻转呢?
+我们可以发现,如果 \(\sum_{j=i-k+1}^{i-1}f[j]\)
+为奇数则该点需要翻转(这个东西自己想一想就知道了)
那么我们怎么把这个东西求出来呢?
-我们看下一个位置 $i+1$ ,它要求的就是 $\sum_{j=i-k+2}^{i}f[j]$
-我们来拆一下可以得到 $\sum_{j=i-k+2}^{i}f[j] = \sum_{j=i-k+1}^{i-1}f[j]+f[i-1]-f[i-k+1]$
-有没有发现它可以从 $i$ 的位置转移过来?
-那么我们就可以 $O(1)$ 求解这个东西了
+我们看下一个位置 \(i+1\)
+,它要求的就是 \(\sum_{j=i-k+2}^{i}f[j]\)
+我们来拆一下可以得到 \(\sum_{j=i-k+2}^{i}f[j] =
+\sum_{j=i-k+1}^{i-1}f[j]+f[i-1]-f[i-k+1]\)
+有没有发现它可以从 \(i\)
+的位置转移过来?
+那么我们就可以 \(O(1)\)
+求解这个东西了
来算一下时间复杂度
-枚举 $k$ ,从左往右扫一遍,时间复杂度 $O(n^2)$
+枚举 \(k\)
+,从左往右扫一遍,时间复杂度 \(O(n^2)\)
代码如下
#include <bits/stdc++.h>
using namespace std;
@@ -894,7 +917,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/08/31/uva11524-values-whose-sum-is-0-ti-jie/index.html b/2021/08/31/uva11524-values-whose-sum-is-0-ti-jie/index.html
index 329e28bd55..4c163af70e 100644
--- a/2021/08/31/uva11524-values-whose-sum-is-0-ti-jie/index.html
+++ b/2021/08/31/uva11524-values-whose-sum-is-0-ti-jie/index.html
@@ -468,15 +468,26 @@ UVA11524 Values whose Sum is 0
- UVA11524 Values whose Sum is 0 题解
题目链接:UVA1152 4 Values whose Sum is 0
+ UVA11524 Values whose Sum
+is 0 题解
+题目链接:UVA1152
+4 Values whose Sum is 0
-题意:给定四个数组,求 $a_i+b_j+c_k+d_l = 0$ 的个数,多组数据+奇怪的输出格式
+题意:给定四个数组,求 \(a_i+b_j+c_k+d_l = 0\)
+的个数,多组数据+奇怪的输出格式
-解法一
$O(n^4)$ 枚举肯定过不去
-想一想,我们有必要在枚举 $i,j$ 的时候再去枚举 $k,l$ 吗?
-没有,因为 $k,l$ 的组合是有限的,只有这么多
-我们可以先 $O(n^2)$ 把所有 $c_k+d_l$ 枚举出来,然后排个序,就可以二分找出所有的 $-(a_i+b_j)$ 了
-时间复杂度 $O(n^2\log n)$
+解法一
+\(O(n^4)\) 枚举肯定过不去
+想一想,我们有必要在枚举 \(i,j\)
+的时候再去枚举 \(k,l\) 吗?
+没有,因为 \(k,l\)
+的组合是有限的,只有这么多
+我们可以先 \(O(n^2)\) 把所有 \(c_k+d_l\)
+枚举出来,然后排个序,就可以二分找出所有的 \(-(a_i+b_j)\) 了
+时间复杂度 \(O(n^2\log n)\)
代码如下
#include <bits/stdc++.h>
using namespace std;
@@ -526,22 +537,30 @@ while(Q--)solve();
return 0;
}
-解法二
通过刚才的分析,我们会惊奇的发现这个 $i,j$ 的组合其实是有限的!
-那么我们就可以预处理所有的 $a_i+b_j$ 和 $c_k+d_l$
+解法二
+通过刚才的分析,我们会惊奇的发现这个 \(i,j\) 的组合其实是有限的!
+那么我们就可以预处理所有的 \(a_i+b_j\) 和 \(c_k+d_l\)
然后用哈希表搞一搞,每次去暴力查表(注:查有没有相反数)
-时间复杂度 $O(n^2)$
+时间复杂度 \(O(n^2)\)
真的有这么简单吗?
我们来重新分析一下时间复杂度
-首先题目中说明给的数小于等于 $2^{28}$
-那么每个组合(和)小于$2^{29}$
+首先题目中说明给的数小于等于 \(2^{28}\)
+那么每个组合(和)小于\(2^{29}\)
如果用哈希表搞,理论上来说可以构造hack数据,特别是简单的哈希函数很容易hack
-为什么?因为如果哈希函数不是很好,那么至多在一个位置放了 $n^2$ 个数
-好耶时间复杂度退化为 $O(n^4)$ 直接TLE
-什么你要表内排序? $O(n^2\log n^2)$ + 可能较大常数 (来自本文作者的奇思妙想)
+为什么?因为如果哈希函数不是很好,那么至多在一个位置放了 \(n^2\) 个数
+好耶时间复杂度退化为 \(O(n^4)\) 直接TLE
+什么你要表内排序? \(O(n^2\log
+n^2)\) + 可能较大常数 (来自本文作者的奇思妙想)
所以其实理论上来说这个解法是行不通的
如果数据生成器能够分析提交的代码原理并构造hack数据,那么直接玩完
好在没有那么恶心这题,数据比较简单,手写哈希表也能过
-代码就不贴了,个人感觉实现很简单而且这解法不是很好 qwq
+代码就不贴了,个人感觉实现很简单而且这解法不是很好 qwq
@@ -895,7 +914,7 @@
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/09/05/luo-gu-p6186-noi-online-1-ti-gao-zu-mou-pao-pai-xu-ti-jie/index.html b/2021/09/05/luo-gu-p6186-noi-online-1-ti-gao-zu-mou-pao-pai-xu-ti-jie/index.html
index 88522f317b..100f039b37 100644
--- a/2021/09/05/luo-gu-p6186-noi-online-1-ti-gao-zu-mou-pao-pai-xu-ti-jie/index.html
+++ b/2021/09/05/luo-gu-p6186-noi-online-1-ti-gao-zu-mou-pao-pai-xu-ti-jie/index.html
@@ -472,26 +472,50 @@ 洛谷P6186 [NOI Online #1 提
- 洛谷P6186 [NOI Online #1 提高组] 冒泡排序 题解
题目链接:P6186 [NOI Online #1 提高组] 冒泡排序
+ 洛谷P6186 [NOI
+Online #1 提高组] 冒泡排序 题解
+题目链接:P6186 [NOI
+Online #1 提高组] 冒泡排序
-题意:支持交换 $a_x$ 和 $a_{x+1}$ 和查询 $k$ 轮冒泡排序后的逆序对个数, $a$ 数组是长度为 $n$ 的排列
+题意:支持交换 \(a_x\) 和 \(a_{x+1}\) 和查询 \(k\) 轮冒泡排序后的逆序对个数, \(a\) 数组是长度为 \(n\) 的排列
首先逆序对这个东西可以用树状数组搞定
题目给的是排列,因此求逆序对的伪代码如下
for i=1~n:
f[i]=i-sum(a[i])-1,add(a[i],1)
-当然如果不是排列会稍微烦一点,可以看下我的这篇文章
-设 $f[i]$ 表示在 $i$ 左侧比 $i$ 大的数的个数,那么逆序对就是 $\sum\limits_{i=1}^{n}{f[i]}$
-(注:这里的 $f[i]$ 就是上面伪代码中的 qwq)
-我们看看冒泡排序了 $k$ 次以后会发生什么事
-首先每次冒泡排序所有的 $f[i]$ 都会减少 $1$ 当且仅当 $f[i]>0$
-那么 $k$ 次之后所有小于等于 $k$ 的 $f[i]$ 都会变成 $0$
-因此我们只要每次就查询 $[k+1,n]$ 中 $f[i]$ 的个数就是答案了
+当然如果不是排列会稍微烦一点,可以看下我的这篇文章
+设 \(f[i]\) 表示在 \(i\) 左侧比 \(i\) 大的数的个数,那么逆序对就是 \(\sum\limits_{i=1}^{n}{f[i]}\)
+(注:这里的 \(f[i]\)
+就是上面伪代码中的 qwq)
+我们看看冒泡排序了 \(k\)
+次以后会发生什么事
+首先每次冒泡排序所有的 \(f[i]\)
+都会减少 \(1\) 当且仅当 \(f[i]>0\)
+那么 \(k\) 次之后所有小于等于 \(k\) 的 \(f[i]\) 都会变成 \(0\)
+因此我们只要每次就查询 \([k+1,n]\)
+中 \(f[i]\) 的个数就是答案了
这个我们可以用两个树状数组来维护答案
再看看这个交换操作,可能会影响到其他的答案
-那么怎么办呢?根据刚才我们发现的性质,我们可以先把它们两个的贡献减掉 $1$ ,然后按 $a_x$ 和 $a_{x+1}$ 的大小关系分别处理答案的变化,再把原先的贡献补回来就好了
+那么怎么办呢?根据刚才我们发现的性质,我们可以先把它们两个的贡献减掉
+\(1\) ,然后按 \(a_x\) 和 \(a_{x+1}\)
+的大小关系分别处理答案的变化,再把原先的贡献补回来就好了
代码实现有点烦,主要是有点乱
-代码如下
+代码如下
#include <bits/stdc++.h>
using namespace std;
#define int long long
@@ -925,7 +949,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/09/05/ni-xu-dui-de-san-chong-qiu-fa/index.html b/2021/09/05/ni-xu-dui-de-san-chong-qiu-fa/index.html
index f3f3a0be27..143f6b2422 100644
--- a/2021/09/05/ni-xu-dui-de-san-chong-qiu-fa/index.html
+++ b/2021/09/05/ni-xu-dui-de-san-chong-qiu-fa/index.html
@@ -472,10 +472,15 @@ 逆序对的三种求法
- 逆序对的三种求法
一、什么是逆序对?
对于给定的一段正整数序列,逆序对就是序列中 $a_i>a_j$ 且 $i<j$ 的有序对
+ 逆序对的三种求法
+一、什么是逆序对?
+对于给定的一段正整数序列,逆序对就是序列中 \(a_i>a_j\) 且 \(i<j\) 的有序对
-
-二、怎么求逆序对
1.归并排序解法
归并排序可以很好的解决逆序对问题
+二、怎么求逆序对
+1.归并排序解法
+归并排序可以很好的解决逆序对问题
我们只需要计算跨越分界线的贡献,并保证分界线两端的答案已被统计,显然根据归并的性质是可以保证的
对于跨分界线的贡献计算很简单,只要在归并排序上加一句就行了
这个东西请您自己理解,没什么好讲的 qwq
@@ -530,13 +535,17 @@ return 0;
}
-
-2.树状数组解法
有人要说了,你这文章写的太烂了 好吧我承认我只是想讲这个方法,稍微铺垫一下…
+2.树状数组解法
+有人要说了,你这文章写的太烂了
+好吧我承认我只是想讲这个方法,稍微铺垫一下...
那么树状数组跟逆序对有什么关系?
我们可以观察每一个元素,假设它有属性idx[i]
表示在原数组中的位置,b[i]
表示它的大小
我们把元素按照b[i]
降序排序,然后从大到小取出这些元素并++f[idx[i]]
这样有什么性质呢?显然越小的数越晚标记
-或者说,$\sum\limits_{j=1}^{\text{idx[i]-1}}{f[j]}$ 就是 $ia_j$ 的个数
+或者说,\(\sum\limits_{j=1}^{\text{idx[i]-1}}{f[j]}\)
+就是 \(i<j\) 且 \(a_i>a_j\) 的个数
这个东西一看就是树状数组处理
代码如下
#include <bits/stdc++.h>
@@ -599,15 +608,16 @@ return 0;
}
-
-3.动态开点权值线段树解法
有点类似树状数组的解法,维护区间和
-我们可以基于值域 $[1,1e9]$ 建一棵线段树
+3.动态开点权值线段树解法
+有点类似树状数组的解法,维护区间和
+我们可以基于值域 \([1,1e9]\)
+建一棵线段树
显然不能把所有的值都建结点,不然就MLE了
怎么办呢?我们会发现,其实每次要查的其实就几个点
那么就可以使用动态开点的思想,开一棵残缺的线段树,只保留我们会用到的结点
其他的结点就是虚拟结点啦!根本不用管,查到的时候返回0就行了
这题用这个解法有点容易被卡(? 而且有点大材小用
-因此写的权值线段树可能有点小区别(因为实在太简单了…)
+因此写的权值线段树可能有点小区别(因为实在太简单了...)
代码如下
#include <bits/stdc++.h>
using namespace std;
@@ -1028,7 +1038,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/09/05/qian-tan-shu-zhuang-shu-zu-qu-jian-xiu-gai-qu-jian-cha-xun/index.html b/2021/09/05/qian-tan-shu-zhuang-shu-zu-qu-jian-xiu-gai-qu-jian-cha-xun/index.html
index a63eb857af..a548b55cdd 100644
--- a/2021/09/05/qian-tan-shu-zhuang-shu-zu-qu-jian-xiu-gai-qu-jian-cha-xun/index.html
+++ b/2021/09/05/qian-tan-shu-zhuang-shu-zu-qu-jian-xiu-gai-qu-jian-cha-xun/index.html
@@ -468,10 +468,17 @@ 浅谈树状数组 区间修改&
- 浅谈树状数组 区间修改&区间查询
一、区间修改,单点查询
首先我们可以先来想一下,树状数组的区间修改,单点查询怎么弄
+ 浅谈树状数组
+区间修改&区间查询
+一、区间修改,单点查询
+首先我们可以先来想一下,树状数组的区间修改,单点查询怎么弄
我们可以维护一个关于原数组的差分数组
-很容易知道 $a_i=\sum\limits_{j=1}^{i}b_j$,其中 $b$ 为差分数组
-那么区间修改时和差分的差不多,就是add(l,x),add(r+1,-x)
表示 $[l,r]$ 加上 $x$
+很容易知道 \(a_i=\sum\limits_{j=1}^{i}b_j\),其中 \(b\) 为差分数组
+那么区间修改时和差分的差不多,就是add(l,x),add(r+1,-x)
表示
+\([l,r]\) 加上 \(x\)
单点查询根据上面的结论,就是sum(i)
区间修改,单点查询的代码如下(注:这个不是LOJ132的代码 qwq)
#include <bits/stdc++.h>
@@ -526,17 +533,23 @@ }
return 0;
}
-二、区间修改,区间查询
模板题:LOJ132
+二、区间修改,区间查询
+模板题:LOJ132
那么区间修改,区间查询怎么搞呢?
-我们先假设查询的区间为 $[1,r]$ ,因为 $[l,r]$ 的区间和就是 $[1,r]$ 的和减去 $[1,l]$ 的和
-那么
-那么我们只需要用两个树状数组分别维护左右两边的式子就行了
+\text{ans} &= \sum\limits_{i=1}^{r}a_i
+\\&= \sum\limits_{i=1}^{r}\sum\limits_{j=1}^{i}b_j
+\\&=\sum\limits_{i=1}^{r}{b_i \times (r-i+1)}
+\\&=\sum\limits_{i=1}^{r}{b_i\times (r+1)} -
+\sum\limits_{i=1}^{r}{b_i\times i}
+\end{aligned}
+\] 那么我们只需要用两个树状数组分别维护左右两边的式子就行了
代码如下
#include <bits/stdc++.h>
using namespace std;
@@ -956,7 +969,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/09/11/loj10050-the-xor-largest-pair-ti-jie/index.html b/2021/09/11/loj10050-the-xor-largest-pair-ti-jie/index.html
index a151133d4f..7ae1a6bfde 100644
--- a/2021/09/11/loj10050-the-xor-largest-pair-ti-jie/index.html
+++ b/2021/09/11/loj10050-the-xor-largest-pair-ti-jie/index.html
@@ -476,15 +476,24 @@ LOJ10050 The XOR Largest Pair
- LOJ10050 The XOR Largest Pair
题目链接:LOJ10050 The XOR Largest Pair
+ LOJ10050 The XOR Largest
+Pair
+题目链接:LOJ10050 The XOR Largest
+Pair
-题意:给定 $n$ 个非负整数,任取两个数,使得这两个数的异或结果最大,求这个最大值
+题意:给定 \(n\)
+个非负整数,任取两个数,使得这两个数的异或结果最大,求这个最大值
肯定不是朴素枚举啊qwq
直接用Trie存每个数的二进制就可以了(注:把二进制看作字符串)
-根据异或的定义,对于每个 $a_j$ ,我们从最高位开始,尽可能取与 $a_i$ 这一位相反的那一条路,一定可以得到最大值
-至于最高位,我们只要不够的补 $0$ 即可
-因为它题目中说了每个数最大不大于 $2^{31}-1$ ,那么我们直接保存为30位二进制即可
+根据异或的定义,对于每个 \(a_j\)
+,我们从最高位开始,尽可能取与 \(a_i\)
+这一位相反的那一条路,一定可以得到最大值
+至于最高位,我们只要不够的补 \(0\)
+即可
+因为它题目中说了每个数最大不大于 \(2^{31}-1\)
+,那么我们直接保存为30位二进制即可
代码如下
#include <bits/stdc++.h>
using namespace std;
@@ -912,7 +921,7 @@
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/09/18/qian-tan-fen-kuai-qu-jian-zhong-shu/index.html b/2021/09/18/qian-tan-fen-kuai-qu-jian-zhong-shu/index.html
index 7d7dfb59ce..4d295ebbe0 100644
--- a/2021/09/18/qian-tan-fen-kuai-qu-jian-zhong-shu/index.html
+++ b/2021/09/18/qian-tan-fen-kuai-qu-jian-zhong-shu/index.html
@@ -472,25 +472,37 @@ 浅谈分块 区间众数
- 浅谈分块 区间众数
前言
分块大法好(
+ 浅谈分块 区间众数
+前言
+分块大法好(
本文直接讲例题了 qwq
-
-P4168 [Violet]蒲公英
题目链接:P4168 [Violet]蒲公英
+P4168 [Violet]蒲公英
+题目链接:P4168
+[Violet]蒲公英
题意: 找到区间内编号最小的众数,强制在线
-解法一
直接分块
-设块长为 $len$ ,块的总数为 $t$ 个
+解法一
+直接分块
+设块长为 \(len\) ,块的总数为 \(t\) 个
我们先预处理出所有以块的端点为端点的区间众数和众数的出现次数
或者说就是把每个连续块组成的区间都算出编号最小众数和它的出现次数
别忘了离散化,不然MLE咯
-总共有 $t^2$ 个这样的区间,每次处理 $O(n)$ ,则预处理时间复杂度为 $O(nt^2)$
+总共有 \(t^2\)
+个这样的区间,每次处理 \(O(n)\)
+,则预处理时间复杂度为 \(O(nt^2)\)
暴力查询时可以在预处理过的数组基础上临时更新数组,以统计答案,再复原数组
-总时间复杂度 $O(nt^2+mn/t)$
-假设 $m$ 和 $n$ 数量级相同,解 $nt^2=mn/t$,$t \approx \sqrt[3]{n}$
-则时间复杂度可以控制在 $O(n^{5/3})$ 内
-空间复杂度比较大,$O(nt^2)$ (注:预处理所需)
+总时间复杂度 \(O(nt^2+mn/t)\)
+假设 \(m\) 和 \(n\) 数量级相同,解 \(nt^2=mn/t\),\(t
+\approx \sqrt[3]{n}\)
+则时间复杂度可以控制在 \(O(n^{5/3})\) 内
+空间复杂度比较大,\(O(nt^2)\)
+(注:预处理所需)
代码如下
#include <bits/stdc++.h>
using namespace std;
@@ -596,7 +608,8 @@ }
return 0;
}
-解法二
还是分块,只不过维护的东西不一样
+解法二
+还是分块,只不过维护的东西不一样
我们发现,解法一的空间就多在了次数统计这个东西上
次数统计?不是可以二分吗?
对每个数值建个vector保存它出现的下标,出现次数就是upper_bd-lower_bd
@@ -604,10 +617,14 @@ 暴力查询结果和众数的结果比一下就行了
别忘了离散化哦
有点时间换空间的感觉,但是还是很快
-时间复杂度 $O(nt+mn/t\times \log n)$
-假设 $m$ 和 $n$ 数量级相同,还是解方程,$t \approx \sqrt{n\log n}$
-则时间复杂度可控制在 $O(n\sqrt{n\log n})$
-空间复杂度 $O(t^2)$ ,不错
+时间复杂度 \(O(nt+mn/t\times \log
+n)\)
+假设 \(m\) 和 \(n\) 数量级相同,还是解方程,\(t \approx \sqrt{n\log n}\)
+则时间复杂度可控制在 \(O(n\sqrt{n\log
+n})\)
+空间复杂度 \(O(t^2)\) ,不错
代码如下
#include <bits/stdc++.h>
using namespace std;
@@ -721,22 +738,38 @@ 然后我们就想到
如果只需要知道众数的出现次数,有没有什么好的办法呢?
-
-[Ynoi2019 模拟赛] Yuno loves sqrt technology III
题目链接:[Ynoi2019 模拟赛] Yuno loves sqrt technology III
+[Ynoi2019
+模拟赛] Yuno loves sqrt technology III
+题目链接:[Ynoi2019
+模拟赛] Yuno loves sqrt technology III
题意:区间众数出现次数,强制在线
-类似于上一题的解法二,这题 $t=\sqrt{n}$ 即可
+类似于上一题的解法二,这题 \(t=\sqrt{n}\) 即可
不同的是,我们要预处理出连续块的众数出现次数
然后还是每个数值建一个vector,统计出现的下标
-再记录每个存的下标在vector中的下标 $ax_i$
-显然非暴力查询的区域,答案 $res=f[x][y]$
-因为边界数最多对答案有 $2\sqrt{n}$ 的贡献
-所以暴力查询时,对于每个左侧元素 $k$ ,我们只要找到 $k$ 的vector中 $ax_k+res$ 的位置的元素,看它是不是小于 $r$ ,如果小于 $r$ ,说明它一定更接近最终答案且在该区间内,更新 $res$
-对于每个右侧元素 $k$ ,我们只要找到 $k$ 的vector中 $ax_k-res$ 的位置的元素,看它是不是大于 $l$ ,原理同上
-最终答案即为 $res$
-时间复杂度 $O((n+m)\sqrt{n})$
-空间复杂度 $O(n)$
+再记录每个存的下标在vector中的下标 \(ax_i\)
+显然非暴力查询的区域,答案 \(res=f[x][y]\)
+因为边界数最多对答案有 \(2\sqrt{n}\)
+的贡献
+所以暴力查询时,对于每个左侧元素 \(k\) ,我们只要找到 \(k\) 的vector中 \(ax_k+res\) 的位置的元素,看它是不是小于
+\(r\) ,如果小于 \(r\)
+,说明它一定更接近最终答案且在该区间内,更新 \(res\)
+对于每个右侧元素 \(k\)
+,我们只要找到 \(k\) 的vector中 \(ax_k-res\) 的位置的元素,看它是不是大于
+\(l\) ,原理同上
+最终答案即为 \(res\)
+时间复杂度 \(O((n+m)\sqrt{n})\)
+空间复杂度 \(O(n)\)
代码如下
#include <bits/stdc++.h>
using namespace std;
@@ -843,10 +876,8 @@ return 0;
}
-
-
-
-总结
本文简单讲了下区间众数的分块解法
+总结
+本文简单讲了下区间众数的分块解法
@@ -1212,7 +1243,7 @@ 总结
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/09/23/jun-zhi-bu-deng-shi-ji-qi-zheng-ming/index.html b/2021/09/23/jun-zhi-bu-deng-shi-ji-qi-zheng-ming/index.html
index 1d8d8d6e5c..7e025d7293 100644
--- a/2021/09/23/jun-zhi-bu-deng-shi-ji-qi-zheng-ming/index.html
+++ b/2021/09/23/jun-zhi-bu-deng-shi-ji-qi-zheng-ming/index.html
@@ -468,47 +468,78 @@ 均值不等式及其证明
- 均值不等式及其证明
前言
还有很多证明方法,等我学了再写 qwq
+ 均值不等式及其证明
+前言
+还有很多证明方法,等我学了再写 qwq
-
-均值不等式
引理1:若 $a\ge 0,b\ge 0$ ,则 $(a+b)^n\ge a^n+na^{n-1}b,n\in \Z_+$
+均值不等式
+引理1:若 \(a\ge 0,b\ge
+0\) ,则 \((a+b)^n\ge
+a^n+na^{n-1}b,n\in \Z_+\)
直接二项式展开,证明略
-
-命题1:求证 $\dfrac{\sum_{i=1}^{n}a_i}{n}\ge \sqrt[n]{\prod_{i=1}^na_i}$
-数学归纳法证明:原命题等价于 $\left(\dfrac{\sum_{i=1}^{n}a_i}{n}\right)^n \ge \prod\limits_{i=1}^{n}a_i$
-设 $n=k$ 时原不等式成立
-不妨假设 $\forall i<j,a_i<a_j$
-记 $S_n = \sum\limits_{i=1}^{n}a_i$
-当 $n=k+1$ 时,原不等式为
-$\left(\dfrac{S_k+a_{k+1}}{k+1}\right)^{k+1} \ge \prod\limits_{i=1}^{k+1}a_i$
-$\left(\dfrac{S_k}{k}+\dfrac{ka_{k+1}-S_k}{k(k+1)}\right)^{k+1}\ge \prod\limits_{i=1}^{k+1}a_i$
-由引理1可知 $\text{LHS}\ge \left(\dfrac{S_k}{k}\right)^{k+1}+(k+1)\left(\dfrac{S_k}{k}\right)^k\dfrac{ka_{k+1}-S_k}{k(k+1)}$
-$\because a_{k+1}=\max\limits_{1\le i \le k+1}\{a_i\}$
-$\therefore ka_{k+1}-S_k\ge 0$
-故 $\text{LHS} \ge \left(\dfrac{S_k}{k}\right)^{k}\times a_{k+1} \ge \text{RHS}$
+命题1:求证 \(\dfrac{\sum_{i=1}^{n}a_i}{n}\ge
+\sqrt[n]{\prod_{i=1}^na_i}\)
+数学归纳法证明:原命题等价于 \(\left(\dfrac{\sum_{i=1}^{n}a_i}{n}\right)^n \ge
+\prod\limits_{i=1}^{n}a_i\)
+设 \(n=k\) 时原不等式成立
+不妨假设 \(\forall
+i<j,a_i<a_j\)
+记 \(S_n =
+\sum\limits_{i=1}^{n}a_i\)
+当 \(n=k+1\) 时,原不等式为
+\(\left(\dfrac{S_k+a_{k+1}}{k+1}\right)^{k+1} \ge
+\prod\limits_{i=1}^{k+1}a_i\)
+\(\left(\dfrac{S_k}{k}+\dfrac{ka_{k+1}-S_k}{k(k+1)}\right)^{k+1}\ge
+\prod\limits_{i=1}^{k+1}a_i\)
+由引理1可知 \(\text{LHS}\ge
+\left(\dfrac{S_k}{k}\right)^{k+1}+(k+1)\left(\dfrac{S_k}{k}\right)^k\dfrac{ka_{k+1}-S_k}{k(k+1)}\)
+\(\because a_{k+1}=\max\limits_{1\le i \le
+k+1}\{a_i\}\)
+\(\therefore ka_{k+1}-S_k\ge 0\)
+故 \(\text{LHS} \ge
+\left(\dfrac{S_k}{k}\right)^{k}\times a_{k+1} \ge
+\text{RHS}\)
故原命题得证
-
-命题2:求证 $\sqrt{\dfrac{\sum_{i=1}^{n}a_i^2}{n}} \ge \dfrac{\sum_{i=1}^{n}a_i}{n}$
-证明:令 $c = \dfrac{\sum_{i=1}^{n}a_i}{n},x_i=a_i-c$
-则 $\sum_{i=1}^{n}a_i = \sum_{i=1}^{n}x_i+nc = \sum_{i=1}^{n}x_i+\sum_{i=1}^{n}a_i$
-$\therefore \sum_{i=1}^{n}x_i = 0$
-$\therefore \text{LHS}=\sqrt{\dfrac{\sum_{i=1}^{n}\left(x_i+c\right)^2}{n}}$
-$= \sqrt{c^2+\dfrac{\sum_{i=1}^{n}x_i^2}{n}} \ge \sqrt{c^2} = \text{RHS}$
+命题2:求证 \(\sqrt{\dfrac{\sum_{i=1}^{n}a_i^2}{n}} \ge
+\dfrac{\sum_{i=1}^{n}a_i}{n}\)
+证明:令 \(c =
+\dfrac{\sum_{i=1}^{n}a_i}{n},x_i=a_i-c\)
+则 \(\sum_{i=1}^{n}a_i =
+\sum_{i=1}^{n}x_i+nc = \sum_{i=1}^{n}x_i+\sum_{i=1}^{n}a_i\)
+\(\therefore \sum_{i=1}^{n}x_i =
+0\)
+\(\therefore
+\text{LHS}=\sqrt{\dfrac{\sum_{i=1}^{n}\left(x_i+c\right)^2}{n}}\)
+\(=
+\sqrt{c^2+\dfrac{\sum_{i=1}^{n}x_i^2}{n}} \ge \sqrt{c^2} =
+\text{RHS}\)
故原命题得证
-
-命题3:求证 $\sqrt[n]{\prod_{i=1}^na_i} \ge \dfrac{n}{\sum_{i=1}^{n}a_i^{-1}}$
+命题3:求证 \(\sqrt[n]{\prod_{i=1}^na_i} \ge
+\dfrac{n}{\sum_{i=1}^{n}a_i^{-1}}\)
证明:由命题1可知
-$\dfrac{\sum_{i=1}^{n}a_i^{-1}}{n} \ge \sqrt[n]{\prod_{i=1}^{n}a_i^{-1}} = \dfrac{1}{\sqrt[n]{\prod_{i=1}^{n}a_i}}$
-$\therefore \sqrt[n]{\prod_{i=1}^{n}a_i} \ge \dfrac{n}{\sum_{i=1}^{n}a_i^{-1}}$
+\(\dfrac{\sum_{i=1}^{n}a_i^{-1}}{n} \ge
+\sqrt[n]{\prod_{i=1}^{n}a_i^{-1}} =
+\dfrac{1}{\sqrt[n]{\prod_{i=1}^{n}a_i}}\)
+\(\therefore \sqrt[n]{\prod_{i=1}^{n}a_i}
+\ge \dfrac{n}{\sum_{i=1}^{n}a_i^{-1}}\)
故原命题得证
-
-$\therefore$ 综上所述,可得结论(均值不等式)
-$\dfrac{n}{\sum_{i=1}^{n}a_i^{-1}} \le \sqrt[n]{\prod_{i=1}^{n}a_i} \le \dfrac{\sum_{i=1}^{n}a_i}{n} \le \sqrt{\dfrac{\sum_{i=1}^{n}a_i^2}{n}}$
-当且仅当 $a_1=a_2=…=a_n$ 时等号成立
+\(\therefore\)
+综上所述,可得结论(均值不等式)
+\(\dfrac{n}{\sum_{i=1}^{n}a_i^{-1}} \le
+\sqrt[n]{\prod_{i=1}^{n}a_i} \le \dfrac{\sum_{i=1}^{n}a_i}{n} \le
+\sqrt{\dfrac{\sum_{i=1}^{n}a_i^2}{n}}\)
+当且仅当 \(a_1=a_2=...=a_n\)
+时等号成立
也就是
调和平均数不超过几何平均数不超过算术平均数不超过平方平均数
@@ -868,7 +899,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/10/03/ubuntu-xie-zai-fcitx-shu-ru-fa/index.html b/2021/10/03/ubuntu-xie-zai-fcitx-shu-ru-fa/index.html
index 026caea2af..3a7f4e6de5 100644
--- a/2021/10/03/ubuntu-xie-zai-fcitx-shu-ru-fa/index.html
+++ b/2021/10/03/ubuntu-xie-zai-fcitx-shu-ru-fa/index.html
@@ -468,7 +468,8 @@ ubuntu 卸载fcitx输入法
- ubuntu 卸载fcitx输入法
我又来水文章了
+ ubuntu 卸载fcitx输入法
+我又来水文章了
打开终端
输入
sudo apt-get remove fcitx
@@ -478,7 +479,7 @@ 如果您原来使用的就是fcitx输入法,那再输入一句
sudo reboot
重启以后默认就是ibus输入法啦!
-ibus大法好!
+ibus大法好!
@@ -825,7 +826,7 @@
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/10/10/luo-gu-p1486-noi2004-yu-men-de-chu-na-yuan-ti-jie/index.html b/2021/10/10/luo-gu-p1486-noi2004-yu-men-de-chu-na-yuan-ti-jie/index.html
index 7917d8b2eb..40f182aa03 100644
--- a/2021/10/10/luo-gu-p1486-noi2004-yu-men-de-chu-na-yuan-ti-jie/index.html
+++ b/2021/10/10/luo-gu-p1486-noi2004-yu-men-de-chu-na-yuan-ti-jie/index.html
@@ -468,30 +468,47 @@ 洛谷P1486 [NOI2004] 郁闷的
- 洛谷P1486 [NOI2004] 郁闷的出纳员 题解
+ 洛谷P1486 [NOI2004]
+郁闷的出纳员 题解
+
题意:维护一个数据结构,支持
-
-- 插入一个大小为 $k$ 的值,小于下界时不插入
-- 所有元素加上 $k$
-- 所有元素减去 $k$ ,小于下界的删除
-- 查询所有元素中的 $k$ 大值
+
+- 插入一个大小为 \(k\)
+的值,小于下界时不插入
+- 所有元素加上 \(k\)
+- 所有元素减去 \(k\)
+,小于下界的删除
+- 查询所有元素中的 \(k\) 大值
最后输出删除的元素个数(两元素相等算两个)
可以用平衡树来解决本题
听说正解是splay,不过我来讲一种替罪羊树的写法
-我们可以维护一个 $d$ ,表示每次加减的变化
-这样每个元素就可以用 $x+d$ 的形式表示了
-在平衡树里放原来的数减去插入时的 $d$ ,即 $k-d$
+我们可以维护一个 \(d\)
+,表示每次加减的变化
+这样每个元素就可以用 \(x+d\)
+的形式表示了
+在平衡树里放原来的数减去插入时的 \(d\) ,即 \(k-d\)
这样输出的时候就是正常的数了
那小于下界的怎么搞呢?
根据替罪羊树的性质,我们可以直接把整课树重构
-在Flatten
操作时判断当前元素 $x$ 加上 $d$ 是否超过下界,且存在,否则就直接不管它了
-$k$ 大值直接查 $num1-k+1$ 小值就好了
-这个 $num1$ 表示每次操作后的剩余结点数(两元素相等算两个)
-因为它最后还有个询问删除的,再记录一下总插入结点数(两元素相等算两个) $num2$ ,答案就是 $num2-num1$
-这样整个算法的时间复杂度为 $O(n\log n)$
+在Flatten
操作时判断当前元素 \(x\) 加上 \(d\)
+是否超过下界,且存在,否则就直接不管它了
+\(k\) 大值直接查 \(num1-k+1\) 小值就好了
+这个 \(num1\)
+表示每次操作后的剩余结点数(两元素相等算两个)
+因为它最后还有个询问删除的,再记录一下总插入结点数(两元素相等算两个)
+\(num2\) ,答案就是 \(num2-num1\)
+这样整个算法的时间复杂度为 \(O(n\log
+n)\)
本题在luogu上的数据是windows下造的,所以还要注意换行符是\r\n
,不是linux下的\n
代码如下
#include <bits/stdc++.h>
@@ -1007,7 +1024,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/11/12/ubuntu-wps-zi-ti-que-shi-jie-jue-fang-fa/index.html b/2021/11/12/ubuntu-wps-zi-ti-que-shi-jie-jue-fang-fa/index.html
index a962f59f52..efbbd8fbed 100644
--- a/2021/11/12/ubuntu-wps-zi-ti-que-shi-jie-jue-fang-fa/index.html
+++ b/2021/11/12/ubuntu-wps-zi-ti-que-shi-jie-jue-fang-fa/index.html
@@ -472,19 +472,28 @@ ubuntu WPS字体缺失 解决方
- ubuntu WPS字体缺失 解决方法
前言
请保证您还有一台windows
+ ubuntu WPS字体缺失 解决方法
+前言
+请保证您还有一台windows
-
-一、在windows复制字体
首先在windows下载好WPS,然后找到字体,复制
-
-二、复制到ubuntu
我的ubuntu上装了WPS2019,目录在/usr/share/fonts/wps-office
+一、在windows复制字体
+首先在windows下载好WPS,然后找到字体,复制
+
+二、复制到ubuntu
+我的ubuntu上装了WPS2019,目录在/usr/share/fonts/wps-office
因此只要在终端输入
sudo cp ./* /usr/share/fonts/wps-office
就好了
-三、重启WPS
关掉再打开
+三、重启WPS
+关掉再打开
-
-总结
从windows上复制到ubuntu
+总结
+从windows上复制到ubuntu
@@ -842,7 +851,7 @@ 总结
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/11/13/ubuntu-gimp-zi-ti-xian-shi-yi-chang-jie-jue-fang-fa/index.html b/2021/11/13/ubuntu-gimp-zi-ti-xian-shi-yi-chang-jie-jue-fang-fa/index.html
index d4e1bf8d2c..a0598d13e2 100644
--- a/2021/11/13/ubuntu-gimp-zi-ti-xian-shi-yi-chang-jie-jue-fang-fa/index.html
+++ b/2021/11/13/ubuntu-gimp-zi-ti-xian-shi-yi-chang-jie-jue-fang-fa/index.html
@@ -468,7 +468,9 @@ ubuntu GIMP 字体显示异常
- ubuntu GIMP 字体显示异常 解决方法
今天用GIMP的时候发现字体出了问题
+ ubuntu GIMP 字体显示异常
+解决方法
+今天用GIMP的时候发现字体出了问题
报错如下
Fontconfig warning: FcPattern object width does not accept value [75 100)
/snap/gimp/380/usr/bin/gimp: Gimp-Text-严重: gimp_font_factory_load_names: assertion 'fontset' failed
@@ -855,7 +857,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/11/19/windows-she-zhi-xu-yao-guan-li-yuan-quan-xian-shi-shu-ru-mi-ma-cai-neng-cao-zuo/index.html b/2021/11/19/windows-she-zhi-xu-yao-guan-li-yuan-quan-xian-shi-shu-ru-mi-ma-cai-neng-cao-zuo/index.html
index 98ecc5140b..80435b205f 100644
--- a/2021/11/19/windows-she-zhi-xu-yao-guan-li-yuan-quan-xian-shi-shu-ru-mi-ma-cai-neng-cao-zuo/index.html
+++ b/2021/11/19/windows-she-zhi-xu-yao-guan-li-yuan-quan-xian-shi-shu-ru-mi-ma-cai-neng-cao-zuo/index.html
@@ -468,14 +468,18 @@ windows 设置需要管理员权
- windows 设置需要管理员权限时输入密码才能操作
步骤如下
+ windows
+设置需要管理员权限时输入密码才能操作
+步骤如下
首先 win+r
,输入regedit
打开注册表编辑器
然后找到
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\ConsentPromptBehaviorAdmin
将值修改为 3 (十六进制)
不明白的话可以看看下面的图
-
-
+
+
然后尝试打开一下任务管理器
就发现需要PIN啦!
@@ -831,7 +835,7 @@
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/11/20/windows-matlab-r2020b-an-zhuang-jiao-cheng/index.html b/2021/11/20/windows-matlab-r2020b-an-zhuang-jiao-cheng/index.html
index e8a4296c81..e7b6c4cd7d 100644
--- a/2021/11/20/windows-matlab-r2020b-an-zhuang-jiao-cheng/index.html
+++ b/2021/11/20/windows-matlab-r2020b-an-zhuang-jiao-cheng/index.html
@@ -468,62 +468,131 @@ windows Matlab R2020b 安装教
- windows Matlab R2020b 安装教程
前言
本文其实是我自己在安装过程中截图的,现在搞定了整理出来给大家参考一下
+ windows Matlab R2020b
+安装教程
+前言
+本文其实是我自己在安装过程中截图的,现在搞定了整理出来给大家参考一下
使用的是matlab R2020b
如果本文有什么错误或对本文有什么问题,欢迎留言 qwq
要是图挂了可以直接私信我,只要我还在
-
-一、下载文件
下载好文件,我就放张图
+一、下载文件
+下载好文件,我就放张图
要尽量支持正版哦,这是正版软件下载链接
-https://ww2.mathworks.cn/products/matlab.html
-
+https://ww2.mathworks.cn/products/matlab.html
+
-
-二、解压文件
选中上面的那些.rar
文件,然后解压(我建议用360压缩,挺好用的,不是打广告qwq)
-
+二、解压文件
+选中上面的那些.rar
文件,然后解压(我建议用360压缩,挺好用的,不是打广告qwq)
+
然后稍微整理一下,留下有用的,如下
注:第二个文件夹就是解压后的东西,我不放心就先留着了
-
+
-
-三、开始安装
打开.iso
的文件,然后双击setup文件
-
+三、开始安装
+打开.iso
的文件,然后双击setup文件
+
-
-
-四、安装细节
+四、安装细节
+
安装密钥是
09806-07443-53955-64350-21751-41297
-
+
许可证就选择刚刚下载的文件夹里...\crack\license_standalone.lic
-
+
强烈建议安装在其他的盘,比如D盘
-
-跳过几个不用设置的步骤….
+
+跳过几个不用设置的步骤....
开始安装,安装时间会比较长
-
+
-
-
-五、激活
安装好的不可以直接用,要先激活
+五、激活
+安装好的不可以直接用,要先激活
就两个步骤,很简单
首先把crack文件夹下的license.lic
复制到安装目录下的license文件夹中
-然后把那个dll文件复制下,直接看图吧…
-
-
-
+然后把那个dll文件复制下,直接看图吧...
+
+
+
-
-六、运行
它默认不会把快捷方式放桌面上,手动弄一下就好了
+六、运行
+它默认不会把快捷方式放桌面上,手动弄一下就好了
位置在R2020b\bin
里
运行后可以看到下图所示
-
+
-
-总结
安装安装安装,没了qwq
-
参考文献
-[1] 《最新MATLAB R2020b超详细安装教程(附完整安装文件)》
+总结
+安装安装安装,没了qwq
+
+参考文献
+
@@ -881,7 +950,7 @@ 总结
站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/11/21/ubuntu-he-windows-chrome-liu-lan-qi-guan-bi-what-s-new-ye-mian/index.html b/2021/11/21/ubuntu-he-windows-chrome-liu-lan-qi-guan-bi-what-s-new-ye-mian/index.html
index 1ad279b1e6..a7eeec1b53 100644
--- a/2021/11/21/ubuntu-he-windows-chrome-liu-lan-qi-guan-bi-what-s-new-ye-mian/index.html
+++ b/2021/11/21/ubuntu-he-windows-chrome-liu-lan-qi-guan-bi-what-s-new-ye-mian/index.html
@@ -472,9 +472,12 @@ ubuntu和windows chrome浏览器
- ubuntu和windows chrome浏览器 关闭what‘s new页面
在搜索栏里输入chrome://flags
+ ubuntu和windows
+chrome浏览器 关闭what‘s new页面
+在搜索栏里输入chrome://flags
修改操作如下
-
+
@@ -832,7 +835,7 @@ 站点总字数: 320.5k 字
+ class="white-color">322.9k 字
diff --git a/2021/11/24/luo-gu-p2633-count-on-a-tree-ti-jie/index.html b/2021/11/24/luo-gu-p2633-count-on-a-tree-ti-jie/index.html
index 39fe95b0e4..80b0958639 100644
--- a/2021/11/24/luo-gu-p2633-count-on-a-tree-ti-jie/index.html
+++ b/2021/11/24/luo-gu-p2633-count-on-a-tree-ti-jie/index.html
@@ -468,23 +468,31 @@ 洛谷P2633 Count on a tree 题