||_数据结构_||
CaprYang
这个作者很懒,什么都没留下…
展开
-
Kth number HDU - 2665 可持久化线段树 主席树
题解求区间第K大 主席树模版AC代码#include <stdio.h>#include <bits/stdc++.h>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const int MAXN = 1e5 + 10;const int MAXM = 2e6 + 1...原创 2018-10-17 22:17:44 · 459 阅读 · 0 评论 -
道路修建 EXT BNUOJ - 51275 并查集 启发式合并
题解题目链接很明显,对于题目所给的操作需要使用并查集处理,但是普通的并查集压缩路径会破坏已有数据,不压缩路径会超时。使用启发式合并并查集求解,在根节点记录当前子树深度,合并时将深度小的作为深度大的子树,这样能保证复杂度为logn。处理过程中顺便顺便记录每条边建立的时间,对于1号操作当uv同属一个根时,则两点可联通。根据当前点深度优先跳深度深的节点(类似于lca不过直接跳就行深度最大为lo...原创 2019-02-27 18:42:31 · 217 阅读 · 0 评论 -
食物链 POJ - 1182 带权并查集
题解使用带权并查集求解,思路参考至两位大佬的博客 dalao A dalao B开两个数组,令f[i]表示i的父节点是谁,r[i]表示i与父节点的关系0表示同类,1表示吃他的父节点,2表示被父节点吃这样设置012的好处是在f[x]=y、f[y]=z关系传递的时候0+0表示x和y、y和z是同类关系则x和z还是同类关系1+1表示x吃y、y吃z按照题意则x被z吃结果也是2被吃的关系,2+2道理相...原创 2019-02-13 21:37:21 · 273 阅读 · 0 评论 -
A Bug's Life POJ - 2492 带权并查集
题解题目大意,给你一些情侣问其中是否有同性恋,输入的数据表示是一对情侣的编号使用带权并查集求解,与题目食物链类似,可以说是食物链的弱化版,定义与父节点关系时用0表示同性1表示异性同性+同性还是同性,异性+异性是同性,同性+异性是异性AC代码#include <stdio.h>#include <iostream>#define fst first#defin...原创 2019-02-13 21:46:14 · 437 阅读 · 0 评论 -
How Many Answers Are Wrong HDU - 3038 带权并查集
题解题目大意,给你若干个区间和,问和之前所说相悖的有多少个,注意多组样例输入使用带权并查集求解,将区间x, y转化为[x, y)的左闭右开区间方便处理令f[i]表示i的父节点是谁,要求父节点大于等于子节点,r[i]表示[i, f[i])区间和为多少,初始化时自身父节点为自身,自然[i, i)为0令f[i]表示i的父节点是谁,r[i]表示区间[i, f[i])的和为多少压缩路径时直接加上父...原创 2019-02-13 22:05:30 · 227 阅读 · 0 评论 -
Codeforces Round #541 (Div. 2) D. Gourmet choice 并查集 拓扑排序
题解题目大意,一个人第一天吃了n份食物第二天吃了m份食物,给你一个n*m的矩阵表示第一天的某份食物和第二天的某份食物哪个更好吃或一样好吃,要求你对每个食物进行打分满足所给矩阵。首先使用并查集将一样好吃的情况缩为一个点进行处理,如果a>b则b<—a建一条单向边,如果a<b则a—>b建一条单向边。初始入度为0的点评分设置为1,使用拓扑排序将当前点指向的点评分对当前点评分+...原创 2019-02-25 17:46:11 · 438 阅读 · 0 评论 -
Codeforces Round #541 (Div. 2) F. Asya And Kittens 并查集 | 启发式合并
题解题目大意,1到n编号的数字最开始每个都属于一个单独的集合,告诉你相邻的两个集合并且合并在一起,最终会合并为同一个集合,输出任意满足条件的原序列。并查集解法:使用两个并查集vl, vr分别记录当前集合的最左元素和最右元素,在合并时将记录最左元素的根节点接在左侧集合的根节点下,记录右侧的接在右侧根节点下即vr[ar] = br, vl[bl] = al,ar, br为两个集合的根节点。在拼...原创 2019-02-25 18:04:23 · 356 阅读 · 0 评论 -
Codeforces Round #545 (Div. 2) C. Skyscrapers
题解题目大意,n*m矩阵每个位置作为一个独立的询问,问将当前行和列的数值拼在一起离散化为1~x的数值,要求x最小,最后输出每个位置的x。如果对着每个位置将行列数据加入vector后离散化复杂度O(nm(n+m))过高。每个位置预处理4个信息,当前位置的值v在当前列的离散化结果中,有lc个比v小的,有gc个比v大的。当前位置的值v在当前行的离散化结果中,有lr个比v小的,有gr个比v大的。每...原创 2019-03-15 11:45:36 · 180 阅读 · 0 评论 -
牛客练习赛41 C 抓捕盗窃犯 并查集
题解把小偷行走的路线看作一个有向图,如果是一个环则整个环内任意选一个就可以得到整个环的收益。把每个环看作一个点,如果是一个链则选取链出度为0节点则可以得到整个链的收益。由于每个点出度至多唯一,使用并查集求出每个链的收益总和,选取前m大即可,注意m可能少于链的数量。AC代码#include <stdio.h>#include <bits/stdc++.h>#de...原创 2019-03-08 13:32:50 · 346 阅读 · 0 评论 -
Parenthesis CSU - 1809 括号匹配 ST表
题解题目大意,给你一个括号序列,匹配规则和普通的括号匹配相同。q次询问每次询问独立,选择两个位置进行交换,问交换后是否括号匹配。把左括号看做1右括号看做-1做前缀和s,对于区间[l, r]如果括号匹配则区间最小值大于等于s[l - 1],使用ST表可以log时间内得到区间最值然后判断某个区间是否括号匹配。对于每次操作如果两个位置括号相同则不发生变化直接查询整个区间最小值。如果左操作位置是右...原创 2019-04-04 20:23:20 · 470 阅读 · 0 评论 -
L3-002 特殊堆栈 树状数组 二分 | STL
题解树状数组+二分:使用栈模拟操作。树状数组记录栈内每个数值出现的次数,树状数组用来查询数值1~x的出现次数。二分查找x位置,找到1~x出现次数和为栈内元素数量/2次的位置,则最小的x为当前栈内的中位数。multiset法:维护两个multiset,l和r表示[1, n/2]和[n/2+1, n]大小的元素,保证l内元素<=r内元素,l内元素数量>=r内元素数量,则l最后元素...原创 2019-04-02 23:35:57 · 531 阅读 · 0 评论 -
L2-022 重排链表
题解类似于数组模拟链表,开一个1e5大小的数组,存储当前元素节点和下一个节点标号。从链表头开始将链表压缩在一起并保留相对位置关系存入vec,再根据题目要求首尾交替的存入ans数组。最后根据ans的相对位置关系,根据题目要求模拟链表的格式输出。注意遍历ans时不能用n来代表范围,因为有多余节点。AC代码#include <stdio.h>#include <bits/s...原创 2019-04-03 10:24:43 · 561 阅读 · 0 评论 -
Codeforces Round #552 (Div. 3) 题解
题目链接A. Restoring Three Numbers#include <stdio.h>#include <bits/stdc++.h>#define fst first#define sed secondusing namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;con...原创 2019-04-20 22:47:58 · 841 阅读 · 2 评论 -
“卓见杯”第五届CCPC中国大学生程序设计竞赛河南省赛 题解
题解使用树状数组查询某个范围内的数值的数量,因为数值比较大需要先进行离散化处理。使用DFS遍历整棵树,当到达某个节点时首先查询区间[a[i]-m, a[i]+m]范围内的数字数量记为last,表示还没到当前子树时已有的数量。将当前节点值加进梳妆数组,因为自身到自身也算。进行递归,回溯后再次查询区间[a[i]-m, a[i]+m]记为now,表示增加了自身子树之后的数量。最后每个点的答案f[...原创 2019-04-13 18:41:12 · 867 阅读 · 2 评论 -
河南省第九届ACM程序设计竞赛 部分题解
A 表达式求值 <逆波兰>#include <stdio.h>#include <bits/stdc++.h>#define fst first#define sed secondusing namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const ll LINF =...原创 2019-04-21 14:14:21 · 1206 阅读 · 0 评论 -
郑州轻工业大学“CCPC2019-河南省赛”选拔赛(2) 部分题解
题目链接A 火柴棒等式 <暴力>#include <stdio.h>#include <bits/stdc++.h>#define fst first#define sed secondusing namespace std;typedef long long ll; const int INF = 0x3f3f3f3f;const ll L...原创 2019-04-18 21:21:24 · 950 阅读 · 0 评论 -
146. LRU缓存机制 leetcode
题解使用双向链表+hashmap存储数据,链表存储(key, value)和相对位置,hashmap存储(key, 链表节点指针)。put使用hashmap查找key是否出现并得到元素所在节点,删去原有链表节点并在链表头部插入一个新节点,如果容量大于限制则从链表尾部删除一个元素。get使用hashmap查找key是否出现并且删除原有节点重新插入在链表头部,实现刷新访问时间功能。代码使用C+...原创 2019-02-21 23:57:29 · 537 阅读 · 0 评论 -
hash HDU - 6046 hash 抽屉原理
题解题目大意 给你一个hash函数 传入横纵坐标得到一个1e6*1e6的矩阵 给你1e3*1e3的子矩阵问在大矩阵的哪个位置 输出左上角坐标将1*64的横条状矩阵作为一个单位(2^64足够大并且方便hash) 对小矩阵每个位置都取的单位矩阵hash 将对应位置存入hash表根据抽屉原理 对大矩阵每隔1000行1000-63列抽取一个单位矩阵并计算hash(这样不管怎么抽都能抽到小矩阵中的一个...原创 2019-02-01 21:57:13 · 612 阅读 · 0 评论 -
Counting Sequences HDU - 3450 线段树
题解题目大意 给一个长度为n的序列 问他的子序列(不连续)中有多少个完美子序列 完美子序列要求相邻两个元素的差不大于d按照值建立线段树 每个数字a[i]的贡献就是他前面出现过的a[i] - d到a[i] + d范围内数字的贡献和 使用线段树维护AC代码#include <stdio.h>#include <bits/stdc++.h>using namespac...原创 2018-10-17 22:24:24 · 453 阅读 · 0 评论 -
Transformation HDU - 4578 线段树
题解题目大意 给你一个长度为n的区间 有三种操作1将区间[l, r]加上c 2将区间[l, r]乘上c 3将区间[l, r]改为c4为询问 询问区间[l, r]的每个元素的p次方 p只为1、2、3线段树维护区间元素的1、2、3次方和 lazy三种操作通过公式(A+c) ^ 2 = A ^ 2 + 2Ac + c ^ 2 和 (A+c) ^ 3 = A ^ 3 + 3A ^ 2c + 3 ...原创 2018-10-13 23:30:59 · 355 阅读 · 0 评论 -
区间交 HDU - 5700 权值线段树 | 树状数组 二分
题解将区间按照左端点排序 最开始将前k-1个区间的右端点加入权值线段数遍历剩下的区间每次把当前区间右端点加入权值线段数并查询倒数第k大的右端点每次遍历的左端点 到 倒数第k大的右端点的区间则为当前最大区间 使用前缀和求区间和AC代码#include &lt;stdio.h&gt;#include &lt;bits/stdc++.h&gt;using namespace std;ty...原创 2018-10-18 16:07:56 · 445 阅读 · 0 评论 -
Atlantis HDU - 1542 线段树 扫描线
题解题目大意 给你n个矩形的左上角坐标和右下角坐标求矩形覆盖面积 坐标为实数使用线段树+扫描线求解将矩形分割为上下两条边 记录边的左端点和右端点分别对应矩形的左右侧边 上下边的高度分别对应矩形的上下边 和符号 上为正下为负将边按照高度从高到低排序处理 每次处理过程中根据符号在线段树中离散化标记覆盖范围并计算覆盖长度 乘上距离下条边的高度差为当前分块的答案贡献 求和即可AC代码#incl...原创 2018-10-19 00:20:14 · 373 阅读 · 0 评论 -
覆盖的面积 HDU - 1255 线段树 扫描线
题解使用线段树+扫描线求解将矩形分割为上下两条边 记录边的左端点和右端点分别对应矩形的左右侧边 上下边的高度分别对应矩形的上下边 和符号 上为正下为负将边按照高度从高到低排序处理 每次处理过程中根据符号在线段树中离散化标记覆盖范围并计算覆盖长度 长度分为覆盖一次和两次的长度分别计算每次扫描用覆盖两次的长度乘上距离下条边的高度差为当前分块的答案贡献 求和即可AC代码#include &l...原创 2018-10-19 23:47:22 · 332 阅读 · 0 评论 -
Minimum Inversion Number HDU - 1394 线段树
题解题目大意 给n个数字 这n个数字是一个环 问旋转到哪个位置逆序对的数量最少使用线段树求出数列的逆序对数量 每次"旋转"减少开头数字造成的贡献 也就是a[i] - 1个 因为他能产生逆序的都是在他后面并且比他小的 再加上他添加到最后的贡献即可AC代码#include &lt;stdio.h&gt;#include &lt;bits/stdc++.h&gt;using namespac原创 2018-10-17 17:40:28 · 294 阅读 · 0 评论 -
Multiply game HDU - 3074 线段树
题解给n个数字 两种操作一种将某个点修改为某个值 另一种询问一个区间的所有元素乘积线段树模板提 单点修改区间查询AC代码#include <stdio.h>#include <bits/stdc++.h>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const in...原创 2018-10-17 17:46:35 · 604 阅读 · 0 评论 -
Turing Tree HDU - 3333 线段树 离线处理
题解题目大意 给你n个数字 问你区间内不同元素的和将讯问离线处理 按照右端点排序 遍历每个位置用一个数组记录每个数值的出现 如果没出现过则在线段树中出现位置标记出现 如果出现则删除上次线段树中的标记并更新标记对于每个查询当遍历到查询右端点时区间求和则为答案AC代码#include <stdio.h>#include <bits/stdc++.h>using n...原创 2018-10-17 17:51:26 · 346 阅读 · 0 评论 -
表达式求值 NYOJ - 35
题解先将表达式字符串去掉等号后使用逆波兰规则转换为后缀表达式然后计算AC代码#include &lt;stdio.h&gt;#include &lt;bits/stdc++.h&gt;using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const int MAXN = 1e3 + 10;char...原创 2018-10-20 22:00:48 · 437 阅读 · 0 评论 -
郁闷的出纳员 HYSBZ - 1503 权值线段树
题解使用权值线段树解决问题记录一个mdf表示先前工资的变动 增加工资时增加mdf减少工资时减少mdf并将工资小于min - mdf - 1的数值标记清除 每次查询第k大先判断是否有足够人数使用一个tot记录加入人数 最后使用tot-线段树1节点的人数即为离开人数AC代码#include <stdio.h>#include <bits/stdc++.h>usin...原创 2018-10-20 23:43:57 · 739 阅读 · 0 评论 -
Game HDU - 5242 贪心 树链剖分
题解题目大意 给你一个n个节点的树 有k个回合 每个回合从树根出发每个点只能经过一次 经过每个点时会获得得分 但是这个得分在整句游戏中只有第一次经过才可以获得 问k次最多能获得多少得分利用树链剖分思想DFS在每个节点维护一个val值 表示走这个节点能获得的最大得分(重儿子val+自身值) 儿子中最大的val为重儿子然后使用优先队列将根节点加入 每次选取最大val的节点出队并将重链上所有非重儿...原创 2018-10-30 17:13:33 · 424 阅读 · 0 评论 -
Picture POJ - 1177 线段树 扫描线
题解题目大意 给若干个矩形问覆盖在一起的多边形的边长和是多少使用扫描线将矩形拆分为线段从上往下扫 用线段树维护线段左右端点是否闭合计算线段分为几段 每次扫描时纵向边长为段数量2高度差 计算横向边时每次减上次的边长减去重复贡献AC代码#include <stdio.h>#include <iostream>#include <algorithm>us...原创 2018-11-22 22:24:58 · 414 阅读 · 0 评论 -
程序员的背包 ZZULIOJ - 2485 离散化 dp lis | 树状数组
题解经典的最长上升子序列问题 因为数值过大使用二分进行优化AC代码#include &lt;stdio.h&gt;#include &lt;bits/stdc++.h&gt;using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const int MAXN = 5e4 + 10;int a[MAX...原创 2018-12-23 18:09:02 · 456 阅读 · 0 评论 -
comet OJ 热身赛 K. principal 括号匹配
题解使用栈模拟括号匹配 栈内存储元素的下标 使用b数组记录栈顶下标栈顶下标表示着当前位置栈剩余未匹配的下标 最后对于每个q检测b数组b[r]==b[l-1]如果相等则表示范围内括号被匹配掉AC代码#include &lt;stdio.h&gt;#include &lt;bits/stdc++.h&gt;using namespace std;typedef long long ll;...原创 2019-01-19 15:42:11 · 459 阅读 · 0 评论 -
Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) D. Recovering BST 区间dp
题解题目大意 给你n个升序排列的数值 让你建立二叉排序树要求连线的节点间gcd>1 问是否能建立成功由于是二叉排序树 中序遍历正好是题目所给的升序排列 所以可以划分为若干区间使用区间dp求解l[i][j]表示区间i到j的元素可以作为节点j+1的左子树 r[i][j]表示区间i到j的元素可以作为节点i-1的右子树状态转移时枚举区间中点从i到j 如果当前中点可以将区间划分为i ~ m-1...原创 2019-01-19 19:10:07 · 238 阅读 · 0 评论 -
“卓见杯”第五届CCPC中国大学生程序设计竞赛河南省赛-网络模拟赛 部分题解
题目链接A Mex Query#include <stdio.h>#include <bits/stdc++.h>#define fst first#define sed secondusing namespace std;typedef long long ll; const int INF = 0x3f3f3f3f;const ll LINF = 0...原创 2019-04-18 21:39:29 · 503 阅读 · 0 评论