数据结构
文章平均质量分 62
仰望星空的蚂蚁
梁东饪猛虎,汴水烹蛟龙
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【学习笔记】CF1651F Tower Defense
均摊经典题。原创 2023-11-09 20:04:52 · 194 阅读 · 0 评论 -
【学习笔记】CF627E Orchestra
比较经典的"均摊"题目原创 2023-05-15 16:38:42 · 650 阅读 · 0 评论 -
【学习笔记】「北大集训 2021」经典游戏
题面是写的真的烂。但是不妨碍这是一道神题。原创 2023-05-04 15:32:31 · 804 阅读 · 0 评论 -
【学习笔记】CF603E Pastoral Oddities
非常聪明的做法。难以有套路可循。原创 2023-04-24 16:24:14 · 509 阅读 · 0 评论 -
【学习笔记】CF607E Cross Sum
被卡自闭了。原创 2023-04-27 15:05:46 · 438 阅读 · 0 评论 -
【学习笔记】CF626G Raffles
小清新结论题。然而石锤了,我不会写代码。原创 2023-04-30 21:10:32 · 894 阅读 · 0 评论 -
【学习笔记】「JOISC 2022 Day4」鱼 2
代码比想象中的难写。原创 2023-05-02 09:41:08 · 1322 阅读 · 0 评论 -
【学习笔记】[北大集训 2021] 魔塔 OL
比较经典的“分块”题目原创 2023-05-02 19:28:19 · 1085 阅读 · 0 评论 -
【学习笔记】NOIP暴零赛4
没错,我还是没有做出来数据结构题。原创 2023-02-20 16:28:54 · 373 阅读 · 0 评论 -
【学习笔记】NOIP暴零赛3
思维确实很妙,但是能不能把代码难度降低一点???原创 2023-02-18 15:27:00 · 722 阅读 · 0 评论 -
【学习笔记】trie树
感觉$trie$树还是很厉害的。原创 2022-10-20 16:07:01 · 296 阅读 · 0 评论 -
【学习笔记】NOIP模拟赛
没想到啊没想到竟然不会写代码了原创 2022-07-29 16:20:38 · 364 阅读 · 0 评论 -
【学习笔记】根号思维题
不知道摘要写什么了。原创 2022-07-19 20:58:37 · 198 阅读 · 0 评论 -
[JSOI2009] 等差数列
难度虚高。看到修改 + 区间查询 , 不难想到 线段树 。首先我们可以考虑维护 差分序列 而不是原序列。那么一个等差数列长这个样子 : x y y y …那么想到充分利用首项,考虑从后往前贪心,在一堆相同的后缀前面再塞一个不同的数。那么怎么表示一个区间的状态呢 ? 我们发现只有两种情况。前缀剩了 y y y …不剩剩余状态设计我们还要考虑是否挖掉右端点 (因为要抵消),需要用不同的 dp 值来存。#include<bits/stdc++.h>#define ll long原创 2022-04-23 22:06:19 · 275 阅读 · 0 评论 -
【题解】[HNOI2012] 双十字
这题呢,暴露出来一个问题,就是 我对暴力数据结构的掌控力还是不强导致最后手忙脚乱还是没调出来。(当然思维上也有一些问题,有点想复杂了)第一种做法,树状数组。∑i=1n∑j=in∑k=jndi=∑i=1ndi(n−i+1)(n−i+2)2=12∑i=1n((n2+3n+2)×di−(2n+3)×i×di+i2×di)\sum_{i=1}^n\sum_{j=i}^n\sum_{k=j}^nd_i \\=\sum_{i=1}^nd_i\frac{(n-i+1)(n-i+2)}{2} \\=\frac{1原创 2022-04-16 14:17:07 · 335 阅读 · 0 评论 -
【题解】[POI2008] ROB-Robinson
好难啊~~~嗯,因为这个船是不规则的,所以比较难以认知。同时因为它可以上下左右移动,所以情况比较复杂。但要求船全部合法比较麻烦,可以只要求边界合法。比如说我从上往下走时,只要最下面的边界合法即可,因为其他点都是和原来的船体重合的。可以用 bitset 来维护。因为有 4 个方向比较烦,所以考虑对地图进行旋转,因此要维护 4 个 地图 。地图旋转公式?(推这个很烦)记船的 最大长度 为 b ,最大宽度 为 a 。向下 (x,y)→(x,y)(x,y)\to (x,y)(x,y)→(x,y)原创 2022-04-06 22:16:52 · 448 阅读 · 0 评论 -
关于树上的三种标号方式
括号序列原理:对原树进行一次 dfs 遍历,到一个节点就加入一个 左括号 ,再加一个表示节点编号的 辅助点 ,回溯时再加入一个 右括号 。比如:构建void dfs(int u,int topf) { val[++cnt]=0; c[cnt]=1; val[++cnt]=-1; //这个地方插的是节点编号 id[u]=cnt; for(auto v:g[u]) { if(v!=topf) { dfs(v,u); } } val[++cnt]=1; c[cnt]=1;原创 2022-04-03 10:17:47 · 971 阅读 · 0 评论 -
【题解】「SCOI2011」棘手的操作
挺妙的一道题。我们用线段树来解决这个问题。考虑集合内加 v 这个操作。如果我们把它转化为区间操作就好了。那么我们要求编号连续。怎么给每个点编号呢?首先把操作序列离线下来,然后用带权并查集维护在集合内的 相对编号 ,合并的时候把被合并的集合的 相对编号 都加上合并集合的大小即可。时间复杂度 O(nlogn)O(nlogn)O(nlogn) 。#include<bits/stdc++.h>#define lc(x) t[x].ch[0]#define rc(x) t[x].ch[1原创 2022-03-31 20:34:04 · 462 阅读 · 0 评论 -
【题解】[NOI Online 2022 提高组] 如何正确地排序
说实话没想到三维偏序实在是太。。。k=2利用轮换性,不难得到答案。k=3记 g(i,j,k)=ak,i+ak,jg(i,j,k)=a_{k,i}+a_{k,j}g(i,j,k)=ak,i+ak,j 。∑i=1n∑j=1n∑k=13g(i,j,k)−∑i=1n∑j=1n∑k=13g(i,j,k)[g(i,j,k)是中位数]\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^3 g(i,j,k)-\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^3g(i,j,原创 2022-03-28 22:22:51 · 934 阅读 · 0 评论 -
【题解】「BZOJ4504」K个串
考虑二分答案 233如果子树 max\maxmax 都不能作为答案的话,就直接返回。每找到一个叶节点就统计一次次数。空间复杂度 O(nlogn)O(n\text{log}n)O(nlogn) 。时间复杂度 O((n+klogn)logN)O((n+k\text{log}n)\text{log}N)O((n+klogn)logN) 。#include<bits/stdc++.h>#define ll long longusing namespace std;const int N原创 2022-02-24 16:25:58 · 729 阅读 · 0 评论 -
【题解】[HEOI2015] 公约数数列
sol:利用分块思想,尽量利用整块的信息查询。首先只考虑查询。从左往右遍历每个整块,如果 gcd(tmp,t[i].gcd)<tmp\gcd(tmp,t[i].\gcd)<tmpgcd(tmp,t[i].gcd)<tmp 就暴力遍历块内所有元素,否则直接整块查询(用 std::map 暴力即可)。每次修改就暴力重构块。我们来分析时间复杂度为什么是对的。根据 gcd\gcdgcd 性质不难得出每次 tmptmptmp 至少退化成原来的一般,所以暴力遍历的块的个数不超过 log原创 2021-10-07 10:40:03 · 245 阅读 · 0 评论 -
【题解】「JOISC 2016 Day 3」回转寿司
想一下传送带 (233)我记得我和 lh 说了可以对于一个整块把一堆操作放在一起处理暴力匹配是 O(nq)O(nq)O(nq) 的。但是如果加一个优先队列呢?那你就可以在 O(BlogQi)O(BlogQ_i)O(BlogQi) 的时间内复原这个块 (其中 QiQ_iQi 是对这个整块操作的次数)你再算一下重构的次数和每次操作 insert 的那些点不就完了嘛。#include<bits/stdc++.h>#define db double #define ll long l原创 2021-10-05 17:28:15 · 433 阅读 · 0 评论 -
【题解】[省选联考 2021 A/B 卷] 宝石
sol:本人绞尽脑汁在想只带一个 log 的算法 (可惜没有想出来)最后还是只能二分 233 …核心思想 : 倍增 + 二分答案。对于左边部分路径,由于起点是固定的,可以直接倍增搞定。这时候右边部分路径的起点就是 x (我们通过上一个步骤求出来的答案)其实左半部分和右半部分的求法本质不同(这个可以自行探究233,因为前者是固定了一个端点呀)考虑二分答案。这个时候相当于固定了终点,可以反过来求最远的起点,判断两条路径能否拼起来即可。最后的问题在于如何求出 父亲节点中第一个宝石为 i 的位置 。原创 2021-10-01 20:46:29 · 274 阅读 · 0 评论 -
【题解】Luogu_P2633 Count on a tree
sol:这道题是求两点间第 k 小的数。常规做法树链剖分是三个 log ,LCA + 主席树可以做到一个 log 。所以提供一个维护树上信息的新姿势:用主席树维护当前点到根的路径的信息,借助 LCA 做到直接查询。(经典的运用还比如求路径最小 / 大值之类的)。局限性在于不能维护较复杂的信息,以及不支持修改 (这是主席树的通性吧)。#include<bits/stdc++.h>using namespace std;const int Maxn=1e5+5;int n,m,lsh原创 2021-10-01 18:10:26 · 133 阅读 · 0 评论 -
【题解】[POI2006」Tet-Tetris 3D
sol:考虑用树套树维护二维信息。这里标记比较复杂,所以不好下传,考虑 标记永久化。每次修改区间的时候,把遍历到的点都修改 mx ,对于完全覆盖的区间则同时修改 tag 和 mx 。(这里的修改可以是区间加,也可以是区间取 max)。查询的时候,如果是完全覆盖的区间就返回 mx ,否则当前点的 tag 也要做贡献。时间复杂度 O(nlog^2d) 。#include<bits/stdc++.h>using namespace std;const int Maxn=1050;i原创 2021-10-01 09:05:44 · 269 阅读 · 0 评论 -
【题解】[COCI2017-2018#2] Garaža
考点:分治思想 + 线段树。 (区间问题常见思考方式考虑区间答案 = 左区间答案 + 右区间答案 + 跨区间答案。注意到每次加入一个数时 gcd 要么不变,要么缩小到原来的 1/2所以本质上只用 log a_i 个不同取值这样双指针扫描就可以通过本题。#include <bits/stdc++.h>#define fi first#define se second#define pii pair<int, int>#define ll long longusing原创 2021-10-01 08:51:09 · 198 阅读 · 0 评论 -
【题解】Luogu_P4198 楼房重建
又是一种认识线段树的新姿势 ?问题转化能力太差了 qwq.考虑怎么求出答案。从左往右扫一遍,选一个最长递增序列的长度就是答案。我们需要维护两个信息:rmax,len 。设 pushup(l,r,x) 表示区间 [l,r] 的左高度大于 x 的最大区间长度。为了保证方案合法,我们并不需要让 左端点 rmax < 右端点 lmin如果左端点 rmax<=x ,说明左区间没有答案,递归右区间返回答案否则说明 rmax>x ,返回左区间的一部分 + 右区间的全部每次单点修改会涉原创 2021-09-02 21:23:53 · 170 阅读 · 0 评论 -
【题解】「JOISC 2021 Day1」饮食区
solution:考虑算法:整体二分 。考虑没有删除怎么做。因为满足单调性,可以直接二分 使得队列人数第一次 ≥Bi\geq B_i≥Bi 时的修改编号 。加上删除操作后还是有单调性,只不过要 预处理出删除操作对查询的影响 。这里抛出一个结论:从左往右扫描,删除对当前询问影响=当前加入队列的总人数-当前实际人数。考虑后面的,本质上就是每次全部元素对 0 取 max ,考虑 区间最值线段树 。维护懒标 (p,q)(p,q)(p,q) 表示区间里的数 +p 后对 q 取 max ,合并结果大致为:原创 2021-08-28 13:28:53 · 382 阅读 · 0 评论 -
【题解】[JOISC2020] 扫除
solution:果不愧是 JOISC 毒瘤题。正确的思考方式:如果只有往右扫的操作,那么操作的顺序就不重要了,那么一个点往右移动只在于能包含它的最能往右的操作。如果还有往上扫的操作,那么一个高度为 lll 的往右扫的操作,实际上只能把还没扫除范围的点往右移,注意到被扫除范围的点一定是 [1,x][1,x][1,x] 范围内的点(可以通过按顺序操作线段树维护),那么这个右扫的实际作用范围就是横坐标为 [x+1,n−l][x+1,n-l][x+1,n−l] 的点。把所有横向操作的影响范围预处理出来后原创 2021-08-23 22:30:24 · 717 阅读 · 0 评论 -
【题解】「JOISC 2020 Day2」有趣的 Joitter 交友
solution:部分分好少。若是有双向连边,那么双向边联通的集合可以视为一个集合。对于一个大小为 s 的极大团 T 对答案的贡献为:T 内部有 s(s-1) 条边若有 k 个不同的节点连向 T ,有 sk 条边in[u] : 入边,连向它的点的集合out[u] :出边,第一维是所指向节点根编号,第二维是起点编号如果是 u ,v 的边,应该删除如果起点是 v,那么应该加入 out[u]如果终点是 v,那么应该加入 in咱一码归一码。进行若干次 加边-合并 操作 ,再把合并后影原创 2021-08-23 21:33:00 · 423 阅读 · 3 评论 -
【口胡】Ynoi刷题记录
[Ynoi2019 模拟赛] Yuno loves sqrt technology III分块后,预处理 Fi,jF_{i,j}Fi,j表示第 i∼ji\sim ji∼j块的众数的出现次数。用vector按顺序存每个数值所有元素的出现位置。再记录每个元素在相应vector里的下标 ppp。考虑询问,中间的直接使用预处理出的 Fi,jF_{i,j}Fi,j的值即可。设当前的答案 ans=Fi,jans=F_{i,j}ans=Fi,j。考虑边界的元素。这里我们运用迭代的思想。对于右边的边角元素原创 2021-05-01 10:30:09 · 554 阅读 · 0 评论 -
【题解】[HNOI2016]最小公倍数
[HNOI2016]最小公倍数思维题。考虑离线。然后判断 i,ji,ji,j 是否有通路,以及经过的边大小不超过 bbb ,经过了一条正好等于 aaa 的边。考虑转化问题。本题实际上是求,在边 (u,v)(u,v)(u,v) 满足 ax≤aa_x\leq aax≤a ,bx≤bb_x\leq bbx≤b 的情况下, (i,j)(i,j)(i,j) 能否联通,且联通块内是否存在 ax=aa_x=aax=a ,bx=bb_x=bbx=b 的边。考虑分块。先给边按第一关键词排序,给边分块,再把同一原创 2021-05-01 10:23:02 · 208 阅读 · 0 评论
分享