感谢这个博客,
感谢没有冒号的拍拍二次元人们,
一起撑过了2020这艰难的一年的大部分时间。
2020-03 ~ 2020-11
奶茶铺结束营业咯((
新店就开在隔壁:gyrojeff.top
老的烦心事就不再迁移了
过段时间把技术文章慢慢迁…咕咕咕///
感谢这个博客,
感谢没有冒号的拍拍二次元人们,
一起撑过了2020这艰难的一年的大部分时间。
2020-03 ~ 2020-11
奶茶铺结束营业咯((
新店就开在隔壁:gyrojeff.top
老的烦心事就不再迁移了
过段时间把技术文章慢慢迁…咕咕咕///
拉取官方最新的MySQL镜像:
1 | docker pull mysql:latest |
运行:
1 | docker run --name <name> -e MY_ROOT_PASSWORD=<root_password> -p <port>:3306 -d mysql:<tag> |
其中:
<name>
填入容器的命名<root_password>
填入数据库root
用户的密码<port>
填入想要对外映射的端口<tag>
是镜像的版本号,建议填latest
传送门:https://hub.docker.com/r/library/mysql/
查看所有Docker:
1 | sudo docker ps -a |
删除一个容器:
1 | sudo docker rm <name> |
停止:
1 | sudo docker stop <name> |
暂停:
1 | sudo docker pause <name> |
重启:
1 | sudo docker restart <name> |
让容器执行命令:
1 | sudo docker exec -it <name> <exec> |
其中:
<name>
是容器名称<exec>
是命令-it
的官方解释:
1 | -d, --detach Detached mode: run command in the background |
所以进入容器其实可以直接 (如果对方有/bin/bash
):
1 | docker exec -it <name> /bin/bash |
其余的请直接查看help:
1 | sudo docker --help |
1 | sudo docker <exec> --help |
1 | sudo apt-get remove docker docker-engine docker.io containerd runc |
安装apt依赖包:
1 | sudo apt-get install \ |
添加官方GPG密钥:
1 | curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add - |
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 通过搜索指纹的后8个字符,验证您现在是否拥有带有指纹的密钥。
1 | $ sudo apt-key fingerprint 0EBFCD88 |
使用以下指令设置稳定版仓库
1 | sudo add-apt-repository \ |
更新 apt 包索引。
1 | sudo apt-get update |
安装最新版本的 Docker Engine-Community 和 containerd:
1 | sudo apt-get install docker-ce docker-ce-cli containerd.io |
确认成功的方法:1
sudo docker info
观察最后几行当中Registry Mirrors有没有出现。
趁着双十一,租了腾讯云3年的VPS,这个价钱是真的够便宜的了(确信)。
我选择的是Ubuntu 18.04 LTS,腾讯云的控制台当中可以选择重装。
提醒:由于我当时不停得重装系统(自己菜),所以
ssh
有的时候连接会出现问题:“IT’S POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!!!”
确实,NASTY是我本人了。这个时候你只需要在你的本地执行:
1 | sudo rm ~/.ssh/known_hosts |
这样可以删除你的所有连接信息,不会报错。
首先ssh
连接VPS,然后进行super cow power
的apt
换源(大雾),其中我用的是阿里云的源
人是腾讯人,心是阿里心
(大雾)
1 | sudo rm /etc/apt/sources.list |
1 | # 阿里源 |
更新:1
sudo apt update && sudo apt upgrade
其中可能会碰到如下情况:
选择第一个安装新版。
LAMP: Linux, Apache, MySQL, PHP
安装Apache2
:
1 | sudo apt install apache2 |
安装PHP
:
1 | sudo apt install php php-dev php-curl php-pear php-mysql libapache2-mod-php php-mbstring |
官网:http://typecho.org/download
不管通过什么东西,让下载下来,解压好,build
目录中的所有文件,出现在/var/www
当中
根据前面的保存的路径修改配置文件:
1 | sudo vim /etc/apache2/sites-available/000-default.conf |
修改:
1 | <VirtualHost *:80> |
由于安装过程中不一定要求输入密码,所以可能已经生成好了默认密码。打开:
1 | sudo vim /etc/mysql/debian.cnf |
这里面有用户名和密码,用debian-sys-maint
登录MySQL
:
1 | mysql -u debian-sys-maint -p |
修改root
账号密码:
1 | update mysql.user set authentication_string=password('<your_pwd>') where user='root' and Host ='localhost'; |
防止登录密码失效:
1 | use mysql; |
刷新,退出:
1 | flush privileges; |
重启服务:
1 | sudo service mysql restart |
目前我只有在SSH的情况下成功登录了MySQL,原因不明。
然后选到mysql
,找到user
,接下来那个原始账号想删就能删了。
由于我也购买了腾讯云的域名(第一年只要4块!!!往后只要25块!!!)所以可以直接在腾讯云申请SSL。
腾讯免费ssl证书获取链接:https://console.cloud.tencent.com/ssl
按照要求填写,然后第二步认证直接采用推荐方式,这样就可以直接配置好NameServer,不用自己操心。等到审核成功之后:
会自动出现TXT记录。
接下来,我们将审核通过的证书加载下来(右侧有下载按钮):
解压之后会有以下几种类型web服务器的证书,选择Apache
,可以看到里面包含三个文件:
将它们上传到VPS的/etc/httpd/ssl
目录(其实并非非他不可,但我懒了)。
然后,开启ssl
模块:
1 | sudo a2enmod ssl |
查看/etc/apache2/ports.conf
文件中,是不是包含(没有的话,添加)
1 | Listen 80 |
接着我们需要创建软连接,同时删除/etc/apache2/sites-enabled/site-enabled
目录下的000-default.conf
链接文件
1 | sudo ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/default-ssl.conf |
接着配置default-ssl.conf
这个文件
1 | sudo vim /etc/apache2/sites-enabled/default-ssl.conf |
(懂我意思就好)(小声)
接着我们配置http
重定向为https
开启rewrite
模块:
1 | sudo a2enmod rewrite |
接着配置/etc/apache2/apache2.conf
文件,在文件的末尾添加:
1 | <Directory "/var/www"> |
这样就可以让http
自动跳转到https
。
最后重启Apache2
服务:
1 | sudo service apache2 restart |
进入博客所在网址,开始安装。填写:
接下来按照网页指示操作即可,注:网站根目录是/var/www
人到底为什么要活着呢?
总感觉,现在活着只是为了活着。
考试到底什么时候才有尽头呢?
到底什么时候才能获得解脱呢?
到底是从什么时候开始爸妈习以为常地觉得我优秀呢?
明明是承认自己的不足但为什么永远会被认为是装逼呢?
努力到底有什么用呢?
到头来还是一无是处。
一件事做得有瑕疵变成了一辈子叨念的话题。
一件事做得不对变成为了一生的污点。
我为什么没有资格选择想不想来到这个世界呢?
为什么要惩罚我让我出生呢?
为什么为了活下去就要回应别人的期待呢?
为什么从出生一开始便是欠别人的呢?
为什么会这么空虚痛苦无力呢?
金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过 n 元钱就行”。今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:
主件 | 附件 |
---|---|
电脑 | 打印机,扫描仪 |
书柜 | 图书 |
书桌 | 台灯,文具 |
工作椅 | 无 |
如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有 0 个、1 个或 2 个附件。每个附件对应一个主件,附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的 n 元。于是,他把每件物品规定了一个重要度,分为 5 等:用整数 1∼5 表示,第 5 等最重要。他还从因特网上查到了每件物品的价格(都是 10 元的整数倍)。他希望在不超过 n 元的前提下,使每件物品的价格与重要度的乘积的总和最大。
设第 j 件物品的价格为 vj,重要度为wj,共选中了 k 件物品,编号依次为 j1,j2,…,jk,则所求的总和为:
vj1×wj1+vj2×wj2+⋯+vjk×wjk。
请你帮助金明设计一个满足要求的购物单。
第一行有两个整数,分别表示总钱数 n 和希望购买的物品个数 m。
第 2 到第 (m+1) 行,每行三个整数,第 (i+1) 行的整数 vi,pi,qi 分别表示第 i 件物品的价格、重要度以及它对应的的主件。如果 qi=0,表示该物品本身是主件。
输出一行一个整数表示答案。
1000 5 800 2 0 400 5 1 300 5 1 400 3 0 500 2 0
2200
对于全部的测试点,保证 1≤n≤3.2×104,1≤m≤60,0≤vi≤104,1≤pi≤5,0≤qi≤m,答案不超过 2×105。
这道题可以只枚举主要物品,有五种选择方法:
然后其实就是普通的背包问题了(撒花
1 | #include <iostream> |
设 T=(V,E,W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称 T 为树网(treenetwork
),其中 V,E 分别表示结点与边的集合,W 表示各边长度的集合,并设 T 有 n 个结点。
路径:树网中任何两结点 a,b 都存在唯一的一条简单路径,用 d(a,b) 表示以 a,b 为端点的路径的长度,它是该路径上各边长度之和。我们称 d(a,b) 为 a,b 两结点间的距离。
D(v,P)=min{d(v,u)}, u 为路径 P 上的结点。
树网的直径:树网中最长的路径成为树网的直径。对于给定的树网 T,直径不一定是唯一的,但可以证明:各直径的中点(不一定恰好是某个结点,可能在某条边的内部)是唯一的,我们称该点为树网的中心。
偏心距 ECC(F):树网 T 中距路径 F 最远的结点到路径 F 的距离,即
ECC(F)=max{d(v,F),v∈V}
任务:对于给定的树网 T=(V,E,W) 和非负整数 s,求一个路径 F,他是某直径上的一段路径(该路径两端均为树网中的结点),其长度不超过 s(可以等于 s),使偏心距 ECC(F) 最小。我们称这个路径为树网 T=(V,E,W) 的核(Core
)。必要时,F 可以退化为某个结点。一般来说,在上述定义下,核不一定只有一个,但最小偏心距是唯一的。
下面的图给出了树网的一个实例。图中,A−B 与 A−C 是两条直径,长度均为 20。点 W 是树网的中心,EF 边的长度为 5。如果指定 s=11,则树网的核为路径DEFG
(也可以取为路径DEF
),偏心距为 8。如果指定 s=0(或 s=1、s=2),则树网的核为结点 F,偏心距为 12。
共 n 行。
第 1 行,两个正整数 n 和 s,中间用一个空格隔开。其中 n 为树网结点的个数,s 为树网的核的长度的上界。设结点编号以此为 1,2…,n。
从第 2 行到第 n 行,每行给出 3 个用空格隔开的正整数 u,v,w,依次表示每一条边的两个端点编号和长度。例如,2 4 7
表示连接结点 2 与 4 的边的长度为 7。
一个非负整数,为指定意义下的最小偏心距。
5 2 1 2 5 2 3 2 2 4 4 2 5 3
5
8 6 1 3 2 2 3 2 3 4 6 4 5 3 4 6 4 4 7 2 7 8 3
5
因为路径$F$是直径上的一部分,那就变得非常好办了。考虑下图的样子:
求出在这种情况之下的子树的最深深度,记为$sd\text{ }secd[i]$,其中$i$为直径上的点,之所以这么表示,因为这个深度是在一个节点所有子树当中第二深的深度,最深的深度$sd\text{ }max[i]$为直径所在的那颗子树的深度。
在这种情况下,可以在直径上选定一段$F$后,列出$ECC(F)$的方程:
因为求上面是式子中的第一项和第三项非常容易,在直径求完之后就是$O(1)$了,而第二项是区间最大值,那么我们可以用单调队列维护。
1 | #include <iostream> |
5 1 1 2 1 3 1 1 1
3 2 3 4 4
我们要求每一个端点最远点,其实就是这个端点到任意一条直径两个端点距离较远的那一个。证明过程其实非常的简单,用反证法就可以。那么,我们其实只需要用两遍dfs求一下直径的两个端点和到一个端点的距离数组求出来,再用一遍dfs把到另外一个端点的距离数组求出来。
多组数据,用while (scanf("%d", &n) != EOF)
来做。
1 | #include <iostream> |
有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小。
第一行为3个整数,分别表示a,b,n的值
第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。
仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值。
5 4 2 1 2 5 6 0 17 16 0 16 17 2 1 2 10 2 1 1 2 2 2
1
问题规模
(1)矩阵中的所有数都不超过1,000,000,000
(2)20%的数据2<=a,b<=100,n<=a,n<=b,n<=10
(3)100%的数据2<=a,b<=1000,n<=a,n<=b,n<=100
要求出一个方块内的极值,我们不妨维护两次单调队列:
这样我们就可以达到目的了
图片@chill(洛谷):
1 | #include <iostream> |
给定一行n个非负整数a[1]..a[n]。现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择。你的任务是使得选出的数字的和最大。
第一行两个整数n,k
以下n行,每行一个整数表示a[i]。
输出一个值表示答案。
5 2 1 2 3 4 5
12
对于20%的数据,n <= 10
对于另外20%的数据, k = 1
对于60%的数据,n <= 1000
对于100%的数据,1 <= n <= 100000,1 <= k <= n,0 <= 数字大小 <= 1,000,000,000
时间限制500ms
我们要选出和最大的一堆数,但是这非常难,所以我们可以考虑怎么做才能删除最少的数。设$f[i]$表示删除第$i$个数的最小和,那么$f[i]$可以由前$k+1$个$f$转移而来(因为是不超过$k$个),即以下转移方程给出:
观察后半段,其实就是个单调队列,直接维护就行了。最后的答案:
1 | #include <iostream> |
十年OI一场空,不开longlong见祖宗。