自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 ctfshow-php特性

大佬文章intval 的绕过正则匹配sha1 和 md5 的绕过php 运算符优先级php://fliter 的各种过滤器正则匹配的回溯php 正则匹配最大回溯linux 的 curl命令用法无回显 rce 的总结命令执行总结本文中引用的所有文章都在上面了,感谢各位大佬!web96if(isset($_GET['u'])){ if($_GET['u']=='flag.php'){ die("no no no"); }else{ h

2024-03-07 19:09:12 928

原创 ctfshow-命令执行

函数,其不需要括号传参(例如 include a.php)文件会被注释掉(显示不出来),所以考虑伪协议读文件。,多刷新几次即可做到无参数命令执行。一般实现方法是自增,取反,异或,或。头中的信息放到一个数组里面。头中的某些不重要的内容为。:匹配某个范围的字符(:只会让后面的查询没有。

2024-01-25 16:32:08 1277 3

原创 动态dp

动态 dp

2022-11-18 23:01:23 503 1

原创 ARC149题解

atcoder regular round 149

2022-10-04 13:18:43 697

原创 插头dp。

插头dp解决网格问题轮廓线就是格子的边每次维护一个格子周围的状态,使之能够不重不漏的表示所有格子的状态吃树题意:求若干回路覆盖所有格子的方案数枚举每个格子,维护包围着一个格子的轮廓线对于每一行,已经处理过的格子轮廓线是格子的底边,要处理的格子由一条向左和向下(左边和顶边)的轮廓线包含,其他未处理的格子的轮廓线就是格子的顶边就是这样二进制压位,用1表示这条轮廓线有连向此点的边,0表示没有分类讨论一个格子左方和上方有没有边与这个格子连接进行转移:若这个格子是障.

2022-03-16 09:24:55 500 1

原创 ARC106总结

Atcoder比赛ARC106总结

2022-03-06 19:11:21 379

原创 ARC106

A - 106暴力B - Values对于每个连通块分开考虑,可以从A变成B的充要条件是每个连通块内AB权值和相等充分性:因为每次操作连通块和不变,故最终操作完每块的和相等必要性:若联通块为一棵树,每次从叶子向上递推,令每条边所连的儿子节点权值变成B,父亲节点权值减去相应变化,发现对于任意AB,只要两集合的权值和相等就一定能够发生变化。故对于每个连通块,在任意生成树上操作即可C - Solutions构造令以r升序方案数A,l升序方案数B1.A>=B2.构造方案

2022-03-05 15:49:23 218

原创 2019十二省联考

异或粽子一段的异或和,先去取前缀异或和,这样异或和就变成了任意两个位置的异或将每个异或和放到一个01trie里,01trie支持询问与任意一个数的异或第k大值先把每个位置的异或最大值找出来,放到一个大根堆里,每次取出一个位置的k大值答案后再将k+1大值放到大根队里,取够需要的次数就行为了保证不重复,对于每个粽子,每次只能取出编号在他前面的,所以要用可持久化01trie春节十二响树上启发式合并我的树上启发式合并的博客字符串问题暴力的话将A向支配的B连边,B再向每个A(符合B

2022-02-19 22:29:46 150

原创 树上启发式合并

[十二省联考 2019] 春节十二响先证明引理:1.划分集合越少越好(如果集合变多,答案一定比现有答案增大2.最小集合数量为树的高度然后根据这两条引理,就dfs遍历树,对每个节点维护个数组(代表集合最大值),需要维护两个操作1.插入一个值(每次遍历到的节点)2.将多个数组降序排序后按位取最大值因为降序,数组用大根堆代替最后根节点的数组每个元素为集合的最大值每次操作时间复杂度都是和子树size的最大值有关,最后会变成n^2的时间复杂度运用长链剖分的思想,每次遗传长儿子的

2022-02-17 23:51:11 521

原创 2018 九省联考&线段树合并

一双木棋根据题目所说,一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧及上方的所有格子内都有棋子。可知每一行的棋子数目是单调不降的最多有10行,总情况数相当于在0~10这11个数中选取可以重复的十个数的情况可重集的数目,相当于只有种合法的棋子摆放情况要求第一个取的和第二个取的差最大,故在第一个人的回合,保存差的最大值,第二个人的回合,保存差的最小值用unordered_map压一个十一进制数,用数组保存棋子使用情况,dp转移即可IIIDX每种音乐的解锁互相有依赖..

2022-02-16 10:00:05 323

原创 六省联考2017

寿司餐厅最大权闭合子图因为每个点的权值只算一次,考虑转化为图建图每个区间[l,r]向[l+1,r]与[l,r-1]连边,点权为区间美味值,每个区间[i,i]点权为区间美味值-c,最后每种寿司向代表这种寿司的点连边,点权为m*id^2在此图中,选择了一个点,必然要选择这个点的后继,让点权最大就是最大权闭合子图将正点权节点与S连边表示选择此点,负点权节点与T建边表示不选择此点,为满足条件需要让S,T不连通,最小割即可期末考试维护学生在某时间的数量的前缀和,大于某时间的前缀和,小于

2022-02-14 08:30:37 117

原创 LCT笔记

解决问题:动态插入/删除边,维护splay可以进行维护的东西1.普通的维护信息[HNOI2010]弹飞绵羊建树:从i连向i+w难点在于加边是单向的,故不支持换根所以要改变link/cut的写法link:保证图每时每刻都是森林,所以只有一个父亲,直接连边即可cut:也是直接删边答案是i到树根的经过节点,直接统计即可2.判断是否联通方法:将x设为树根,然后y连接树根,splay(y)后一直走左儿子,如果x在最左边的话就在一个联通块里,否则不是[AHOI2005] 航线

2022-02-10 23:43:34 567 1

原创 ARC105

C - Camels and Bridge题意:一堆骆驼过桥,每个桥有承重和长度,问骆驼从头到尾的最近距离假设这时候骆驼的过桥顺序已经安排好每一个桥相当于一个限制条件,限制了[l,r]的最近距离,也就是说,对于每一个骆驼 j,要保证好了把每个骆驼看作一个节点,跑最长路,NPC最终的图是一个DAG,DP求解最长路考虑求出来[i,j],因为运用了差分约束的思想,所以不需要让[i,j]严格的表示为这一段的最大长度,只需要令[i,j]表示为承受不住这一段的桥的最大长度就行,可能[i,..

2022-02-07 23:35:48 436 1

原创 USACO 2022 siliver

A.Searching for Soulmates题意:a经过+1,*2,/2三种操作变成b的最小次数1.a一定是按照 /2(+1)/2(+1)......(+1+1+1...)*2(+1)*2(+1) 这种操作顺序变成b证明:首先令a小于b,并且只经过+1与*2变成b,最少步数的构造方法是令c=a*2^k且c<b,将得到的(b-c)二进制分解,对于其二进制每一位都可以插入到相应的乘法位置中,用一步完成,故这样为最小步数为了保证有这种方案并且可行,我们枚举要经过的乘法的轮数,也就是说能

2022-02-06 23:57:20 1268 1

原创 ARC104

C - Fair Elevator题意:一栋楼1~2n层,一个电梯只从下到上一次,要求每层楼只上一个人或者下一个人,问能否成立思路:预处理[l,r]区间可不可能正好达到要求,最后dp整合,若dp[2*n]可以到达说明有方案成立对于一个封闭区间[l,r],一定是由[l,mid]一一对应分别指向[mid+1,r],只需判断能否做到一一对应即可成立的情况分四种:1.正好有i~mid+i-l+1这种人2.有i~-13.有-1~mid+i-l+14.i与mid+i-l+1都没有出现过并且还

2022-02-03 21:48:46 295

原创 ARC134题解

C - The Majority将a种球放进k个不同的箱子,每种球ni个,第1号球在箱子中球的总数的一半以上问方案总数因为第1种球的个数在每个箱子站一半以上,故同时去除一个1号球和一个其他球,每个箱子内必剩余有一号球剩余的一号球个数为 这些球需要放满所有的箱子算出总情况数ans1然后将剩余的球随意的放入箱子内,总情况数ans2将两个相乘即可箱子放球的总结(ans1,ans2的求法已经其他的不同情况借鉴的是这个博客:排列组合 "n个球放入m个盒子m"问题 总结_qwb的博客-C

2022-01-30 22:25:01 764 3

原创 2-SAT

解决问题:一个集合中每个点都有两个状态互为逆否命题,其中有若选a则选(不选)b这种条件的限制,求出是否满足情况/输出方案思路,将有关系的点建边,每个环上的点表示在这个环上,选其中一个点就要选取其他的所有点,故若存在一个点i,他及他的逆否命题在一个环上,那么这个限制一定不成立scc进行缩点,这样可以找出每一个环输出方案:对于每一个有解的限制,只需要判断每个点所取得的状态。缩点后,整个图变成了多个有向无环图,而且对于每一个环所形成的节点来说,选取它的前提条件是选取一个他的前驱节点。故在新图上,拓扑序

2022-01-26 23:29:58 233

原创 费用流学习

常见费用流:最小/最大费用最大流要求:先保证最大流再保证费用最小/大做法:贪心每次找出单位费用最小的交错路更新即可将dinic算法中的bfs改为spfa,每次走dis[p]=dis[x]+w的边转移(保证了走的是费用最小的交错路)记录每个节点经过与否:有可能这个节点不能到达T,dinic时候会一直进入这个点,打上标记保证每个节点只经过一遍bool get_dis(){ queue<int>q; memset(dis,0x3f3f3f3f,sizeof(dis)),m

2022-01-21 23:30:40 372

原创 网络流24题

星际转移问题显然有时间维,所以分层图将每个点拆成多个点,表示在某一时间内这个点代表的状态按照题意建边,注意每个点需要向自己代表后面时间的点建边(因为可以保留在太空站)超级源点连地球所有状态,月球所有状态连超级汇点,枚举时间,每次统计可以到达超级汇点的人数,大于总人数直接输出代码飞行员配对方案问题二分图最大匹配裸题dinic输出方案时选取反向边大于0的代码软件补丁问题dijkstra/spfa跑状压dp压缩一个状态表示现在存在的问题,以每个补丁为转移

2022-01-18 23:40:04 316

原创 网络流初步

最大流:从源点到汇点经过若干个点和若干条边,每条边有一个流量限制,求总流量的最大值1.EK动能算法交错路:一条源点到汇点的路径满足路径剩余容量>0思路:每次找出一条交错路,易得这条路径的流量为路径最小剩余流量,将答案加上这条路径的流量并且路径上所有边的容量减掉此流量,就更新完一条交错路反向建路:对于每一条边,反向建一条容量为0的路,每次更新时反向道路容量加上正向道路所减掉的容量是因为网络流的流函数f(u,v)=-f(v,u),正向加了多少流量反向就会减去多少流量,反向流量代表着每次

2022-01-17 23:31:32 188

原创 二分图初步

1.二分图最大匹配匹配:无交点的边集每次直接匹配,记录右部节点所匹配的左部节点,每次匹配点x时,若x所连p点还未匹配,则使p与x匹配,否则尝试更新与p相连的左部节点,若能够更新就使p与x匹配(每次尝试增大增广路的长度)bool dfs(int x){ for(int i=1;i<=a;i++){ if(!vis[i]&&mp[x][i]){ vis[i]=true; if(!match[i]||dfs(match[i])){//若本来连的时match[i

2022-01-15 23:08:20 249

原创 广义SAM(SAM套trie)

SAM是处理单个字符串的首选算法,若是多个字符串但是又符合SAM出题的题型,考虑广义SAM1.伪广义SAM大概有两种做法1.在各个字符串中间加上一些奇怪的字符(或者让last变成初始点),然后按照普通SAM做即可2.对一个字符串构建SAM(一般选最短的),然后用其他的字符串去在这个SAM上跑,打上标记后经过一系列操作去得到正确答案[HAOI2016]找相同字符并没有想到用广义SAM怎么做考了对一个串建立SAM对于另一个串,在SAM上跑,维护当前最长子串,因为相当于长度为1~最

2022-01-14 23:35:10 601

原创 SAM经典用法

1.判断字符串出现次数SAM中,每个节点代表的是endpos集合相同的一些状态endpos是字串末尾的集合,故endpos的大小就是出现次数考虑求出endpos集合大小对于parent tree上的一个节点,他的子节点每出现一次,这个点就会相应的出现一次(因为这个点一定是他的子节点的子串)故每个点出现次数是它的子节点出现次数和+1(+1这个节点所代表字符串本身出现的第一次) void dfs(int x){ for(int i=0;i<tu[x].size();i++){

2022-01-13 23:23:35 2157

原创 SAM的构造

sam实质:将一个字符串高度压缩后的后缀放入一个自动机内,使得这个自动机可以接受所有文本的字串endpos:字串末尾在原串中出现位置的集合parent tree:若一个节点的endpos是另一个的子集,那么parent tree有一条由母集到子集的边自动机中,每个状态代表的是endpos集合相等的一些字符串添加字符是分三种情况令未加入这个字符的为原串,las为原串所在节点1.没有这个字符:las所在链上所有点向新节点连边2.若有2.1.若本来这个字符和原串...

2022-01-12 23:36:34 248

原创 字符串杂项

两个不怎么常见的算法1.Z函数定义:z[i]表示以i开头的后缀与整个串最长的公共串长度求法:假设i以前的字符串已经求完,记录l,r为右端最大的区间 [i,i+z[i]-1]若 i<r ,则根据定义,z[i]=z[i-l]但是i-l>r的情况下不能保证正确性,需要暴力判断否则就暴力求出z函数值用处(其实kmp都可以实现,只不过有些用z函数更直观)1.匹配字符串对于两个字符串跑z函数的过程,若z函数值...

2022-01-11 22:26:51 269

原创 重链剖分&长链剖分

1.重链剖分做法:令x的儿子中子树节点最多的儿子为重儿子,将一棵树划分成只由重儿子组成的一条条链性质:1.每两个点的最短路径最多经过logN条重链:每经过一个节点,子树大小至少减半,故在logN次一定走完2.遍历一棵树,每次优先遍历重儿子,这棵树的dfn序列中,保证每条重链一定连续,每棵树及其子树的节点一定连续那么对于维护树上信息的问题就可以把一棵树转化成一条链,然后维护链上的信息就好了dfs1:先求出一棵树每个节点的重儿子,每个节点的深度(求实际问题时一般要用到深度来确定链的编号)

2021-12-16 15:01:08 281 1

原创 catalan

这是Catalan数的定义,现在来证明一下:所有由n个0和n个1组成2*n个数的个数一共有那么求出不符合条件的个数,也就是有前缀的1的个数大于0的个数假设2n个数中有n+1个1与n-1个0这时一定存在一个位置i=2*k+1,在前i位有k+1个1和k个0这是i+1~2*n的数中有n-k-1个1和n-k个0将i+1~2*n中的数全部取反,这时数列中的1和0的个数都为n个,而且保证了这个数列一定不符合条件所以不符合条件的个数可以看作共有n+1个1和n-1个0组成的数列所有排列数...

2021-10-31 20:24:33 144

原创 线性基的应用

1.异或运算的线性基在一个异或空间(就是一堆数)中,几个数用异或运算可以表示出来所有的数,这几个数就是这个异或空间的线性基线性基是满足条件的极大子集一个异或空间的线性基可能有很多个,但是线性基的数目是一定的(因为线性基是满足条件的极大子集)构造方法:对于一个要加入线性基的数,找到最高位的1,若记录的这一位是1的已经有了就异或上它继续寻找,若没有则记录这个数 for(int i=1;i<=a;i++){ ll o; scanf("%lld",&o); for(i

2021-10-30 15:04:50 220

原创 .高斯消元

假如要解n元1次方程组,将n个方程放入一个n*n的矩阵,矩阵的每个位置代表未知数的系数,再写一个答案矩阵,记录每个方程的解,然后将矩阵用方程组的性质(加,乘)化为一个阶梯矩阵,如同下图这时可以发现,最后一个方程只有最后一个未知数的系数为1,其余都为0,所以可以知道最后的未知数的值,然后用已知的未知数的值一步一步向上递推消元,就可以求出方程组的解当然,方程组可能无解或有无限多个解无解:有一行出现了形如0=d(d为非0数)的式子无数解:有一行为0=0,这是说明有另外一行是ax+by=d的形式

2021-10-28 21:01:47 188

原创 c++ 数论

1.一些定理及证明1.费马小定理若p为素数,则有2.欧拉定理若a,p互质,则有证明:令为p的欧拉函数设a mod p的简化剩余系为因为a,p互质,所以a*p一定在a mod p的简化剩余系里故所以,故欧拉定理成立因为p为质数,所以故,费马小定理成立欧拉定理的推论:若a,p互质,则有证明:令,故,推论成立2.拓展欧几里得1.bezout定理:一定存在整数使ax+by=gcd(a,b)证明 当b=0时...

2021-10-26 20:53:44 953

原创 图论——基环树

基环树,就是n个点n条边的树,因为这个图相当于在树上加了一条边,故一定会形成一个环所以基环树上的问题大多数都是先处理以环上的点为根节点的子树的值,然后在环上做dp之类的东西找到环是基环树上的问题的重要一步,可以记录下来每个点的时间戳,若一个点的子节点被访问过了,那么这两个点一定是环上的节点,以这两个点为首尾讲一个环找到为了方便,当且仅当一个点的子节点被遍历过且这个点的时间戳小于它的子节点的时间戳,我们才开始记录这个环void get_cir(int x){ dfn[x]=++times;

2021-10-11 22:05:22 985

原创 四边形不等式优化

动态规划中,若转移情况是单调递增的,则可以用四边形不等式优化dp转移题目根据题目易得转移式子证明得: 符合四边形不等式故dp数组的转移数组符合单调递增,可以使用四边形不等式优化维护转移数组,可以以维护三元组(id,l,r)的形式,及在l~r区间内的数由id转移而来用单调队列维护三元组,每次更新i后,二分查找到一个位置k,使得k~n由i转移而来最佳int binary_search(int le,int ri,int id){ while(le<ri){ ..

2021-09-19 19:13:39 78

原创 dp斜率规划

斜率规划:dp式子转移时候取min/max时会从多个以有状态转移而来,斜率优化可以从一次函数的角度来排除无用的情况,从而对dp式子进行优化例题1​​​​​​每次枚举分组点j,对于每个分组点,后面的所有都会加上一个空余时间用tsum和wsum分别表示t与w的前缀和则有:式子时间复杂度为O(n^2) dp[0]=0; for(int i=1;i<=a;i++){ for(int j=0;j<i;j++){ dp[i]=.

2021-09-16 19:45:28 62

原创 数据结构优化dp

对于一个dp式子,考虑用数据结构来减小dp的时间复杂度例题1​​​​​​因为对于每一个奶牛,都是通过最右端-1~最左端-1转移而来所以有式子可以用一个线段树维护,每次查询区间最小值,然后用区间最小值进行区间dpstruct segment_tree{ long long tr[800010],tag[800080]; void pushdown(long long id,long long l,long long r){ if(l==r){ tr[id]=min(tr

2021-09-14 07:56:19 357

原创 倍增优化dp

对于一些dp问题,可以用倍增的思想来在nlogn的时间内求出问题的答案题目1若没有跑路器,那么直接Floyd做即可考虑有跑路器的情况,有改变的只是所有距离为2的整数次幂的点的距离先处理出来两个点之间有没有距离为2的整数次幂的路程,若有,让两个点的距离变成1,然后跑floyd即可for(int k=1;k<=64;k++){ for(int i=1;i<=a;i++){ for(int j=1;j<=a;j++){ for(int o=1;o<=

2021-09-11 21:25:38 388

原创 .状压dp

用二进制数来保存每种状态,用dp式子来进行每种状态的转移例题1:对于每种状态,0表示这一位下面没有多出的方块,1表示这一块方块是竖着放的,下面还有一块于是可以发现这些限制条件1.对于相邻两行,上一位对应位置是1,下一位需要对其补全,也就是对应位置的值应该是02.因为0表示两种情况,一种是对上一行的补全,另外一种是横着放的格子。若两行的值都是0,则说明这一位是横着放的格子,这种格子连续的数目需要是2的倍数for(long long i=0;i<(1<<b);i++)

2021-09-09 18:04:48 77

原创 环形dp处理

1.断环为链思路:将一个环复制一倍成为一条链,最终答案为w[i]~w[i+n]一段上的结果石子合并:如果是一条链,考虑区间dp,dp[i][j]指i~j一段的值,每次枚举中间点来得到答案因为是一个环,将w复制到原来的后面做dp,最后答案是max(dp[i][i+n])环路运输:复制处理环上问题,然后可以发现:就是用单调队列维护每一段w[j]-j的值,最后答案就是队首的值+w[i]+iq.push(make_pair(1,w[i]));for(int i=2;i

2021-09-05 22:28:55 1181

原创 .树型dp

解决无根无向树上问题,一般先令一个节点为根暴力求出答案,再用这个答案来推出以其他节点为根的答案1.普通树型dp:题目简单的树型dp,对于每个节点,选取这个节点或者它的儿子节点。对于每一个节点保存两个状态,0表示不选,1表示可选可不选2.换根dp:题目(求出以一个点,使得以这个结点为根时,所有结点的深度之和最大)思路:先令1为根节点,然后对于一个节点的儿子节点,所有这颗子树上的节点深度减1,其余节点的深度加1,故都有ans[p]=ans[x]+(n-2*size[p])题目2思路:先暴

2021-09-04 23:15:49 113

原创 .区间dp

区间dp是由若干个已知答案的小区间来推出大区间的dp题目1每次加法,都有而因为有负数的存在,乘法的情况有多种,但是可以知道,最终答案一定会是从小区间的最大值或最小值相乘而得来令dp[0][i][j]表示i~j最大值,dp[1][i][j]表示i~j最小值则有:同理,求最小值将max改为min即可初始值:当x=y时,dp[0][x][y]=dp[1][x][y]=num[x]...

2021-09-02 17:20:44 313

原创 多重背包单调队列优化

1.朴素多重背包先枚举每一个物品,再枚举物品个数,最后枚举现在的重量时间复杂度for(int i=1;i<=n;i++){ for(int j=1;j<=n[i];j++){ for(int k=w;k>=j*w[i];k--){ dp[k]=max(dp[k],dp[k-j*v[i]]+j*w[i]) } }} 2.单调队列优化多重背包每一个物品更新的时候,更新到体积为n的状态,都是与n于w[i]的模数相等的状态转移而来的,所所以对于每个物品i,都有

2021-08-30 20:23:27 570

空空如也

空空如也

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

TA关注的人

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