- 2024-11-21QOJ6958-复杂的双树上问题以及简单的解决方式
题面原题链接思路我们考虑如何判断一对\(T_1,T_2\)是否合法。首先,我们可以发现\(T_2\)上的边权只能有至多一组合法解,这是因为对于任意一条边连接\(u,v\),它的边权必然是\(dis_1(u,v)\),所以事实上我们是没有权限给\(T_2\)任意赋权的,这样题目就简单了一些。那么,我们如何
- 2024-11-17NOIP2021 做题笔记
这次又被抓过去写noip2021了\(qaq\)P7960[NOIP2021]报数可以用类似于质数筛的方法筛一遍,做到\(\mathcalO(\)值域\()\)的预处理,以及\(\mathcalO(1)\)的查询。#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#definemxn10000010#definemxm200
- 2024-11-16Living-Dream 系列笔记 第86期
边双连通分量概念:若在无向图\(G\)中,存在一个极大子图\(G'\),使得\(G'\)中没有割边,则称\(G'\)为\(G\)的一个边双连通分量,记作\(\texttt{E-DCC}\)。使用场景:将无向图转化为一棵树(即无向图上的缩点)。求解步骤:确定割边,再遍历所有点且不经过割边,那么能联通的点都是即在同一
- 2024-11-09「杂题乱刷2」P11267
题目链接P11267【MX-S5-T1】王国边缘解题思路先考虑对于\(1\simn\)中的每一个点往后跳\(1\)次会跳的距离。那么为什么只用处理\(1\simn\)这些点而不去处理其余的点往后跳的距离呢?我们可以发现,由于字符串是无线循环的,所以对于位置模\(n\)的结果相同时,那么往后跳
- 2024-11-08普及 SAM
参考了一些博客,如有侵权,请告知。内部资料,包不外传。定义后缀自动机(SAM)的结构包含两部分,有向无环单词图(DAWG)和parent树。SAM中的每个节点都同时存在于这两个结构中。以下假设我们是关于字符串\(s\)的SAM。DAWGDAWG是一个DAG。我们令起始结点为\(st\),\(st\)在DAWG
- 2024-11-06链式并查集合并(裸板)
对于操作:将一段元素合并为同类。在合并\([l,r]\)这一段数的时候,其实有很多数本来就在一个并查集里。我们只需要合并若干个还没有合并的并查集,而不需要从\(l\)到\(r\)一个一个合并。因为只要合并了这几个并查集,效果等价于把\([l,r]\)直接合并了。实现方法:每次记录一个
- 2024-11-012024.11.01模拟赛
唉不——开——心——有些话就不说了。T1打假了,打了T3、T4的特殊样例(共10分),原本是抱着爆0的心态的,结果没想到T1数据水到直接给了我70分——但T3T4爆掉了,总分70分。差点爆0,不——开————心——————题目小链接T1【二分图匹配】题目大意:给出两个长度分别为n,m(1
- 2024-10-30快速求图上最小点定联通块权值的Trick
更新日志概念图上最小点定连通块,就是给出无向连通图上一些点,要求找出边权和最小的连通分量使这些点强连通。现在要求这个连通块内的边权之和。思路先给出结论:把节点按照dfs序排序,统计所有相邻的节点以及起始点与末尾点之间的距离,将它们求和,所求的答案即为这个和除以2。感
- 2024-10-25Tarjan连通性算法模板大整合
更新日志前言由于Tarjan算法页面过多,这里统一做一个整合,后期可能还会加入或者更改这里的模板。另外的,这个页面只提供模板——以及链接,详细讲解点链接即可。强连通(有向图,储存每个节点属于的分量编号)intscnt;intscc[N],siz[N];intdcnt;intdfn[N],low[N];boolins[N
- 2024-10-25Tarjan求点双连通分量
更新日志思路首先,点双连通分量就是删去任意一点后仍连通的分量。如何求呢?看着定义,答案就已经在里面了——求出割点即可。与边双不同的是,点双中是包括割点的。究其原因,删去割点之后,原图会被分成多个连通块,但事实上,割点加入其中任意一个,仍然是双连通的。证明如下:若连通块
- 2024-10-25Tarjan求边双联通分量
更新日志思路首先,我们求出原图中所有的桥,然后跑DFS给原图分区。求桥具体过程:Tarjan求桥更具体的,我们遍历每一个点,假如这个点没有被分区,那么就从这个点开始深搜。每一次深搜,都走不是桥的边,那么走到的就都属于一个边双。(很容易证明)这样,我们把每一次深搜走到的所有点分成一
- 2024-10-25Tarjan求割边(桥)
更新日志思路割边定义与割点相似,不过是把点换成了边,所以思想和割点差不多。Tarjan割点我们只需要在Tarjan过程中判断某一颗子树的low是否严格大于当前节点的dfn。值得注意,这里子树的low不应该由到它的原边回溯到它的父节点得到!究其原因,其实就是如果子树是一个强连通分量,那
- 2024-10-23P3478
题解#include<bits/stdc++.h>usingnamespacestd;structedge{ intto,nxt;}e[1000010<<1];intn,cnt,id;inthead[1000010];longlongans;longlongf[1000010],dep[1000010],size[1000010];inlinevoidadd(intu,intv){ e[++cnt].nxt=head[u];
- 2024-10-22NOIP2024集训Day58 字符串
NOIP2024集训Day58字符串C.[CEOI2011]Matching发现要做的是排名串的匹配。考虑把它转成这个位置之前有多少个数小于当前这个数,这样就只要每个位置都对应相等的,那就一定是合法的。然后就可以类似KMP的预处理出一个\(nxt\)数组,然后再类似KMP的匹配。因为需要支持动态
- 2024-10-22border 性质梳理
建议看到结论之后直接画图自己推目前定义\(s[l,r]\)为字符串\(s\)的\([l,r]\),定义\(nxt_i\)为KMP算法所得。定义:\(s[1,i]=s[n-i+1,n]\),则称\(s[1,i]\)是\(s\)的一个border可能证明会比较浅显,但仅供笔者理解。nxt树定义:连边\(nxt_i\toi\)的一棵树。周期性
- 2024-10-212024.10.21训练记录
上午NOIP模拟赛A猜了结论。一个一个数做。当前这个数插进去的时候,设前驱为pre[i],后继为nxt[i]。设\(x=max(a[pre[i]],a[nxt[i]]),y=min(a[pre[i]],a[nxt[i]])\)。则:当\(a[i]>x\)时,\(ans+=a[i]-x\);当\(a[i]<y\)时,\(ans+=y-a[i]\);否则\(ans\)不
- 2024-10-18KMP
一个kmp学了\(n\)遍终于学懂的屑菜bot。下文默认文本串为\(s\),模式串为\(t\)。前缀函数定义\(\pi_i\)表示前缀为\(i\)的子串中的最长公共前后缀(border)长度。不难发现,将文本串接在模式串后,中间隔一个特殊字符,若出现\(\pi_i=|t|\)的情况则说明匹配成功了。求取
- 2024-10-18【做题记录】ds合集 Part II
ds合集的Part2,此合集包含分治问题和位问题。分治问题CF452F题目链接枚举\(i\),考虑差为\(k\),即\(a_i-k,a+k\)是否在不同的两侧。把在\(i\)前面的\(a_j\)设为\(1\),就是要找以\(i\)为中心半径在\(\min(a_i,n-a_i+1)\)的串是否是回文串。线段树维护即可。复杂
- 2024-10-17Codeforces Beta Round 93 (Div. 1 Only) B. Password 一题三吃
https://codeforces.com/problemset/problem/126/B学完Z函数,先用哈希做了一遍,再用Z函数做了一遍,然后搜其他人的题解发现用next数组也能做,就又做了一遍B.Password题意给一串字符串\(s\),要求找一个最长的\(t\)\(t\)既是\(s\)的前缀串,也是后缀串,还是除了前缀后缀外的一个
- 2024-10-10最大流 dinic算法
洛谷P3376#include<iostream>#include<cstring>#include<algorithm>#include<map>#include<vector>#include<queue>#include<numeric>#include<functional>#include<set>#include<cmath>#in
- 2024-10-10kmp算法模板
voidkmp(){n=strlen(s+1);//s是目标串m=strlen(p+1);//p是模板串//nxt预处理开始intj=0;nxt[1]=0;for(inti=2;i<=m;i++){while(j>0&&p[j+1]!=p[i])/*判断当前子串的前后缀相等的长度是否能增
- 2024-10-09#4. 图的存储、最短路(未完结)
bro高一才开始自学图论图的存储建议无脑用链式前向星0x01.什么是链式前向星定义(摘自OIwiki)本质上是用链表实现的邻接表具体来说:以有向边的形式,\(head\)数组存当前边的编号,\(e[i].nxt\)数组存上一次加的以\(u\)为起点的边的编号,这样就能实现用\(head[u]\)和\(
- 2024-10-07day1
day1雷暴(storm)题目要求计算覆盖所有相同颜色格子的最小正方形的面积。#include<bits/stdc++.h>usingnamespacestd;intn,m,k;inta[1005][1005];structnode{ intx,y;}f[100005],g[100005];intmain(){ freopen("storm.in","r",stdin); freopen(
- 2024-10-07day1
day1雷暴(storm)题目要求计算覆盖所有相同颜色格子的最小正方形的面积。#include<bits/stdc++.h>usingnamespacestd;intn,m,k;inta[1005][1005];structnode{ intx,y;}f[100005],g[100005];intmain(){ freopen("storm.in","r",stdin); freopen(