
数据结构
文章平均质量分 69
JXNU_SONG
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
2022 天梯赛 部分题解
L1-8 静静的推荐https://pintia.cn/problem-sets/994805046380707840/problems/1518582000729911296这道题的关键首先是。。。花时间读懂题目。。赛时写这题的时候思路很不清晰,迷迷糊糊码了估计有 909090 行?现在把思路理清楚貌似 202020 行就可以解决首先我们可以发现,第一个分数大于等于 175175175 ,第二个分数大于等于 sss 的人,其是没有任何限制的,所以直接把他们算进答案就行。对于其它第一分数大于等于 1原创 2022-04-28 11:26:14 · 767 阅读 · 0 评论 -
牛客练习赛50 B tokitsukaze and Hash Table
B tokitsukaze and Hash Tablehttps://ac.nowcoder.com/acm/contest/1080/B实际上我们就是要维护每个点右边(循环)第一个空位的位置,那么我们发现,插入一个新的节点可能导致一段区间右边(循环)的空位发生改变,不好直接暴力维护。我们模拟几下以后发现这个过程就类似于把几个区间拼接在一起的味道,我们就考虑能否用并查集去维护这个拼接过程。此时我们考虑:我们将右边(循环)第一个空位相同的的位置视为同一集合,我们假设这个空位是 xxx ,那么我们就令这原创 2022-04-27 15:48:41 · 275 阅读 · 0 评论 -
Codeforces Round #779 (Div. 2) D 388535
D2. 388535 (Hard Version)这里直接上 D2D2D2 的做法吧。我们可以知道 l⊕xl\oplus xl⊕x 一定在 aaa 中,所以对于 (a[i]⊕l)(a[i]\oplus l)(a[i]⊕l) (1<=i<=r-l+1) ,总有一个是 xxx 。我们现在设 b[i]=(a[i]⊕l)b[i]=(a[i]\oplus l)b[i]=(a[i]⊕l) ,那么我们怎么判断 b[i]b[i]b[i] 是不是 xxx 呢?首先我们要知道原序列是一个排列,所以不会有相同的数原创 2022-03-28 14:11:36 · 1039 阅读 · 0 评论 -
2020 China Collegiate Programming Contest Qinhuangdao Site E. Exam Results
Exam ResultsLink题目大意:给出 nnn 个学生,每个学生有 aia_iai , bib_ibi 两个值,分别代表其在状态好和状态不好的时候的考试成绩,学生的当前的状态未知,且保证 ai≥bia_i≥b_iai≥bi 。现在有一场考试,及格分数线为 最高分×p%最高分×p\%最高分×p% 。现在问最多有多少个人可以及格。我们可以遍历每种可能的最高分,然后取其中的最大及格人数。那么我们首先假定最高分为 xxx ,我们显然可以分三种情况:①连 aia_iai 都小于及格分数。 ②.原创 2021-11-12 16:49:57 · 144 阅读 · 0 评论 -
AtCoder Beginner Contest 221 E LEQ
LEQhttps://atcoder.jp/contests/abc221/tasks/abc221_e题目大意:给出一个长度为 nnn 的整数序列 aaa ,问有多少个子序列(无需连续) a1,a2...aka_1,a_2...a_ka1,a2...ak ,满足 a1≤aka_1≤a_ka1≤ak 。那么我们发现可以将问题看成对于每个正序对去算一个值最后求和。那么我们这里正序对维护的值就不再是加一了,我们设对于 aia_iai 作为正序对小的那一方而言,与其可构成正序对的元素为 {aj.原创 2021-10-04 16:30:14 · 250 阅读 · 0 评论 -
AtCoder Beginner Contest 221 D Online games
Online gameshttps://atcoder.jp/contests/abc221/tasks/abc221_d题目大意:给出 nnn 个人的区间,表示这人在这个区间时间内会登录游戏,现在请输出 nnn 个数 kik_iki ,表示有恰好 kik_iki 个人登录游戏的天数。这种多区间和交并有点关系的问题就可以往扫面线的思想去靠一靠。那么我们利用扫描线的思想,处理出每个变化点,也就是 aia_iai 点此时区间会加一, ai+bia_i+b_iai+bi 点此时区间会减一。那么我们原创 2021-10-03 17:04:13 · 547 阅读 · 0 评论 -
洛谷P3168 [CQOI2015]任务查询系统(扫描线+主席树)
P3168 [CQOI2015]任务查询系统 原题链接我们可以想,这题一眼看起来比较麻烦是因为其有个结束时间,如果没有的话,那就是个是求前缀第 kkk 小的前缀和,那样用主席树上维护区间数量和区间和就可以直接写。但是这里有个结束时间,我们发现我们可以用扫描线的思想,设一组任务表示为 {s,e,p}\{s,e,p\}{s,e,p} ,就以题中描述的时间为时间轴,那么我们可以在 sss 这里增加 {1,p}\{1,p\}{1,p} ( {数量权值,优先级权值}\{数量权值,优先级权值\}{数量权值,优先.原创 2021-09-12 20:13:11 · 223 阅读 · 0 评论 -
The 15th Chinese Northeast Collegiate Programming Contest D. Lowbit(快速稳定区间修改)
D. Lowbit 原题链接这题我们会想,加到一定次数以后会不会变成正常的区间操作呢,就类似于区间开根一样。然后我们发现确实如此,一个数加到一定次数之后实际上其二进制就只剩一个 111 了,后期就是不断乘 222 ,和区间开根类似处理一下就可以在一定次数之后变成区间乘的操作。那么为什么操作少量次数以后其二进制就会变成只剩下一个 111 呢?我们考虑,对于一次操作,其二进制表示中 111 的总个数的变化。我们知道,加上 lowbitlowbitlowbit 是必定进位的,那么进位的话最终进位结束的地.原创 2021-09-11 16:54:36 · 265 阅读 · 0 评论 -
洛谷P2839 [国家集训队]middle(主席树)
P2839 [国家集训队]middle我们可以考虑二分中位数 checkcheckcheck 答案,那么我们对于某个值 midmidmid ,把 [l,r][l,r][l,r] 内的所有小于 midmidmid 的数赋值为 −1-1−1 ,大于等于 midmidmid 的数赋为 111 ,若 [l,r][l,r][l,r] 的和大于等于 000 就代表这个区间内的中位数至少都是 midmidmid ,否则只可能小于 midmidmid 。答案一定是序列里面的数字,所以我们就考虑对于每个数字建出一颗线段.原创 2021-09-11 16:18:53 · 247 阅读 · 0 评论 -
CF893F Subtree Minimum Query(主席树)
F. Subtree Minimum Query 原题链接题目大意:给出一颗有根点权树, mmm 次询问,每次问你某个点 xxx 的子树中距离其不超过 kkk 的点的权值的最小值。以深度为时间轴, dfsdfsdfs 序为下标建立主席树维护区间最小值即可。因为这样第 iii 层的所代表的主席树就存下了前 iii 层所有点,我们要找的点会完全包含在里面,且更深层的点还没有被计算进来,所以我们只要找到当前主席树上 xxx 那一颗子树上的区间最小值即可,即可以通过 dfsdfsdfs 序为下标的方式快速询.原创 2021-09-08 15:41:57 · 257 阅读 · 0 评论 -
洛谷P5629 【AFOI-19】区间与除法(思维,ST表)
P5629 【AFOI-19】区间与除法 原题链接这题首先要明确一个结论,一个 a[i]a[i]a[i] 如果对应了多个 b[k]b[k]b[k] ,那么用最小的 b[k]b[k]b[k] 一定最优。这个可以简单的证明一下,若最终答案里 a[i]a[i]a[i] 与 a[j]a[j]a[j] 对应的是同一个 b[k]b[k]b[k] ,那么让他们同时继续除 ddd ,除到最小的 b[h]b[h]b[h] 并不影响答案。如果答案中 a[i]a[i]a[i] 对应了唯一的 b[k]b[k]b[k] ,那.原创 2021-09-06 13:07:47 · 310 阅读 · 0 评论 -
2021CCPC“第一场”网络赛 GCD on Sequence(思维,线段树)
GCD on Sequence 原题链接我们可以发现,假设区间 [l,r][l,r][l,r] 内 v(l,r)=dv(l,r)=dv(l,r)=d ,那么 [l,r][l,r][l,r] 内肯定至少有两个 ddd 的倍数。我们可以通过从 nnn 到 111 去枚举 gcdgcdgcd ,设其为 ddd ,然后找到所有 ddd 的倍数的下标。我们可以假设先不考虑其它 gcdgcdgcd 对此次的计算影响,只考虑计算 ddd 的最终答案。那么假设处理出来了其倍数下标排序后为 [1,3,5,10][1.原创 2021-09-05 21:58:36 · 495 阅读 · 0 评论 -
洛谷P3431 [POI2005]AUT-The Bus
P3431 [POI2005]AUT-The Bus若是这个 nnn 和 mmm 比较小的话就是经典的 dpdpdp 了。但是这里值域比较大,没法像经典做法那么做。但是本质没有变,对于某个点 (x,y)(x,y)(x,y) 来说,实际上就是在 (1~x,1~y)(1~x,1~y)(1~x,1~y) 这个矩阵里面找到一个最大的 dpdpdp 值,再加上自己的权值,就是这个点的答案了。那么我们可以先离散化,然后以 xxx 优先, yyy 其后,遍历所有点,遇到一个点就求得其 dpdpdp 值,然后以 yyy原创 2021-09-04 00:09:18 · 155 阅读 · 0 评论 -
洛谷P5816 [CQOI2010]内部白点(扫描线/主席树)
P5816 [CQOI2010]内部白点 题目链接扫描线的做法这里不过多赘述了,挺多题解都讲的挺不辍的。这里分享一个主席树的写法。首先我们明确的是,第一步变化之后,整个图就不会变了。为什么呢,第二步才改变的点 qqq 肯定是因为第一步改变的某个点 ppp 或者好几个点变成黑点才改变的。如果 ppp 在 qqq 的水平左侧,那么 ppp 左侧肯定还有点,因为它是第一步变成黑点的点,那么在此情况下, qqq 第一步也应当变成黑点,不应该等到第二次才变化。其他几个方向或者多个点的情况是同理的。也就是说..原创 2021-09-03 15:52:56 · 184 阅读 · 0 评论 -
洛谷P1502 窗口的星星(思维,扫描线)
P1502 窗口的星星 原题链接对于一颗星星 (x,y)(x,y)(x,y) ,考虑要包含这颗星星,窗口右端点的范围,实际上是一个矩形: ((x∼x+w),(y∼y+h))((x∼x+w),(y∼y+h))((x∼x+w),(y∼y+h)) ,因为不能在边框上,所以都是开区间。那么实际上就是每个点都给一块矩形加上了 lil_ili 的权值,然后求权值最大的点的权值是多少。一看,实际上是遍历了所有矩形的并集,那么就想到用扫描线去解决。但是这里的开区间不好处理,所以我们可以把这个矩形的范围替换成这样:.原创 2021-09-01 22:46:29 · 335 阅读 · 0 评论 -
洛谷P1197 [JSOI2008]星球大战(逆向思维,并查集)
P1197 [JSOI2008]星球大战原题链接这里要做并查集的删点操作,不太好实现,可是我们知道并查集主要用于合并操作,所以我们可以逆向想,他顺序一个个删点,就是逆序一个个建点,则我们就可以实现这个过程。#include <bits/stdc++.h>using namespace std;const int N = 1e6 + 10;int n, m, k, f[N], vis[N], del[N], cnt;pair<int, int> edge[N].原创 2021-08-31 17:06:14 · 212 阅读 · 0 评论 -
BITSET操作
BITSETbitset < N > a (M)其中a为变量名。N表示该类型在内存中占的位数,是二进制。M表示变量a的初始值。原创 2020-07-13 21:18:13 · 187 阅读 · 0 评论 -
Binary Indexed Tree基础
BIT树BIT树,也称树状数组,是能够完成下述操作的数据结构:给一个初始值全为零的数列,a1,a2……an(1) 给定i,计算a1+a2+……ai(2) 给定i和x,执行ai+=x算出对应编码最低位第一个非零值的权值的为公式:i&(-i),原理:基于补码,因为负数的补码就是最高位填写符号位后除符号位所有位都按位取反再加一,那么此时,最低位第一个非零元素的右边原本肯定都是零,取反后就都是一,再加一就会不断进位直至取反后第一个为0的地方停止进位,那这个位置也就是原本最低位第一个为1的位置,这原创 2020-06-03 01:22:04 · 282 阅读 · 0 评论 -
2021“MINIEYE杯”中国大学生算法设计超级联赛(8)Counting Stars
Counting Stars 原题链接题意:给一个 nnn 个元素的序列, mmm 个操作,三种操作:①区间求和(输出)②区间每个元素减去各自的 lowbitlowbitlowbit③区间每个元素各自二进制最高位的 111 左移一位。我们首先可以考虑一个问题,对于一个元素而言第二种操作可以做多少次呢?显然是 logloglog 次,那么操作 333 是否会影响操作 222 的次数呢?当然不会,无论操作 333 做多少次,一个元素二进制内 111 的个数都不会改变,也就是说,在此题中一个元素最多.原创 2021-08-26 20:19:50 · 111 阅读 · 0 评论 -
HDU 4027 Can you answer these queries?(快速下降区间修改)
Can you answer these queries?原题链接题意:给一个有 nnn 个元素的序列, mmm 个操作,区间开根,区间求和。区间开根我们没办法在线段树上用区间操作求解,但是单点可以,但是我们要让这个过程加速。我们可以维护一个标记 keepkeepkeep ,用来表示这个区间内是否所有元素开根后的值都不会再变化,那么区间更新的时候碰到这样的区间我们就可以直接返回不用再找下去了。因为是单点更新,某个点的 keepkeepkeep 标记状态我们是可直接判断得到的,我们只要在 pushupp原创 2021-08-26 19:25:36 · 114 阅读 · 0 评论 -
Codeforces 558E - A Simple Task
A Simple Task 题目链接我们可以用区间覆盖的想法去解决这个问题。我们可以开 262626 颗线段树,去维护某个字母的区间覆盖。那么我们只要按照升序或者降序去遍历每个字母,首先求出某个字母在 [L,R][L,R][L,R] 的个数 cntcntcnt ,然后把原先的 [L,R][L,R][L,R] 都覆盖为 000 ,因为已经放好前面的字母,所以也应该得知当前字母覆盖的起始位置 pospospos ,那么我们将这个字母的 [pos,pos+cnt−1][pos,pos+cnt-1][pos.原创 2021-08-26 13:55:59 · 262 阅读 · 0 评论 -
2021“MINIEYE杯”中国大学生算法设计超级联赛(9)Guess the weight
Guess the weight原题链接题意:你现在有一个技能,先从牌堆里面摸一张牌,然后可以知道这张牌的大小,然后摸第二张,猜其大小,只能猜大或者小,不能猜等,猜对了才可以获得第二张牌。你是知道牌堆里面牌的情况的,但是牌堆每次都会被人打乱。那么现在初始有 nnn 张牌,各大小为 xix_ixi ,然后有 mmm 次操作,有两种操作,第一种为往牌堆里加 vvv 张大小为 xxx 的牌。第二种问你现在在最优策略下,使用技能获得第二张牌的概率是多少,用最简分数表示。对于某个权值为 xxx 的牌,我们设比原创 2021-08-22 17:41:06 · 200 阅读 · 0 评论 -
2021牛客暑期多校训练营9 Eyjafjalla
Eyjafjalla 题目链接 题目大意:给出一棵树,每个树上都有权值,且保证父节点的权值比其所有子节点大。现在给出 mmm 组询问,每次询问给出 u,l,ru,l,ru,l,r ,表示 uuu 点只有在其权值为 [l,r][l,r][l,r] 时才会被感染,除了 uuu 点其它点当且仅当其有一直连点被感染且自身权值在 [l,r][l,r][l,r] 时才会被感染,问最多能扩散到几个点。首先我们可以考虑向上最多能感染到哪个祖先,设其为 fff 。 fff 的子树中有多少颜色在 [l,r][l,r.原创 2021-08-14 20:00:28 · 350 阅读 · 0 评论 -
2021牛客暑期多校训练营4 Tree Xor
Tree Xor原题链接我们可以先将根节点的值 w[i]w[i]w[i] 定为 000 。那么整棵树的其它节点的权值 w[i]w[i]w[i] 就确定了。那么其它所有的情况也都是相当于在对于所有的 w[i]w[i]w[i] 都异或上某个数值 kkk ,符合条件的情况也就是所有的 w[i]⨁k∈[li,ri]{w[i]}\bigoplus{k} \in [l_i,r_i]w[i]⨁k∈[li,ri] 。一种 kkk 是一种情况,那么符合条件的情况总数也就是符合条件的 kkk 的数量。那么显然我们通过.原创 2021-08-05 20:33:54 · 135 阅读 · 0 评论 -
洛谷P1471 方差
方差 题目链接题目大意:给一个 nnn 个元素的序列, mmm 次操作,其中有区间加更新,询问区间平均值,询问区间方差。对于平均值,维护区间和就OK了。主要问题就在于区间方差,但其实我们将其式子展开就会发现妙处。s2=1n∑i=1n(ai−a‾)2s^2=\frac{1}{n}\sum_{i=1}^n(a_i-\overline{a})^2s2=n1∑i=1n(ai−a)2s2=1n∑i=1n(ai2+a‾2−2aia‾)s^2=\frac{1}{n}\sum_{i=1}^n(a_i^2+.原创 2021-08-05 17:43:09 · 227 阅读 · 0 评论 -
洛谷P1438 无聊的数列
无聊的数列 题目链接题目大意:给出一个有 nnn 个元素的序列 aaa ,和 mmm 次操作。倘若是修改操作,给出 l,r,a1,dl,r,a_1,dl,r,a1,d ,意为在 [l,r][l,r][l,r] 这个区间内每个元素加上一个等差数列的元素。询问操作则询问某一个元素的值。对于这种区间加一个有规律的有序值的问题通常将其转化为与其下标有关,我们假设某个元素的下标为 idxidxidx ,那么对于一次修改操作,其值就会加上 a1+(idx−l)∗da_1+(idx-l)*da1+(idx−l.原创 2021-08-05 17:17:27 · 244 阅读 · 0 评论 -
万恶的柯怡(可持久化lazy模板)
万恶的柯怡题目链接题意就是一个在线的区间修改区间求和。但是依数据范围看,如果我们想用线段树解决这个问题就得用动态开点的线段树,那么这里涉及到区间修改,需要使用 lazylazylazy 标记,但是如果是动态开点,又有 push_downpush\_downpush_down 的话,就可能得在 push_downpush\_downpush_down 中开点,这样可能空间复杂度不好把控,所以我们就有了可持久化的 lazylazylazy 。我觉得看代码更加好理解。如下,我们可以把落到这个区间的更新数据.原创 2021-07-30 12:59:01 · 124 阅读 · 0 评论 -
CF633C Spy Syndrome 2(字典树+dp)
CF633C Spy Syndrome 2原题链接说是 dpdpdp 但是感觉说是一个记忆化也可以。我们定义一个 dpdpdp 数组,其 dp[i]dp[i]dp[i] 含义为将加密串前 iii 位都解密完成使用的最后一个单词的下标(从 111 开始),如果不能用现有单词将加密串前 iii 个字符解密,那么 dp[i]==0dp[i]==0dp[i]==0 。那么首先我们可以将所有单词加入一颗字典树,注意忽略掉大小写,我们只要在终点记录下此时是下标为多少的单词即可(因为加密串不区分大小写,所以如果两.原创 2021-07-22 18:22:22 · 228 阅读 · 0 评论 -
Count on a tree(主席树)
Count on a tree 原题链接题目大意:给出一个有 nnn 个点的点权树,和 mmm 个询问,对于每个询问 (u,v,k)(u, v, k)(u,v,k) ,设上一次询问的答案为 lstlstlst ,初始 lstlstlst 为 000 ,输出 (lst xor u,v)(lst\ xor\ u, v)(lst xor u,v) 路径上的第 kkk 小。区间第 kkk 小,可以想到用主席树解决。那么问题在于如何确定前缀的构建,我们可以利用与树上差分.原创 2021-07-11 14:43:48 · 290 阅读 · 0 评论 -
运输计划(二分,树上差分)
运输计划 题目链接题目大意:给出一颗有 nnn 个点的树,和走完某条边的耗时。现有 mmm 个从点 uuu 到点 vvv 的需求,且我们可以把某一条边的耗时变成 000 ,问最短的最长耗时是多少。我们可以考虑二分答案,那问题就是我们怎样进行 checkcheckcheck 。我们先把路径长度超过 midmidmid 的需求记录下来,然后我们就是要找到一条边,被所有这些超时的需求的路径经过,且这个边尽可能长。为什么要找到所有超时需求都经过的边呢?因为如果我们找到的边不是所有超时需求(不满足 >m.原创 2021-07-10 17:15:35 · 263 阅读 · 0 评论 -
主席树初探
主席树主席树初始的初级应用也就是 这个,前置知识:权值线段树,前缀和首先我们对序列进行离散化,将 nnn 个元素的数组排过序后离散化为 [1,n][1,n][1,n]然后我们考虑建立 nnn 棵权值线段树,第 iii 棵表示用下标为 [1,i][1,i][1,i] 的元素建立的权值线段树。这里有一点对理解比较有帮助,就是每棵树的逻辑结构都是相同的,因为根的范围都表示的是 [1,n][1,n][1,n] (这个是值的范围,不是下标范围,因为这是一颗权值线段树,而且我们一开始将所有数字离散化为 [1,n原创 2021-07-09 16:14:16 · 121 阅读 · 0 评论 -
小阳的贝壳(区间gcd)
小阳的贝壳题目描述小阳手中一共有 nnn 个贝壳,每个贝壳都有颜色,且初始第 iii 个贝壳的颜色为 colicol_icoli 。现在小阳有 3 种操作:1 l r x:给 [l,r] 区间里所有贝壳的颜色值加上 x 。2 l r:询问 [l,r] 区间里所有相邻贝壳颜色值的差(取绝对值)的最大值(若 l = r 输出 0)。3 l r :询问 [l,r] 区间里所有贝壳颜色值的最大公约数。题目解答如果不带修,那么求区间的 gcdgcdgcd ,只用线段树就可以解决。但是这里我们发现很难用原创 2021-07-07 17:25:00 · 214 阅读 · 0 评论 -
兰州大学第一届『飞马杯』D ★★飞马祝福语★★
D ★★飞马祝福语★★原题链接现设当前串为 sss ,目标串为方法一:将 dpdpdp 转移转化为矩阵转移,利用线段树维护矩阵区间乘积设 dp[i][j]dp[i][j]dp[i][j] 含义为用 sss 串的前 iii 个字母,最多能组成多少个与 goal[0:j]goal[0:j]goal[0:j] 相同的子序列。然后分两种情况:(1)s[i]==goal[j]:::::::>dp[i][j]=dp[i−1][j]+dp[i−1][j−1]s[i] == goal[j]:::::::.原创 2021-06-04 00:11:01 · 210 阅读 · 0 评论 -
2021牛客寒假算法基础集训营3:B 内卷
内卷题目链接这题可以这么考虑,最优的状态一定是通过其它某种状态改变而来的,所以我们可以一开始就给所有人设置好一个等级,然后每次通过改变一些人的等级以达到更优的状态。那么初始状态肯定要特殊才比较易于确定改变方向,那么我们就先假定所有人都处于最低的等级,那么此时我们想要达到更优的状态,就只能提高当前最小值的等级,将其等级 +1+1+1,然后不断更新当前的答案。那么我们每次会去掉一个最小值,又有新元素进来更新当前全局最小值,这里用优先队列处理就可以了。对于最大值,只要 n!=1n!=1n!=1,那么去掉的元素原创 2021-02-09 21:12:41 · 176 阅读 · 0 评论 -
2021牛客寒假算法基础集训营2:F 牛牛与交换排序
F 牛牛与交换排序题目链接此题首先我们可以得知,对于给定的序列,kkk 一定是固定的(已经排好序的除外)。这里的 kkk 一定等于 e−s+1e - s + 1e−s+1 (s,e见下方代码)。用反证法即可证明,主要的证明条件是翻转区间长度固定且每次只能翻转左端点比上次翻转的左端点更大的区间。 for (int i = 1; i <= n; ++i) { if (a[i] != i) { s = i; goal = i;原创 2021-02-04 21:54:45 · 152 阅读 · 0 评论