线段树
CaprYang
这个作者很懒,什么都没留下…
展开
-
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 · 443 阅读 · 0 评论 -
Picture POJ - 1177 线段树 扫描线
题解 题目大意 给若干个矩形问覆盖在一起的多边形的边长和是多少 使用扫描线将矩形拆分为线段从上往下扫 用线段树维护线段左右端点是否闭合计算线段分为几段 每次扫描时纵向边长为段数量2高度差 计算横向边时每次减上次的边长减去重复贡献 AC代码 #include <stdio.h> #include <iostream> #include <algorithm> us...原创 2018-11-22 22:24:58 · 397 阅读 · 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 · 727 阅读 · 0 评论 -
Turing Tree HDU - 3333 线段树 离线处理
题解 题目大意 给你n个数字 问你区间内不同元素的和 将讯问离线处理 按照右端点排序 遍历每个位置用一个数组记录每个数值的出现 如果没出现过则在线段树中出现位置标记出现 如果出现则删除上次线段树中的标记并更新标记 对于每个查询当遍历到查询右端点时区间求和则为答案 AC代码 #include <stdio.h> #include <bits/stdc++.h> using n...原创 2018-10-17 17:51:26 · 327 阅读 · 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 · 584 阅读 · 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 · 285 阅读 · 0 评论 -
覆盖的面积 HDU - 1255 线段树 扫描线
题解 使用线段树+扫描线求解 将矩形分割为上下两条边 记录边的左端点和右端点分别对应矩形的左右侧边 上下边的高度分别对应矩形的上下边 和符号 上为正下为负 将边按照高度从高到低排序处理 每次处理过程中根据符号在线段树中离散化标记覆盖范围并计算覆盖长度 长度分为覆盖一次和两次的长度分别计算 每次扫描用覆盖两次的长度乘上距离下条边的高度差为当前分块的答案贡献 求和即可 AC代码 #include &l...原创 2018-10-19 23:47:22 · 318 阅读 · 0 评论 -
Atlantis HDU - 1542 线段树 扫描线
题解 题目大意 给你n个矩形的左上角坐标和右下角坐标求矩形覆盖面积 坐标为实数 使用线段树+扫描线求解 将矩形分割为上下两条边 记录边的左端点和右端点分别对应矩形的左右侧边 上下边的高度分别对应矩形的上下边 和符号 上为正下为负 将边按照高度从高到低排序处理 每次处理过程中根据符号在线段树中离散化标记覆盖范围并计算覆盖长度 乘上距离下条边的高度差为当前分块的答案贡献 求和即可 AC代码 #incl...原创 2018-10-19 00:20:14 · 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 · 410 阅读 · 0 评论 -
Transformation HDU - 4578 线段树
题解 题目大意 给你一个长度为n的区间 有三种操作 1将区间[l, r]加上c 2将区间[l, r]乘上c 3将区间[l, r]改为c 4为询问 询问区间[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 · 339 阅读 · 0 评论