摘要: L2-002 链表去重 思路 为了将删除的和未删除的分开我们给他们赋权$node[i].key$,然后按权值排序后即为所求。 然后在存储链式结构的时候可以采取类似于链式前向星的方法, \[ next存储下一个节点位置的地址\\th意为this存储这个位置的地址\\val则为边权 \] 这里改了的是结 阅读全文
posted @ 2020-08-29 23:15 waryan 阅读(165) 评论(0) 推荐(1) 编辑
摘要: L2-002 链表去重 思路 利用第一次全部赋值$dis$为无穷大然后去更新路径,使得能求出完整的路径。 \(path[j]=i\),存的是$i->j$。 遍历路径的时候需要用从尾$->$头,从$path[d]->path[s]$ 然后在计算路径的多种可能时需要对如果到达某个为止是相同的距离时候相加 阅读全文
posted @ 2020-08-29 23:14 waryan 阅读(91) 评论(0) 推荐(0) 编辑
摘要: 思路 求哪里安装雷达我们可以变为线段交集问题,然后我们考虑怎么样贪心是最优的。 如图,第一个安装雷达的范围我们是必须选的,此时的右端点坐标为$maxx$所有左端点小于这个的我们都可以直接跳过,因为他们有交集。 然后当到达左端点大于他的时候我们需要再贪一个,然后同上,一直更新。 #include <b 阅读全文
posted @ 2020-08-17 22:45 waryan 阅读(79) 评论(0) 推荐(0) 编辑
摘要: #NC19858战争(war) 题意 如果后面的人和前面的人矛盾那么后面的人一定说谎了,输出他的位置。否则如果没有说谎输出$K+1$ 思路 二分长度,因为如果二分的区间[l,mid]有人说谎那么[r,mid]就不用判断了。但是如果[l,mid]没有人说谎,那么我们就要将mid扩大继续寻找说谎的人。仔 阅读全文
posted @ 2020-08-12 21:01 waryan 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 树剖的换根分析 (先以1为根建树)在求换根后的$x$的子树的相关信息(最小值为例)时,我们可以这样考虑: ​ 如果现在的根为$r$,当我输入查询$x$的子树分为以下几种情况: 1 .\(x==r\),此时我们要查询的子树的最小值(以$r$为根)就是以1为根时的全局最小值 2 .当$x\quad r$ 阅读全文
posted @ 2020-08-11 17:16 waryan 阅读(184) 评论(0) 推荐(1) 编辑
摘要: 树链剖分 给$x->y$结点最短路径上所有节点的值都加上$z$ 求$x->y$结点最短路径上所有节点的值之和 给$x$为根节点的子树内所有节点值都加上$z$ 求以$x$为根节点的子树内所有节点值和 P3384 【模板】轻重链剖分 #include <bits/stdc++.h> #define IN 阅读全文
posted @ 2020-08-10 20:31 waryan 阅读(122) 评论(0) 推荐(0) 编辑
摘要: LCA \(LCA\)=最近公共祖先。 1.初始化$lg$数组,其代表$lg2+1$。 2.利用倍增的思想去求$fa[u][i]$,在$u$点向上走$2^i$步时的祖先是谁。深度$dep$也同时求出。 3.初始化$fa[u][0]=father$ 4.\(LCA\) int LCA(int x,in 阅读全文
posted @ 2020-08-10 20:29 waryan 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 状压dp 状压$dp$可以解决$n<=21$的情况。 在状压时$dp[i][j]$,代表在第$i$个位置时且走过二进制状态$j$的最佳答案。 将状态压成二进制的形式去求解。 例:10100110代表经历了2、3、6、8四种状态。 时间复杂度$O(n2 2n)$ 题目描述 房间里放着 n*n块奶酪。一 阅读全文
posted @ 2020-08-07 14:57 waryan 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 迭代加深 在限定的步数内,进行最优化剪枝。 一般题给都会给出限定条件。 P2324 [SCOI2005]骑士精神 #include <bits/stdc++.h> #define INF 0x3f3f3f3f #define DOF 0x7f7f7f7f #define endl '\n' #def 阅读全文
posted @ 2020-08-07 11:41 waryan 阅读(81) 评论(0) 推荐(0) 编辑
摘要: P1379八数码难题 双端队列 用单队列实现双端队列时需要注意标记数组是不一样的。我们让我们想要的第一个队列用$1$来标记,第二个用$2$来标记,那么当他们碰面的时候也就是$1+2=3$的时候就是我们想要的答案。 双端队列开数组来记录权值。 标记要标记传标记$vis[now] = vis[cur]; 阅读全文
posted @ 2020-08-06 22:25 waryan 阅读(86) 评论(0) 推荐(0) 编辑
摘要: E1 - Weights Division (easy version) 题意 给你n个点和最高费用S,然后给你n-1条边,和每条边的边权。让你求如果可以$w_i:=\frac{2}$,需要最少多少步可以满足$cost\leq S$。 思路 先$dfs$求出每个边的边权和经过每条边的次数。 然后优先 阅读全文
posted @ 2020-08-06 18:13 waryan 阅读(233) 评论(0) 推荐(0) 编辑
摘要: Codeforces Round #598 (Div. 3) 思路 首先我们可以确定是选择的team长度最长为5,因为如果是6的话我们很可能有更优的选择权,而且当我们倒着弄$i->i+2\quad i->i+3\quad i->i+4$是可以遍历每一种可能的。 在遍历的过程中我们在$minn$数组中 阅读全文
posted @ 2020-08-05 17:52 waryan 阅读(104) 评论(0) 推荐(0) 编辑
摘要: E - Binary Subsequence Rotation 思路 1.当s串和t串中0/1的数量不一样的时候s是不可能变化到t的。 2.要将s串变为t串那么只有每个字符都相等情况下。为了让s串变为t串且每次操作的贡献最大,那么我们需要的是变换01或者10交替串,因为只有这样才会使我们选择的每个位 阅读全文
posted @ 2020-08-04 11:00 waryan 阅读(86) 评论(0) 推荐(0) 编辑
摘要: 题意 给你一个序列,你能进行k次操作。其中能进行z次向左操作,但是不能进行连续的向左操作。 思路 转移方程是比较容易想出来的 $dp[i][j]$表示在第$i$位时进行$j$次向左操作。 向右: \[ dp[i][j]=max(dp[i][j],dp[i-1][j]+a[j]) \] 向左: \[ 阅读全文
posted @ 2020-08-02 23:19 waryan 阅读(59) 评论(0) 推荐(0) 编辑
摘要: C. Uncle Bogdan and Country Happiness 思路: 第一个判断条件: 设经过某个点的总人数为sum[u],幸福指数h[u],开心的人数good,不开心的人数bad。 \[ good+bad=sum\\good-bad=h \] 根据以上式子我们可以推出 \[ 2*go 阅读全文
posted @ 2020-08-02 04:00 waryan 阅读(95) 评论(0) 推荐(0) 编辑