随笔分类 -  板子和trick

摘要:using namespace std; sort(e+1,e+1+n,comp); void kruskal() { int cnt=0,k=1; while(cnt<n-1) { int rx=find(e[k].from); int ry=find(e[k].to); if(rx!=ry) { 阅读全文
posted @ 2024-09-02 11:41 zhengchenxi 阅读(13) 评论(0) 推荐(1) 编辑
摘要:using namespace std; bool vis[N]; int match[N]; bool find(int x) { for(int i=h[x];i;i=nxt[i]) { int y=to[i]; if(!vis[y]) { vis[y]=1; if(!match[y]||fin 阅读全文
posted @ 2024-09-02 11:34 zhengchenxi 阅读(18) 评论(0) 推荐(1) 编辑
摘要:我们设 f[i][j][k] 表示填到 i 个数,目前拓展出 j 个可以填数的区间(最两边不算,注意是可以填数的区间!!),贡献和为 k 。 这个是可以填数的区间 我们按从小到大进行填数。 那么对于任意一个数x显然有三种情况。 1.如果x左右目前都没数,那么说明它的左 阅读全文
posted @ 2024-08-22 20:45 zhengchenxi 阅读(17) 评论(0) 推荐(3) 编辑
摘要:我们设 f[i][j]表示目前前 i 个宝箱的期望贡献的 j 次方。 根据题意可得 f[i][k]=(f[i1][1]+a[i])kp[i]+(f[i1][1]+b[i])k(1p[i]) 这个式子很难处理,不妨用二项式定理优化 优 阅读全文
posted @ 2024-08-22 19:04 zhengchenxi 阅读(23) 评论(0) 推荐(2) 编辑
摘要:这里主要是了解一下套路,首先说一下树的直径的性质。 1.任何一个点到它所在的联通块中距离最远的点一定是树的直径两点之一。 2.两个连通块合并以后,新的树的直径一定为原先两个连通块中树的直径中的两个。 了解完这个,我们来看这道题,根据树的直径的性质,我们可以来维护连通块,那一个难点就是删边很难处理,但 阅读全文
posted @ 2024-08-18 19:22 zhengchenxi 阅读(22) 评论(0) 推荐(1) 编辑
摘要:我觉得呢,cdq的本质就是在归并排序消掉一维的影响来处理多维偏序问题。既然本质跟二分有关,那很容易猜到cdq处理k维偏序的时间复杂度为O(Nlogk1N) 三维偏序问题:形如:$求满足条件a_i<a_j,b_i<b_j,c_i<c_j且 j!=i 的 j 个数 比较常考的就 阅读全文
posted @ 2024-08-13 18:06 zhengchenxi 阅读(26) 评论(0) 推荐(0) 编辑
摘要:点击查看代码 #include<bits/stdc++.h> using namespace std; const int N=1e6+5; const int mod=1e9; const int p=39989; const double eps=1e-9; int n,m; int ans,a 阅读全文
posted @ 2024-08-13 14:51 zhengchenxi 阅读(22) 评论(0) 推荐(1) 编辑
摘要:首先比较好想的是断边跑dij,虽然能过(数据太水),但是可以被菊花图给卡掉。 那我们就考虑怎样可以降低复杂度,图论唯一能优化的应该就是建图了吧。 这里我们就可以进行分组最短路,通过二进制来确保分组的正确性,因为任意两个不同的点,二进制一定至少存在一位不同。于是我们以每个二进制位的0,1进行分组,每组 阅读全文
posted @ 2024-08-13 14:51 zhengchenxi 阅读(22) 评论(0) 推荐(2) 编辑
摘要:比较好想到的是O(nm2)的多维背包,由于这题有点卡空间,得把数组开成short类型。 正解: 设dpi,jk表示前i个物体选j个物品画面质量综合为k时,不可玩度的最小值。 那转移方程为: \(dp_{i,j,k}=max(dp_{i-1,j,k} \quad ,\qua 阅读全文
posted @ 2024-08-13 08:28 zhengchenxi 阅读(25) 评论(0) 推荐(1) 编辑
摘要:如果是O(n3)的暴力肯定会T,那么我们想有没有一种方法可以不用直接让 AB 而是间接得到, 我们可以随一个n*1的矩阵 D 出来,矩阵乘法是满足结合律的: AB=C ABD=CD A(BD)=CD 这样我们就可以在O(n2)的复杂 阅读全文
posted @ 2024-08-12 07:09 zhengchenxi 阅读(39) 评论(0) 推荐(1) 编辑
摘要:1.九次九日九重色 一开始做的时候被题面给迷惑住了,没想到可以跳着 匹配(样例太水)。 那我们来考虑如何做,首先思路肯定是把能匹配的暴力求出来,根据不知道怎么搞的调和计数,这样的复杂度还不是很高,是O(NlogN),可以搞。 观察一下预处理出来的序列,是不是很熟悉。没错剩下的就是求最长上升子 阅读全文
posted @ 2024-08-08 19:09 zhengchenxi 阅读(52) 评论(1) 推荐(7) 编辑
摘要:比较好理解,相当于重建了一个二叉树,所有的父亲节点都为原来图中的边,儿子节点为点。 重构树就可以利用lca求两点间的最大(或者最小)边权以及一些树上操作。 较为简单的应用,需要用线段树来维护信息。 点击查看代码 #include<bits/stdc++.h> using namespace std; 阅读全文
posted @ 2024-07-26 19:37 zhengchenxi 阅读(37) 评论(4) 推荐(2) 编辑
摘要:sg函数的一个简单应用,把树拆成很多条以根节点为起点的链,就可以等效于nim问题。 我们把叶子节点的sg赋值为0,一个节点的sg值为它儿子节点的sg值+1的异或和。 最后判断根节点的sg值是否为0,再判断是先手必胜还是后手。 点击查看代码 #include<bits/stdc++.h> using 阅读全文
posted @ 2024-07-23 10:27 zhengchenxi 阅读(33) 评论(0) 推荐(1) 编辑
摘要:T1 看到这时限和内存,连一个数组都开不下,更别说离散化了,考试的时候我用了一个栈来模拟,相同留、进,不同退,可以说是很接近正解了,但还是没继续往下想,也是爆零了。 正解的思路很简单,这里引出一个概念,摩尔投票法,适用于超过半数(不能等于)的众数,可以在常数的空间下、O(n)的时间复杂度下查 阅读全文
posted @ 2024-07-20 12:09 zhengchenxi 阅读(22) 评论(0) 推荐(1) 编辑
摘要:1.floyed多源最短路 稳定的O(n3)预处理,O(1)查询。 加深理解:floyed的最外层枚举k时,k是任意枚举的,也就是说k可以用来维护其他操作,如赋给每个点一个点权,sort一下,再跑floyed,此时的k就可以作为走过路径的点权最大值,可与最短路一起维护。 点击查看代 阅读全文
posted @ 2024-07-13 19:45 zhengchenxi 阅读(23) 评论(0) 推荐(1) 编辑
摘要:1.hash(yyds) 先鸽着 2.KMP 模式串匹配,利用一个前缀函数border,求出模式串失配时下次匹配的开始处,大大减小了时间开销。 设字符串T=“aabaaf”,我们求一下T的前缀表(用一个数组名为next的数组表示)。 第一个子串是t0=“a”,易知该子串没有前缀也没有后缀,故next 阅读全文
posted @ 2024-07-11 20:56 zhengchenxi 阅读(33) 评论(1) 推荐(2) 编辑
摘要:一.至多选一个 点击查看代码 #include"bits/stdc++.h" using namespace std; int main() { for(i = 0; i < n; i++) //n是总共种类 for(j = vmax; j >= 0; j--) //vmax是背包最大容量 for( 阅读全文
posted @ 2024-07-11 14:58 zhengchenxi 阅读(22) 评论(0) 推荐(3) 编辑
摘要:正常的求环的tarjan 点击查看代码 int tp,s[N],in_stack[N]; int dfn[N],low[N],dfncnt; int scc[N],sc,sz[N]; void tarjan(int u) { dfn[u]=low[u]=++dfncnt; s[++tp]=u; in 阅读全文
posted @ 2024-07-09 20:04 zhengchenxi 阅读(27) 评论(0) 推荐(3) 编辑

点击右上角即可分享
微信分享提示