
#洛谷
文章平均质量分 66
PYL2077
OIer
展开
-
P7453 [THUSCH2017] 大魔法师 题解
题目链接感觉本题没有太多思维难度,纯DS大致思路把每个位置的三个属性看做一个 1×41\times 41×4 的矩阵(第四个位置维护常数项),并用线段树维护区间矩阵和同时,我们计算出六种修改操作的转移矩阵,修改时直接将原矩阵乘上转移矩阵。由于矩阵满足结合律与分配率,所以可以将单点修改扩展为区间修改。下面是分别六种操作的转移矩阵[1 0 0 01 1 0 00 0 1 00 0 0&nb原创 2021-04-25 19:49:09 · 286 阅读 · 0 评论 -
P7469 [NOI Online 2021 提高组] 积木小赛(民间数据)题解
题目链接我的做法竟然跟官方题解一样 /jk赛时的沧桑路程:O(n4)→O(n3)→O(n2log(n2))\mathcal O(n^4) \rarr \mathcal O(n^3) \rarr \mathcal O(n^2 \log (n^2))O(n4)→O(n3)→O(n2log(n2))O(n4)\mathcal O(n^4)O(n4):考虑每一个 TTT 的连续子串,用 O(n2)\mathcal O(n^2)O(n2) 的DP来计算它是否为 SSS 的子串。我们记当前枚举到的 TTT原创 2021-03-28 16:52:26 · 423 阅读 · 1 评论 -
P3480 [POI2009]KAM-Pebbles 题解
题目链接难度可能有点虚高其实这题并不难,只需要通过一个巧妙的方法将问题转化为阶梯Nim即可。我们设 cic_ici 为第 iii 堆可以取的石子数,显然最开始 ci=ai−ai−1c_i=a_i-a_{i-1}ci=ai−ai−1如果在第 iii 堆取出 xxx 个石子,那么 cic_ici 就会减少 xxx,同时 ci+1c_{i+1}ci+1 就会增加 xxx。那么,我们发现这就是一个倒着的解题Nim然后这题就做完了#include<cstdio>#include&原创 2021-03-18 15:45:40 · 179 阅读 · 0 评论 -
2021 某谷某计划后期测试 #4 T1
题目就不说了,免得侵权 (虽然好像是搬的)个人认为是一道非常有意思的思维题首先,将本题的可能答案(这里指的是答案二进制串的长度)分为两种满足 2ans>n−ans+12^{ans}>n-ans+12ans>n−ans+1满足 2ans≤n−ans+12^{ans}\le n-ans+12ans≤n−ans+1显然,第一种答案是一定合法的...原创 2021-02-24 19:32:42 · 144 阅读 · 0 评论 -
CF920F SUM and REPLACE 题解
题目链接本题是很典型的一道 线段树/分块与暴力结合的题与本题类似的还有如下几题:SP2713 GSS4P4145 上帝造题的七分钟2 / 花神游历各国CF438D The Child and Sequence个人本题是这几题中包装的最好的,也是唯一能交题解的一道本题的修改操作非常不好处理,也不容易合并,比较难用传统的线段树方法结局。但是这里的修改操作有一个特点,就是有效的修改次数非常少显然地,一个数 nnn 最多有 2n2\sqrt{n}2n 个因数,也就是说题目中的 D(i)≤2iD(i原创 2021-02-03 16:26:06 · 267 阅读 · 0 评论 -
P3554 [POI2013]LUK-Triumphal arch
[题目链接(https://www.luogu.com.cn/problem/P3554)首先,我们可以发现这题的可行方案具有单调性,所以可以考虑用二分来寻找最优答案显然,我们只需要考虑从根往下走的情况下,也就是不需要考虑回头因为,当 B设 fif_ifi 表示 iii 的子树内需要...原创 2021-01-12 11:53:17 · 196 阅读 · 0 评论 -
洛谷 P3066 [USACO12DEC]Running Away From the Barn G(LCA + 二分 + 差分)
题目链接刚看到这题以为是线段树合并,后来才发现边带权我们考虑每个点对别人做出的贡献,也就是看他被多少个节点计入了答案对于一个点 xxx,显然他只能对 xxx 到根的路径上的点做出贡献。由于这条路径上的点离 xxx 的距离满足单调性,所以受到 xxx 的贡献的节点一定是从 xxx 开始往上的连续一段节点。那么,我们考虑 dfs 维护当前节点 xxx 到根的路径上的节点,并用 二分 + LCA 求出对哪些做出贡献,最后用树上差分维护每个节点的答案这里贴的是没开 long long 的代码,因为开了原创 2020-12-09 16:19:33 · 331 阅读 · 0 评论 -
洛谷 P3551 [POI2013]USU-Take-out 题解
题目链接虽说是道绿题,但个人感觉思路不太好想首先,我们假设可以路过已消除的砖块,并考虑用栈维护我们将元素(砖块)按顺序压入栈,每当压入一个元素,就检查栈顶 k+1k+1k+1 个元素中是否恰好有一块黑色的砖。如果满足此条件,那么就将这 k+1k+1k+1 块消掉。把这个方案画成图就是这个样子可以发现,这些不同颜色的弧是互相包含的,并且可以证明不会两弧交叉那么,我们把上面方案的操作顺序倒过来,满足先做没有被包含的操作。这样就不会经过已经被消除的块了。这里感性理解一下为什么两弧不会交叉显然,原创 2020-12-08 10:26:24 · 278 阅读 · 0 评论 -
P4206 [NOI2005]聪聪与可可 题解
题目链接期望DP + 记忆化搜索感觉最和难得地方是预处理,处理完后的转移方程很显然设 p[i,j]p[i,j]p[i,j] 表示聪聪在 iii 点,可可在 jjj 点时,聪聪的下一步会走到哪里用 nnn 遍 bfs 预处理即可设 f[i,j]f[i,j]f[i,j] 表示聪聪在 iii 点,可可在 jjj 点时答案的期望值设 did_idi 表示点 iii 的度数设 e[i,j]e[i,j]e[i,j] 表示第 jjj 个与 iii 相邻的点那么,转移方程显然是:f[i,j]=1+{∑k=原创 2020-11-24 10:58:24 · 226 阅读 · 0 评论 -
洛谷 P5482 [JLOI2011]不等式组 题解
题目一道线段树题目水题开一棵线段树,第 iii 个位置维护当 x=ix=ix=i 时成立的不等式数量对于每次添加不等式的操作,先算出对应不等式的解集,可证这个解集是一段连续的区间(可能无限长)。接着将解集中对应的位置,并保存这个区间,方便以后撤销操作查询 x=kx=kx=k 时直接单点查询就可以了注意:本题要注意不等号的变向,以及 a=0a=0a=0 的情况代码懒得写了,原因如上...原创 2020-11-02 18:07:23 · 202 阅读 · 1 评论 -
洛谷 P2384 最短路 题解
题目链接比较套路的一道题,本题的方法也可以用来做树的最大乘积独立集由于本题需要取模,所以不能直接求最短路我们考虑将每条边取对数,也就是将边权为 www 的边变为 log2w\log_2wlog2w这样,根据幂的性质,我们就将乘积最短路转化为了普通最短路,证明显然最后记得要把边权变回来输出#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include原创 2020-10-23 17:40:11 · 305 阅读 · 0 评论 -
P6810 「MCOI-02」Convex Hull 凸包 题解
题目链接看绝大多数题解都是莫反,这里写个不用莫反的(其实就是推式子)∑i=1n∑j=1mτ(i)τ(j)τ(gcd(i,j))\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\tau(i)\tau(j)\tau(\gcd(i,j))i=1∑nj=1∑mτ(i)τ(j)τ(gcd(i,j))∑i=1nτ(i)∑j=1mτ(j)τ(gcd(i,j))\sum\limits_{i=1}^{n}\tau(i)\sum\limits_{j=1}^{m}\tau(j)\原创 2020-09-13 11:04:55 · 166 阅读 · 0 评论 -
洛谷 P2746 [USACO5.3]校园网Network of Schools (缩点)
题目链接本题的第一问的确很模板,但第二问却没有那么简单。看很多题解都直接贴结论,就算有讲解的也极其简略,这里写一篇较详细的首先,将原图进行缩点,形成一个由若干个连通块组成的DAG。我们先考虑单个连通块的情况:很显然是 出度为零的点数与入度为零的点数的最大值,因为一条边可以给两个(一个入度为零一个出度为零)点做出贡献。这样,不管你从哪个点开始,你都可以走到一个末端点 xxx(出度为零),从而走到一个与 xxx 连通的一个初始点(入度为零)。接下来,因为你在一个初始点,所以你可以走到该连通块内所有的末原创 2020-08-25 11:07:48 · 204 阅读 · 0 评论 -
洛谷 P1073 最优贸易 (最短路)
P1073 最优贸易看网上有很多很麻烦的做法,这里提供一个最简单的设 disidis_idisi 表示 111 到 iii 的所有路径上的最小点权(水晶球价格),distidist_idisti 表示 iii 到 nnn 的所有路径上的最大点权。那么,最后的答案就是 maxi=1n{disti−disi}\max\limits_{i=1}^n \{dist_i-dis_i\}i=1maxn{disti−disi}因为每个点可以经过多次,用的是SPFA#include<cstdio原创 2020-08-23 19:25:28 · 256 阅读 · 0 评论 -
洛谷 P6786「SWTR-6」GCDs & LCMs
由于现在还没有入到主题库里,暂时没有题号和题目链接题目大意给出一个长度为 nnn 的序列 aaa,你需要找出它的一个子序列 bbb(设 bbb 的长度为 mmm),并满足以下条件对于所有 (1≤i≤m)(1\le i \le m)(1≤i≤m),bib_ibi 要么是 bbb 中最大的元素,要么存在一个 bj>bib_j>b_ibj>bi,满足 bi+bj+gcd(bi,bj)=lcm(bi,bj)b_i+b_j+\gcd(b_i,b_j)=\operatorname{l原创 2020-08-22 18:49:59 · 533 阅读 · 0 评论 -
CF474E Pillars (线段树优化DP)
题目链接题目大意给出一个长度为 nnn 的序列 aaa 和一个参数 mmm,要求求出一个最长的子序列,满足相邻元素的差大于等于 mmm解题思路本题跟LIS的 O(nlogn)\operatorname{O}(n\log n)O(nlogn) 做法非常相似,需要用到桶。首先,我们要将 a[i]a[i]a[i] 离散化。设 f[i]f[i]f[i] 表示以 a[i]a[i]a[i] 结尾的最长满足条件的子序列的长度,pre[i]pre[i]pre[i] 表示 f[i]f[i]f[i] 从 f[p原创 2020-08-10 15:56:54 · 265 阅读 · 0 评论 -
CF115E Linear Kingdom Races(线段树优化DP)
题目链接看完题后,你的可能第一个想法是考虑每场比赛是否进行,并计算相应的路费。但是,如果两次比赛的路线重合,路费就只用支付一次。由此就产生了后效性,对我们的DP造成了困难。那么,我们可以反过来想:考虑每条路是否要支付路费(修路),并算出所有可进行的比赛赚到的钱。设 f[i]f[i]f[i] 表示 1…i1\dots i1…i 条路修复若干条路后可以赚到的最多的钱。转移方程:f[i]=f[i−1]f[i]=f[i-1]f[i]=f[i−1],即不修第 iii 条路。f[i]=max0≤j&l原创 2020-08-10 10:53:54 · 389 阅读 · 0 评论 -
洛谷 P3572 [POI2014]PTA-Little Bird 题解 (单调队列优化DP)
题目链接我们设 f[i]f[i]f[i] 表示小鸟从第 111 棵树跳到第 iii 棵树的最小花费。那么,朴素的 O(n2)\operatorname{O}(n^2)O(n2) 转与方程就是 f[i]=f[j]+[d[j]≤d[i]]f[i]=f[j]+[d[j]\le d[i]]f[i]=f[j]+[d[j]≤d[i]],其中 [d[j]≤d[i]][d[j]\le d[i]][d[j]≤d[i]] 如果中括号中的条件满足则为 111,否则为 000我们可以发现,对于 x<yx <yx原创 2020-08-05 10:17:52 · 346 阅读 · 0 评论 -
洛谷 P3594 [POI2015]WIL-Wilcze doły 题解
题目链接以前听人讲过,现在全都忘了QwQ,特此写一个题解首先,为了选到的区间尽可能的长,我们要把该的区间中尽可能多的数变为 000,并且满足消掉的数字和尽可能大。我们考虑用双指针维护区间 [l,r][l,r][l,r],并且用一个单调队列维护该区间中的长度为 ddd 的 区间,满足这些区间和单调递减。那么,如果 sum(l,r)−sum(删去的区间)<psum(l,r)-sum(删去的区间)<psum(l,r)−sum(删去的区间)<p,则 ++r,否则 ++l#include&原创 2020-08-05 09:54:14 · 231 阅读 · 0 评论 -
洛谷 P3567 [POI2014]KUR-Couriers (主席树+树上二分)
题目链接题目大意解题思路较简单的一道主席树题每次询问时,先处理处当前的区间,然后在主席树上二分设当前二分区间为 [l,r][l,r][l,r],且满足要求的最少出现次数为 kkk(k=⌊r−l+12⌋+1k=\lfloor \frac{r-l+1}{2} \rfloor +1k=⌊2r−l+1⌋+1)。如果 [l,r][l,r][l,r] 左右两半的值都小于 kkk:直接退出并输出 000否则,左右两半中一定有且仅有一半的值大于等于 kkk:找到那一半并继续二分#include<原创 2020-06-23 12:18:32 · 283 阅读 · 0 评论 -
洛谷 P2633 Count on a tree(BZOJ2588)(主席树+树上差分+LCA)
题目链接题目大意给出一棵 nnn 个点的树(点带权),有 mmm 组询问每次询问给出 x,y,kx,y,kx,y,k,求 xxx 到 yyy 的路径上第 kkk 小的点权解题思路主席树中一个核心的思想,就是前缀和。在处理区间 kthkthkth 时,我们利用的是朴素的序列前缀和;如果我们把这个问题放到树上,我们可以用树上差分(前缀和)设以 root[x]root[x]root[x] 为根的主席树维护的是根到 xxx 路径上的点。那么,对于任意一条路径 [x,y][x,y][x,y],可以表示为原创 2020-06-23 12:03:09 · 182 阅读 · 0 评论 -
洛谷 P3224 [HNOI2012]永无乡(并查集+线段树合并+树上二分)
原题链接很模板的一道线段树合并开始时,我们对于每一个点都开一棵线段树,储存每一种权值的点在此连通块出现的次数并用并查集维护连通块的信息对于接下来的每一次加边,将两连通块对应的线段树合并,并更新并查集中的连通情况查询时,树上二分即可#include<cstdio>#include<iostream>using namespace std;const int Maxn=100000+10;const int Maxm=5000000+10;int a[Maxn],ro原创 2020-06-22 10:31:20 · 225 阅读 · 0 评论 -
洛谷 P3899 [湖南集训]谈笑风生
原题链接题目大意有一棵 nnn 个节点的有根树,有 mmm 组询问每次询问给出 a,ka,ka,k,求有多少个三元组 (a,b,c)(a,b,c)(a,b,c),满足 a,ba,ba,b 都是 ccc 的祖先,并且 a,ba,ba,b 之间的距离不超过 kkk刚开始没有思路,看了题解的分类讨论后发现可以很轻松地转化为线段树合并解题思路考虑两种情况bbb 是 aaa 的祖先:bbb 就必须在 aaa 到根的路径上的可能方案数就为 min(d[a]−1,k)\min (d[a]-1,k)min原创 2020-06-22 08:52:50 · 189 阅读 · 0 评论 -
P3047 [USACO12FEB]Nearby Cows G 解题报告
题目链接设 f[i][j]f[i][j]f[i][j] 为离点 iii 距离为 jjj 的点的点权和因为这道题中点的状态跟祖先和儿子都有关系,所以我们要分两部转移首先,对于点 xxx,我们只考虑在 xxx 的子树中距离为 jjj 的点,则转移方程为 f[x][j]=∑f[y][j−1]f[x][j]=\sum f[y][j-1]f[x][j]=∑f[y][j−1],其中 yyy 是 xxx 的儿子然后,考虑用父亲来更新儿子:f[y][j]=f[y][j]+f[x][j−1]−f[y][j−2]f[y原创 2020-05-20 12:09:16 · 254 阅读 · 0 评论 -
洛谷 P1272 重建道路 解题报告
题目链接一道接近模板的树形背包,难点在于割边是考虑返祖边的问题设 f[i][j]f[i][j]f[i][j] 为在以 iii 为根的子树中要割出 jjj 个节点的子树,最少需要割掉多少条边。注意这个割出来的子树一定要以 iii 为根初始化 f[x][1]f[x][1]f[x][1] 为 xxx 的度数转移方程为:f[x][j]=min(f[x][j],f[x][j−k]+f[y][k]−2)f[x][j]=min(f[x][j],f[x][j-k]+f[y][k]-2)f[x][j]=min(f[x原创 2020-05-19 14:38:11 · 208 阅读 · 0 评论 -
洛谷 P1533 可怜的狗狗 题解
题目链接这题很多做法都可以过,这里用的是离线 + 平衡树Treap题目中:给出的区间不互相包含,是离线操作的一个重要条件我们将给出的区间按左端点从小到大排序,当左端点相同时,按右端点从小到大排序,满足区间访问的元素位置递增(如果有区间互相包含就无法实现)对于每一个区间 [li,ri][l_i,r_i][li,ri],我们将当前平衡树维护的区间的左右端点进行调整,同时进行插入与删除操作...原创 2020-05-08 16:10:28 · 194 阅读 · 0 评论 -
P3254 圆桌问题 题解
题目链接一道模板的带权二分图匹配工作单位和餐桌分别为该二分图的两组点源点向每个单位所对应的点连一条流量为 rir_iri 的边,表示有 rir_iri 个人每个餐桌所对应的点想汇点连一条流量为 cic_ici 的边,表示可以容纳 cic_ici 人每一个单位向每一个餐桌连一条流量为 111 的边,表示(这个单位)可以有坐在对应的餐桌。最后,如果最大匹配小于人数总和,说明没有...原创 2020-04-23 09:41:39 · 237 阅读 · 0 评论 -
洛谷 P2829 大逃离 题解
题目链接一道模板的次短路设 dis[x],dist[x]dis[x],dist[x]dis[x],dist[x] 分别为点 111 到 xxx 的最短路和次短路长度我们只需在跑最短路时,顺带更新一下次短路由于每个点可以经过多次,我们只能使用 SPFA对于每条边 [x,y][x,y][x,y],考虑 dist[y]dist[y]dist[y] 的转移:最无脑的一种,dist[y]=di...原创 2020-04-21 11:41:11 · 279 阅读 · 0 评论 -
洛谷 P2286 HNOI2004 宠物收养场 解题报告
题目链接很模板的一道 Treap,在基本的插入删除操作的前提下,只需支持寻找前驱和后继在寻找前驱后继时,记得要考虑边界情况(就是没有前驱或后继)#include<cstdio>#include<iostream>#include<algorithm>#include<cstdlib>#include<ctime>using...原创 2020-04-21 09:54:44 · 177 阅读 · 0 评论 -
P3261 [JLOI2015]城池攻占 题解
题目左偏树 + dfs + 线段树懒标签思想前置芝士:需要掌握线段树同时维护加法和乘法每个城市维护一个小根堆,包括乘法与加法标签,和骑士当前的战斗力首先,将每个骑士加入到他的起始城市所在的堆中接着,dfs 遍历所有城市对于城市 xxx,合并所有在他子树中的堆(包括城市 xxx),我们将这个合并后的大堆成为 “城市 xxx 的堆”然后,将所有攻陷不了城市 xxx 的骑士弹出(v(i)&...原创 2020-04-16 12:29:26 · 152 阅读 · 0 评论 -
P1552 [APIO2012]派遣 题解
题目左偏树 + 树形DP这题的思路还是比较好想的首先,对于每一个节点维护一个左偏树(大根堆),同时维护堆内忍者个数和费用和接着,我们用 dfs 从下往上合并当我们合并到点 xxx 时,有可能目前堆内的总费用之和超出预算,所以我们利用贪心的思想将费用最高的忍者依次弹出,直到总费用不超过预算设 s[x],c[x],id[x]s[x],c[x],id[x]s[x],c[x],id[x] 分别...原创 2020-04-15 10:58:21 · 190 阅读 · 0 评论 -
P1712 [NOI2016]区间 题解
题目线段树 + 双指针首先,将区间的端点离散化,并且将区间按长度排序,使得我们连续选的若干个区间最长与最短的长度相差最小接着,我们用双指针寻找长度为 mmm 的区间集合(mmm 个区间),当区间被选中时,将它所覆盖的地方区间加一,取消选中时减一。如果有任意一个位置被覆盖了 xxx 次,说明这是有 xxx 个区间公共点;每次询问所有位置被标记次数的最大值 maxvmaxvmaxv,如果 max...原创 2020-04-09 18:31:57 · 292 阅读 · 0 评论 -
区间DP - UVA10617 Again Palindrome 题解
题目链接一道经典的区间DP处理回文串设状态 f[i][j]f[i][j]f[i][j] 为 s[i∼j]s[i\sim j]s[i∼j] 中回文子串的个数,这里回文子串数等价于删除字符的方案数显然,f[i][j]f[i][j]f[i][j] 要从 f[i+1][j]f[i+1][j]f[i+1][j] 和 f[i][j−1]f[i][j-1]f[i][j−1] 转移过来。但是,在 f[i+...原创 2020-04-02 12:22:27 · 169 阅读 · 0 评论 -
洛谷 P1505 [国家集训队]旅游 题解
题目此题的关键,在于维护区间取反的懒标记,以及取反后区间最大值,最小值与和的变化首先,我们肯定先要把边权转化为点权。这个相信大家都会,每个点权等于他返祖边的权值设 maxv[k],minv[k],sum[k]maxv[k],minv[k],sum[k]maxv[k],minv[k],sum[k] 分别为区间 kkk 的最大值,最小值与和;rev[k]=0/1rev[k]=0/1rev[k]=...原创 2020-03-31 10:21:08 · 229 阅读 · 0 评论 -
洛谷 P4315 月下“毛景树”
题目又是一道维护边权的题对于每一个节点,我们把他的点权设为他跟他父亲之间的边权,这样就轻松地把边权转化为了点权但是,这题的重点就在 同时维护区间加和区间修改对于一个区间 kkk,我们设 maxv[k]maxv[k]maxv[k] 为区间最大值,add[k],c[k]add[k],c[k]add[k],c[k] 分别为区间加和区间修改的懒标记跟P3373 【模板】线段树 2很像的是,我们需...原创 2020-03-30 12:11:23 · 142 阅读 · 0 评论 -
P2146 [NOI2015]软件包管理器 题解
题目一道树剖的变形题跟普通树剖不一样的是,每次安装/ 卸载软件后,需要把区间中的值统一改为 0/10/10/1 。而这个也并不难实现sum[k]sum[k]sum[k] 表示区间 kkk 中已安装的软件个数(111 的个数),并不需要再开一个数组维护 lazy-tag,可以理解为将求和和 lazy-tag 合并了每次要将区间赋值 0/10/10/1 时,就直接将 sum[k]sum[k]s...原创 2020-03-29 11:32:49 · 196 阅读 · 0 评论 -
洛谷P2045 方格取数加强版
题目:Link网络流 - 费用流一道比较好建模的题,重点是怎样然每个数只能被取一次控制每个点被走的次数,我们可以很容易想到拆点对于每个点,我们在入点和出点之间连两条边,一条流量为 111,费用为该格子的权值;另一条流量为 ∞\infty∞,费用为 000。除此之外,每个点还要分别向右边和下面的连边,流量为 ∞\infty∞,费用为 000最后,超级源点 sss 向点 (1,1)(1,1)...原创 2020-03-02 15:37:19 · 223 阅读 · 0 评论