自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

tlyzxc的博客

我看到到处是阳光,快乐在城市上空飘扬

  • 博客(396)
  • 收藏
  • 关注

原创 CodeForces 1714G :Path Prefixes 二分 + 树上倍增

晚上睡不着,国庆节似乎跟我想象中的不太一样起来写两道题吧希望以后,生活可以善待我吧。

2022-10-02 02:46:15 276 2

原创 重置服务器后远程连接失败

因为服务器出了点问题,所以我重置了一下,但是重置之后发现ssh登陆不上去这个情况下我们需要修改一下known_hosts文件A通过ssh首次连接到B,B会将公钥1(host key)传递给A,A将公钥1存入known_hosts文件中,以后A再连接B时,B依然会传递给A一个公钥2,OpenSSH会核对公钥,通过对比公钥1与公钥2 是否相同来进行简单的验证,如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击找到你服务器对应的ip,然后将那一行删除即可...

2022-06-06 14:53:33 556 1

原创 C++实现数据库连接池

最近在学习webserver项目,前置知识有数据库连接池,其实跟线程池是类似的东西,我们提前存储连接,然后每次有连接请求再进行分配就可以了,这样就减少了每次关闭连接所涉及到的资源的消耗我们首先来封装一个数据库操作模块数据库的连接信息我们是存储在jsonjsonjson文件里面的,需要有需要也可能封装为xmlxmlxml文件然后我们就需要实现连接池的封装整个连接池是基于生产者-消费者线程模型来设计,使用了线程间的同步通信机制条件变量和互斥锁,因为实现的功能比较简单,所以我们只采用了同一种条件变量因为

2022-06-04 20:18:16 545

原创 C++编译优化选项

C++编译优化这个地方坑有点多啊(后悔开这个坑了)先放笔记吧,后面有时间再补这方面的东西C++编译优化编译优化,其实是编译时间,代码空间, 程序性能直接做权衡汇编生成指令g++ -S test.cpp -O1 test.svoid test(bool cond, double *a, double *b, double *c, int len) { for (int i = 0;i < len; i++) if (cond) c[i] += a[i] .

2022-05-28 01:13:44 1830

原创 浅析僵尸进程和孤儿进程

僵尸进程与孤儿进程的定义僵尸进程一个进程如果创建出子进程,如果此时子进程退出,而父进程没有进行善后工作(waitwaitwait与waitpidwaitpidwaitpid获取子进程状态信息),那么此时子进程的进程描述符仍然保存在系统中。孤儿进程如果一个父进程退出,它的子进程(有一个或者多个)还在,那么子进程将成为孤儿进程,这个时候这些孤儿进程会被111号进程,也就是initinitinit进程所收养,并且由initinitinit进程完成善后工作(状态收集)。过程分析上面都是那些老八股文里

2022-05-15 14:31:33 476

原创 很简单的退役小作文

简单的跟ACMACMACM道个别吧,关于ACMACMACM想说的真的很多,但是有多少能在用文字表达呢。初识ACMACMACM,是在大一的校赛上,那个时候懵懵懂懂,在牛客上写了往年的比赛题,比赛结束后对自己的能力也是挺失望的,只写了一道题,但是在当时大一是rk1rk1rk1,然后出现了两个“非常暖心的学长”——pyfpyfpyf和甘哥,把我拉进了集训队。参加ACMACMACM这么长时间,我经常会回去看一看那一场校赛,提醒自己别忘了当初对此的热爱。然后就是寒假训练了,那个时候也是年少无知,没有系统的学习方向

2021-11-30 11:40:32 1883 17

原创 【HDU 6567】 :Cotree 换根DP

传送门分析首先我们知道,树上某点到树上其他点的距离和中,树的重心最小,所以这个问题就可以转化成找出两棵树的重心,链接,然后计算树上距离和两棵树分类可以用并查集操作,后面两个步骤用换根DP就可以解决了代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",

2021-11-17 23:09:17 214

原创 2018 CCPC Guilin H :Hamming Distance 思维 — 构造

传送门分析我是真的不会写构造啊55555首先如果可以的话,填a显然是最优情况,剩下就要考虑调整那些位置可以保证汉明距离相等首先如果相同的位置,直接填a就可以了,那么不同的位置,就要考虑如果这一位填的字母造成的距离影响能不能用后面的距离去抵消,所以我们要从后往前维护一个不相同字符前缀,然后循环每一种字母情况即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<&lt

2021-11-17 22:28:55 136

原创 2018 CCPC Guilin J :Stone Game 思维 + 博弈论

传送门分析考虑每一个数能被选择的最大次数如果a[i]<a[i−1]&&a[i]<a[i+1]a[i] < a[i - 1] \&\& a[i] < a[i + 1]a[i]<a[i−1]&&a[i]<a[i+1],那么a[i]a[i]a[i]可以减为0如果a[i]a[i]a[i]大于其中一个,那么可以减为较小值+1如果a[i]a[i]a[i]大于左右两个数,那么可以减为较大值+1代码#pragma GCC op

2021-11-17 22:22:41 170

原创 CodeForces 1277E :Two Fairs 思维

传送门题意分析首先如果要做到题目的要求,那么两个点之间的关系一定是,一个点只能到达aaa不能到达bbb,一个点只能到达bbb不能到达aaa思考一下,如果一个点既能到达aaa又能到达bbb的话,那么我到达任意一点,只需要经过aaa和bbb中的其中一点就可以了所以我们需要统计,在不经过aaa的情况下能到达bbb的点和不经过bbb的情况下能到达aaa的点的数量,两者相乘即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#defin

2021-11-15 22:15:11 109

原创 【SDUTOJ 2414】 :An interesting game 网络流

传送门题意分析这个数据范围很小,可以考虑用网络流处理我们把0−300 - 300−30这个范围内每一个值和每一个位置连边,流量为1,费用为该变量,然后设置虚拟原点控制流量,跑最小费用最大流即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x

2021-11-15 21:42:57 410

原创 CodeForces 1286B :Numbers on Tree 思维构造

传送门题意分析一开始想的是从下向上暴力赋值排序,然后对子树进行合并,但是后来发现好像不好处理冲突问题所以我们需要维护的是一个相对关系,离散化即可首先这个树上点权最小的值一定是深度最大并且aia_iai​为000的点,我们把这个点或者这些点丢到队列中,然后不停向上维护相对关系即可,这个过程可以参考拓扑排序那么我们怎么去维护队列中的深度关系内,用优先队列即可复杂度为O(n2logn)O(n ^ 2logn)O(n2logn)代码#pragma GCC optimize(3)#include

2021-11-15 19:59:56 400

原创 CodeForces 791D :Distance in Tree 树形DP

传送门题意分析树上统计问题考虑到kkk比较小,我们可以维护num[u][i]num[u][i]num[u][i]数组表示以uuu为跟节点的子树中,到uuu点距离模kkk为iii的点有这么多,那么状态转移方程就是f[u]=f[u]+f[j]+1+num[j][0]f[u] = f[u] + f[j] + 1 + num[j][0]f[u]=f[u]+f[j]+1+num[j][0]应该比较好理解,因为如果模不为0,说明还能继续走一步,否则就得再走一步,多出来的1是从子节点字节走到uuu节点的然

2021-11-15 00:04:38 117

原创 CodeForces 161D :Distance in Tree 树形DP + 点分治

传送门题意给你一棵树,有nnn个点,边权都为111,问你树上有多少对点的距离为kkk分析两种思路,第一种思路是树形DP,为f[u][x]f[u][x]f[u][x]维护树上到点uuu距离为xxx的点的数量,向下跑一遍,然后向上维护一下就好了还有一种点分治的做法下次补上代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<&lt

2021-11-14 11:51:07 300

原创 CodeForces 796E :Exam Cheating DP

传送门题意muronglinmuronglinmuronglin是个学渣,考试的时候,她一道题也不会做她的左右桌分别是学霸chhokmahchhokmahchhokmah和学霸lukelinlukelinlukelin,虽然学霸并不是题题都会做,但他们做了的题一定都对现在muronglinmuronglinmuronglin想要作弊,但是为了不被监考员抓住,她最多偷看ppp次,一次能看连续的kkk道题给定nnn和lalala和lblblb,分别为题目总数,chhokmahchhokmahchhok

2021-11-12 22:45:24 468

原创 CodeForces 383C :Propagating tree 树状树组 + 差分

传送门题意分析这道题很巧妙啊首先因为要对整个子树做操作,所以很容易想到可能会跟dfsdfsdfs序有关但是仔细看一下,这里的modifymodifymodify又跟节点深度奇偶有关,怎么处理呢我们维护两个树状数组,一个表示深度为奇,一个表示偶,这样,我们在进行modifymodifymodify操作的时候,只需要对对应奇偶的树状数组进行查分操作即可,在查询中,减去奇偶属性相反的和即可代码#pragma GCC optimize(3)#include <bits/stdc++.h&g

2021-11-10 21:36:20 382 4

原创 CodeForces 1560F2 :Nearest Beautiful Number (hard version) 贪心 + 思维

传送门题意分析我们从低位开始往高位寻找第一个不合法的数字,然后让这一位+1,然后check整个数是否合法,如果还是不合法的话,继续重复上一步操作代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("

2021-11-09 19:52:54 91

原创 2019 CCPC Harbin E :Exchanging Gifts 拓扑排序

传送门分析代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("%d\n",x);#define _CRT_SECURE_NO_WARNINGS#define pb push_back#define

2021-11-09 19:40:23 218

原创 CodeForces 888G :Xor-MST 异或最小生成树

传送门题意给定一个nnn个节点的完全图,每个节点有个编号aia_iai​,节点iii和节点jjj之间边的权值为ai⊕aja_i \oplus a_jai​⊕aj​,求该图的最小生成树的权值和。分析首先放上我CoolGuang的题解,讲的比较详细我个人的理解是,如果我们去递归整个字典树,如果遇到一个点即有左子树又有右子树,那么我们把右子树的所有点看成已经匹配好的一个团,左子树内的所有点看成匹配好的一个团,那么左右子树两个团直接需要进行匹配连接,那么我们去遍历左子树内的每一个点,查询在右子树的字典树

2021-11-07 20:28:41 185

原创 nowcoder :Birthday 费用流

传送门分析看完之后第一眼反应是个图论问题,想了两种方法,一种是求一个维护联通块个数,一个是网络流建图,后来想想联通块好像不太能写于是往网络流上想建图比较好建,源点和每一只蜡烛连边,每一只蜡烛和两个点之间连边,流量都为1,费用都为0,剩下的就是费用边应该如何连接的问题了,因为流量和费用并不是一个均衡的关系,所以可以暴力,每个点和汇点之间建50条边,每条边的费用为k∗k−(k−1)∗(k−1)k * k - (k - 1) * (k - 1)k∗k−(k−1)∗(k−1),然后跑费用流即可代码#pra

2021-11-07 17:01:11 64

原创 LOJ P2448 :无尽的生命 树状数组 + 离散化

传送门分析我们将需要操作的点进行离散化,这样就可以对这些点用树状数字求逆序对,同时还需要维护离散化后每两个点之间的数的逆序对的数量代码#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("%d\n",x);#define _CRT_SECURE_NO_

2021-11-03 21:19:23 173

原创 CodeForces 740D :Alyona and a tree 树上差分

传送门题意分析求每个点控制了多少个点,等价于求每个点会被多少个点控制考虑从根节点到每一个节点维护一条链,记录链上每一个节点到跟节点的距离,这样二分就可以求出距离当前点,最短的可以控制当前节点的点,然后对这个区间上每一个数+1即可,这个操作可以用查分来处理代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;

2021-11-02 22:54:00 115 1

原创 河南省赛:神奇的魔法 思维

题意分析思路比较好想,维护两个优先队列,一个是可以两倍处理数,一个是还未被选中但最终一定要被选中的数,同时维护一下两个和即可具体看代码代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("%d\n"

2021-11-02 21:34:19 78

原创 CodeForces 375D :Tree and Queries dsu on tree 换根DP

传送门题意有n个数,你可以对每个数进行两种操作:将一个数乘以2将一个数变为其二分之一并向下取整问最少通过多少次操作可以将这些数的值变为全部相同。分析好像很多题解都是写的暴力啊,我来补一个换根DPDPDP考虑建树,iii和i∗2i * 2i∗2之间连一条单向边,i/2i / 2i/2和iii之间连一条单向边,然后如果要把所有的数全部转换成1的话,就是记录每一个点的代表的数出现的次数乘以这个点的深度的和,然后要统计每一个点作为答案的情况,换一下根即可代码#pragma GCC optimi

2021-11-02 20:39:29 124

原创 CodeForces 375D :Tree and Queries dsu on tree

传送门题意分析树上静态统计,跟dsuontreedsu on treedsuontree的板子题处理出现次数最多的是一个思路,维护一下每一种颜色出现的次数即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) p

2021-11-01 15:25:40 120

原创 2020 CCPC Changchun F :Strange Memory dsu on tree

传送门分析一开始读错题了,以为是个算贡献的水题。。。树上静态统计,考虑dfsuontreedfsu on treedfsuontree,我们去维护每一个值对应每一个二进制位出现了多少次1,然后就可以快速计算异或值代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%

2021-10-31 23:05:07 72

原创 CodeForces 1154E :Two Teams 思维

传送门题意分析很久以前比赛没写出来的一道题,翻出来补一下我们维护两个优先队列q,pq,pq,p,把所有人的信息丢到队列qqq中,同时维护前驱和后继,每次取出最大的那个,然后遍历他的前驱和后继的kkk个节点,把信息丢到队列ppp中,这样,只要p,qp,qp,q两个队列的toptoptop信息相同,就说明已经被找过了,应该poppoppop掉代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout&

2021-10-28 22:16:34 278

原创 CodeForces 652D :Nested Segments 思维 + 树状数组

传送门题意给你nnn条闭区间的线段,求每条能够包含的线段的数量分析考虑固定一维,将线段的左端点从大到小排序,那么被包含的线段一定是访问过的,右端点小于当前访问线段右端点的线段,离散化之后用树状数组维护即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld

2021-10-28 21:11:42 146

原创 CodeForces 522D :Closest Equals 线段树

传送门题意分析我们去维护每一个节点的上一个相同数字的位置和下一个相同数字的位置,那么就可以快速处理出来每一个数距离左边的距离我们将所有的询问进行排序,按照左端点从小到大排序,如果当前节点的下一个节点的值小于当前询问的左节点,那么当前节点的下一个节点的距离必然不会被记入答案,删除即可我们可以用线段树去维护区间的最小值代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x&l

2021-10-27 00:27:40 127

原创 LOJ P1967 :货车运输 最大生成树 + 树链剖分

传送门分析跟上一题基本一样的思路(我从哪翻出来这道题的我也忘了。。。)代码#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("%d\n",x);#define _CRT_SECURE_NO_WARNINGS#define pb push_back

2021-10-25 22:22:41 56

原创 CodeForces 609E :Minimum spanning tree for each edge 最小生成树 + 树链剖分

传送门题意给你nnn个点,mmm条边,如果对于一个最小生成树中要求必须包括第i(1<=i<=m)i(1<=i<=m)i(1<=i<=m)条边,那么最小生成树的权值总和最小是多少。分析先将人和车按照初始位置从小到大排序,这样就可以维护双指针缩小范围然后将左端点小于等于当前乘客的车加入线段树,线段树上每一个节点表示当前时间到达的位置然后线段树上二分即可(线段树上二分需要时刻记住左子树是一个残缺区间,维护的区间值可能并不是出现在查询的残缺区间,需要去判断返回值再去

2021-10-25 21:22:47 290

原创 CodeForces 160E :Buses and People 线段树

传送门题意分析先将人和车按照初始位置从小到大排序,这样就可以维护双指针缩小范围然后将左端点小于等于当前乘客的车加入线段树,线段树上每一个节点表示当前时间到达的位置然后线段树上二分即可(线段树上二分需要时刻记住左子树是一个残缺区间,维护的区间值可能并不是出现在查询的残缺区间,需要去判断返回值再去判断是否要查询右子树)代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x&

2021-10-24 22:24:47 76

原创 SPOJ - DQUERY:D-query 主席树

传送门题意给定一个数组a[n]a[n]a[n],请你统计lll到rrr中不同数字的个数。分析跟上一题一样,同样用主席树维护第iii棵主席树表示区间内[1−r][1 - r][1−r]不同数的个数,然后维护lastlastlast,对于每个位置,先将上一个位置减一,再将当前位置加一即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<

2021-10-23 22:28:39 89

原创 CodeForces 1000F :One Occurrence 主席树

传送门题意分析主席树进行区间维护我们维护每一个位置上的数字,上一次出现的位置在哪里,只要区间有数字的lastlastlast小于左端点即可,主席树暴力维护代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) pr

2021-10-23 20:53:15 230

原创 CodeForces 587C :Duff in the Arm 主席树 + 树上倍增 + LCA

传送门题意分析两种思路第一种是从根节点向下建立主席树,在dfsdfsdfs的过程中插入并维护fa[u][i]fa[u][i]fa[u][i]数组求LCALCALCA,然后通过四个点u,v,LCA(u,v),fa[LCA(u,v)][0]u,v,LCA(u,v),fa[LCA(u,v)][0]u,v,LCA(u,v),fa[LCA(u,v)][0]来确定这个区间内出现了多少个数,然后枚举前kkk小个数即可第二种思路留个坑以后补代码#pragma GCC optimize(3)#include

2021-10-21 15:52:53 100

原创 P1792 [国家集训队]种树:带悔贪心

传送门题意分析水群的时候发现的题目原本想了一个很假的二维dpdpdp,后来发现数据范围之后直接带走这道题正解是一个带悔贪心,这也是我第一次接触到这种类型的题目,记录一下一般来说,贪心问题都符合局部正确到整体正确,放在这道题很明显,比如1 19 20 19 1如果是局部贪心的话,我们会首先选择202020,但是从全局来看,这样我们就不能去选择左右两边的两个191919,这种贪心只能保证局部最优,无法保证整体最优所以,我们需要引入带悔贪心这一策略带悔贪心,顾名思义,就是可以后悔的贪心,可

2021-10-20 16:38:28 175

原创 CodeForces 1592E :Bored Bakry 二进制 + 思维

传送门题意给定一个 nnn 个数的数组,要求找一个连续子区间,满足该子区间的区间 &\&& 和 >>> 区间异或和。求该子区间的最大长度。分析二进制常见的处理方式就是进行拆位处理首先如果是大于的话,那么就要求第kkk位的异或和大于&\&&,然后大于第kkk位的异或和为0代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout&lt

2021-10-20 15:54:46 193

原创 CodeForces 1574D :The Strongest Build BFS

传送门题意分析用mapmapmap维护不能选的组合,然后bfsbfsbfs直接搜太暴力了。。。代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("%d\n",x);#define _CRT_SE

2021-10-19 23:59:43 75

原创 宇宙人浇花:字典树 + 前缀和

传送门题意分析水群看到的题,woc贼妙我们都知道,要表示一个区间的异或和的话,可以用前缀和处理,那么这里有两个,要怎么处理呢我们用aaa数组表示原序列的异或和前缀和,bbb表示原序列 + 的异或和前缀和,我们从0 - n开始循环,不停的把a[n]a[i]⊕b[i]a[n] ^ a[i] \oplus b[i]a[n]a[i]⊕b[i]插入,也就是插入了类似于aaaabbbbaaaabbbbaaaabbbb的形式,然后对a[i]oplusb[i]a[i] oplus b[i]a[i]oplusb

2021-10-19 22:23:46 172

原创 CodeForces 1593G :Changing Brackets 前缀和 + 思维

传送门题意分析因为左右之间可以相互转换,所以不用考虑方向问题,所以如果是合法状态的话,只要保证奇数位置和偶数位置的相同类别的括号数量相同即可,用前缀和维护一下即可代码#pragma GCC optimize(3)#include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x)

2021-10-19 18:53:09 175

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除