线段树
pubgoso
这个作者很懒,什么都没留下…
展开
-
2019-2020 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) K - Computer Cache
题目链接第一眼看到这个题目以为是平衡树类的题,但是这样内存不太行(很大可能是我没做多少平衡树的题我们把m个数组拉成一个数组,赋予连续的编号,区间赋值相当于就是线段树上区间赋一个等差数列。我们询问的时候可以单点查询这个位置具体是哪个数组的哪个元素。由于m个数组存在的区间更新问题。所以我们可以更新线段树的时候加上一个时间戳。把更新操作加上时间戳全都提出来,询问操作也提出时间戳存下来。问题就转变成了一个区间加法 加单点查询的问题了。。。#include <bits/stdc++.h>usi原创 2020-12-20 11:00:02 · 354 阅读 · 1 评论 -
2020-2021 ACM-ICPC Brazil Subregional Programming Contest M - Machine Gun
题目链接敌人(x,y)(x,y)(x,y)能被(xm,ym)(x_m,y_m)(xm,ym)打中当且仅当:ym−x−xm2≤y≤ym+x−xm2y_m- \frac{x-x_m}{2}\leq y\leq y_m+\frac{x-x_m}{2}ym−2x−xm≤y≤ym+2x−xm我们化简一下这个不等式,x,yx,yx,y放一边,xm,ymx_m,y_mxm,ym放一边:{ 2y−x≤2ym−xm−2y−x≤−2ym−xm\begin{cases}~原创 2020-12-16 14:55:53 · 473 阅读 · 0 评论 -
2018-2019 ACM-ICPC, Asia Nakhon Pathom Regional Contest A.Flying Squirrel 单调栈+区间最大值+dfs
思路:先预处理出每个元素i的最大值覆盖区间[li,ri][l_i,r_i][li,ri]。然后让i和[li,i),(i,ri][l_i,i),(i,r_i][li,i),(i,ri]中的最大值连边。随后dfs从最大值开始dfs找到每个点的深度和距离所有子节点的最大距离。询问y=0 即找到子节点的最大距离。询问y!=0 :先判断大的值的区间是否能覆盖到小的值,能覆盖答案显然就是两者的深度之差。细节 见代码:#pragma GCC optimize(2)#pragma GCC optimize原创 2020-12-09 17:21:41 · 170 阅读 · 0 评论 -
2016-2017 ACM-ICPC CHINA-Final G.Pandaria
#pragma GCC optimize(2)#pragma GCC optimize(3)#include <bits/stdc++.h>using namespace std;typedef long long LL;const int N = 2e5 + 10;#define fi first#define se second#define pb push_back#define wzh(x) cerr<<#x<<'='<<x<.原创 2020-12-07 19:21:32 · 208 阅读 · 0 评论 -
G. Forbidden Value 动态开点线段树
题目链接思路:考虑dpijdp_{ij}dpij表示在一个ififif框内,执行到第iii次操作时,获得值为jjj的最小花费。初始只有进入该ififif时的初值有一个代价,其余都是无穷大。那么如果时set y vset ~~y~~vset y v的话,任意不等于yyy的值都必须花费vvv的代价来跳过这一次操作从而不成为yyy,而yyy可以从其他任意值转移过来(注意不能等于xxx)。那么这样就可以用一个线段树来维护一原创 2020-12-03 23:27:34 · 170 阅读 · 0 评论 -
2020牛客暑期多校训练营(第八场)A.All-Star Game
思路:由题可以得到一个结论:fans和player组成的联通快只需要一个player就可以让这个联通快内所有fans都满足条件。那就直接把每个关系当成一个边,按时间建线段树,用可撤销并查集,维护图的连通性即可。对于有单独的fans组成一个联通快的显然无解了。。#pragma GCC optimize(2)#pragma GCC optimize(3)#include <bits/stdc++.h>using namespace std;typedef long long LL;原创 2020-08-07 13:43:30 · 336 阅读 · 0 评论 -
2020牛客暑期多校训练营(第二场)H(线段树+模拟)
H.Happy Triangle思路:考虑构成三角形的充要条件是:任意两边之和大于第三边。我们分三种情况进行讨论:1.x是最大边2.x是第二大边3.x是第三大边显然1,2两种情况可以用multiset来模拟讨论讨论。我们用线段树来实现第三种情况的讨论,具体细节:先将所有值存下来先离散化一下。我们知道如果存在>=x且出现至少两次的y,则必然有解。可以用一个bit来解决这类情况。否则,我们只需要在第一次添加和最后一次删除一个y的时候在线段树上更新大小相邻的两个点的差值。添加和删除都是最原创 2020-07-14 19:01:14 · 196 阅读 · 0 评论 -
“科大讯飞杯”第十七届同济大学程序设计预选赛暨高校网络 H.时空栈
题目链接思路:显然对于每个操作,只能被他之前的且时间小于他的操作所影响。把所有的时间离散化之后,用时间为下标建立区间线段树,下标为ggg的值为sgs_gsg枚举所有操作(op,t,v)(op,t,v)(op,t,v)把入栈当成区间[t,n]+1[t,n]+1[t,n]+1,出栈为区间[t,n]−1[t,n]-1[t,n]−1因为保证所有的操作是合法的,那么查询时刻T的栈顶元素的时候,此时线段树上下标为ttt的值为sxs_xsx,那么必然有一个位置yyy满足sx−sy>0s_x-s_y&g原创 2020-05-11 12:42:12 · 166 阅读 · 0 评论 -
1326E - Bombs
题目链接思路:显然答案是单调不增的。根据这个性质,我们可以枚举答案来检查答案是否合法。假设第i−1i-1i−1次的答案为 ansi−1ans_{i-1}ansi−1,此时我们在qiq_iqi位置新加入了一个炸弹,那么当前存在炸弹的位置就是q1,q2.....qiq_1,q_2.....q_iq1,q2.....qi。如果存在一个位置yyy,使得[y,n][y,n][y,n]上≥x...原创 2020-03-22 15:31:44 · 513 阅读 · 0 评论 -
Codeforces Round #620 (Div. 2) F2. Animal Observation (hard version)
题目链接题目大意:给你一个n∗mn*mn∗m的矩阵,你可以在每行放置一个2∗k2*k2∗k的矩形框,问你被矩形框 ,框中的数的和最大值是多少。每个数只计算一次。思路:用dp[i][j]dp[i][j]dp[i][j],表示第iii个矩形框放在第jjj列的时候的最大值。暴力的转移是很显然的:枚举上一次的所有情况即可。优化的话可以用线段树优化成logloglog的转移复杂度。具体实现是:当前...原创 2020-02-17 18:13:55 · 431 阅读 · 3 评论 -
Hello 2020 D. New Year and Conference
题目链接大意:给你nnn个事件,每个时间在a,ba,ba,b地点的开始结束时间。问你有没有一个事件子集,使得,在一个地点不冲突,但是另一个地点冲突。(冲突的意思是:时间相交/重合)思路:显然,问题简化为,存不存在任意两个事件,使得,两个地点有且只有一个地点使得两个事件时间相交。那么问题就好解决了:al,ar,bl,bral,ar,bl,bral,ar,bl,br,代表每个事件的a,ba,ba...原创 2020-01-05 16:42:59 · 404 阅读 · 0 评论 -
Educational Codeforces Round 76 (Rated for Div. 2) E. The Contest(线段树+模拟)
题目链接大意:给你三个数组,你 可以把任意数组的任意 元素 放到 任意数组中,使得第一个数组是前缀,第三个数组是后缀,剩下的元素在第二个数组。我们把三个东西分别记为1,2,31,2,31,2,3,那么相当于1−n1-n1−n的元素是连续 的1和连续的2和连续的3组成 。我们用暴力的思想,就是枚举两个分界点嘛。然后用数据结构优化这个暴力,先假设只有2,3,那么我们枚举2,3的分界点,记录每...原创 2019-11-28 15:07:34 · 102 阅读 · 0 评论 -
AtCoder Beginner Contest 146 F - Sugoroku(线段树+思维)
题目链接题意:给你长度n+1n+1n+1的一个010101串,下标[0,n+1][0,n+1][0,n+1] , 你从000出发,每次走的步数 的范围[1,m][1,m][1,m],让你走到n+1n+1n+1,000的地方可以走, 111的地方不能走,使得步数最少的情况下,方案的字典序最小。输出这个方案。无解输出−1-1−1我们先用线段树维护出每个000走到终点最少多少步记为数组fff,然后从...原创 2019-11-28 12:35:38 · 320 阅读 · 0 评论 -
CF1093G Multidimensional Queries
题目链接思路:把题目中的绝对值式子拆开那么答案就是max{ ∑i=1kai∗Qi+∑i=1kbi∗Qi,Qi∈{1,−1} }∵k≤5max\{~~\sum_{i=1}^ka_i*Q_i+\sum_{i=1}^kb_i*Q_i,Q_i\in \{ 1,-1\}~~\}\\\because k\leq5 max{ i=1∑...原创 2019-09-26 19:05:55 · 167 阅读 · 0 评论 -
CF457C C. Elections
题目链接大意:有n个人,每个人有两个参数a,ba,ba,b,表示第i−thi-thi−th人投a,让他改变注意需要b的代价。问你现在要使得投0的人最多,最少代价是多少?思路:我们枚举其他人被投的最大次数,然后把多的全部投0,剩下的不够的再加上。用一个线段树维护一下前x小的和就行了。注意要特判一下一开始就合法的情况。细节见代码:#include<bits/stdc++.h>...原创 2019-09-26 18:45:17 · 298 阅读 · 0 评论 -
Educational Codeforces Round 67 (Rated for Div. 2)D. Subarray Sorting(线段树+思维)
题目链接大意:给你两个数组a,ba,ba,b,第一个数组可以将任意子数组按非递减顺序排序,问你是否能变成第二个数组思路:先将aaa数组建一个最小值线段树,然后我们遍历bbb数组,显然对于每个bib_ibi,我们需要一个下标最小的等于当前元素的aka_kak来移动到iii这个位置,那么我们先考虑b1b_1b1,显然,要想aaa数组与b1b_1b1匹配的数可以移动到111位置,那么aka_...原创 2019-07-02 15:29:53 · 138 阅读 · 0 评论 -
hdu6606 Distribution of books(二分+dp+线段树/树状数组)
题目链接大意:给你一个长度为n的数组和一个k,让你将数组连续的分成k段(可以丢弃末尾),使得每段和的最大值最小。思路:先将前缀和离散化,然后考虑二分答案,对每个mid,我们考虑dp来check,枚举每个数i,i∈[1,n]i,i\in[1,n]i,i∈[1,n],如果sum[i]≤mid,sum[i]\leq mid,sum[i]≤mid,那么显然dp[i]dp[i]dp[i]最小是1,然...原创 2019-08-02 15:29:42 · 296 阅读 · 0 评论 -
hdu6602 Longest Subarray(线段树+思维)
题目链接大意:给你一个长度为n的数组,然后每个元素都是[1,c][1,c][1,c]之间的整数,然后让你求一个最大的子数组使得这个子数组中每种数出现的次数大于k次,问你满足条件的最长子数组。思路:先假设右端点为n,对所有的数预处一遍,枚举每种数,如果没出现的话显然[1,n][1,n][1,n]的每个数当左端点都可以,若出现超过k次,那么显然有两端封闭的区间可以满足条件,一个是没出现过这个数的所...原创 2019-07-26 18:46:56 · 572 阅读 · 0 评论 -
洛谷P3384 【模板】树链剖分
题目链接很早就想学的模板,由于懒拖到现在(其实是菜)树链剖分其实是将树形结构处理成线性序列然后用数据结构来维护树的一个东西。可以解决很多树上问题。具体重要的三个函数为:一.dfs1第一遍dfs遍历这颗树,处理出每个点的子树大小(包含自己)为sizsizsiz,节点的父亲节点为fafafa,节点的深度为dedede,还有每个节点的重儿子(siz值最大的儿子)void dfs1(int n...原创 2019-08-06 15:59:58 · 173 阅读 · 0 评论 -
2019牛客暑期多校训练营(第十场)F Popping Balloons(线段树)
题目链接大意:给你n个气球位置,现在你可以水平,竖直取至多三排,三列的气球,且每次相邻的行,距离不超过k,列也是如此思路:我们按列(每个列号有三个列的贡献)建线段树,然后从小到大遍历最小的行,然后更新在这三行的列。然后查询直接查最大值即可。(注意要撤回更新操作)细节见代码:#include<bits/stdc++.h>#define LL long long#define...原创 2019-08-19 10:58:19 · 187 阅读 · 0 评论 -
hdu6703 array(线段树)
题目链接大意:给你一个1-n的排列,然后支持两种操作l ,给x这个位置加上1e7l r,询问1-r位置上没出现过且大于等于r的最小值思路:我们建一颗权值线段树,维护区间元素的最大位置;首先答案肯定在1-n+1中,所以对于修改操作来说 直接单点修改成一个极大的值。询问操作我们直接询问r+1-n+1的元素出现在>l位置中的最小元素即可。因为是最小值所以我们在递归的过程中,先搜小...原创 2019-08-27 17:30:30 · 134 阅读 · 0 评论 -
2019icpc徐州网络赛 E.XKC's basketball team(线段树)
题目链接大意:给你长度n的数组和k,让你输出n个数,表示每个位置向右最远的位置pos,使得a[pos]-a[i]>=k,输出两个位置中间隔的数量。思路:直接建一个维护区间最大值的线段树,每次查询直接查[i+1,n]范围内>=a[i]+k的最远位置即可。我们查询的时候先查右儿子,没查到就查左儿子,否则答案必然在右儿子中,右儿子中没答案的话,那么答案必然在左儿子中(查询的区间要合法)...原创 2019-09-09 22:09:48 · 196 阅读 · 0 评论 -
bzoj4627 [BeiJing2016]回转寿司(动态开点线段树)
题目链接大意:给你一个长度n的数组,和两个数l,r,问你有多少区间满足l≤∑i=lrai≤rl \leq \sum_{i=l}^ra_i\leq rl≤∑i=lrai≤r,输出即可。思路:枚举区间右端点j,即我们要找的就是有多少个i,使得i<j且l≤sum[j]−sum[i]≤ri<j 且 l\leq sum[j]-sum[i]\leq ri<j且l≤su...原创 2019-09-11 14:41:29 · 152 阅读 · 0 评论 -
Educational Codeforces Round 36 (Rated for Div. 2) E. Physical Education Lessons
题目链接大意:初始n天都是工作日,给你q个操作,分别是把l,r变成工作日或者非工作日。让你求出工作日的天数。思路:n很大,但操作数不大,所以我们要动态开点线段数来解决这个问题,算是裸题了。记录每个点和左右儿子节点的编号,如果是新的点就新开一个节点。其他的操作都是根普通线段树一样拉细节见代码:#include<bits/stdc++.h> #define fi first...原创 2019-09-16 14:18:24 · 118 阅读 · 0 评论 -
Educational Codeforces Round 72 (Rated for Div. 2) E. Sum Queries? (线段树)
题目链接大意:给你n个数,支持修改和查询操作查询一个和最小的集合,使得该集合不平衡(就是不满足:集合的和的所有位上的数字等于集合中的至少一个数的同位)思路:显然我们要找到某一位上存在两个不为0的最小数,这两个数加起来就是答案。显然我们要拆分每一位建10颗线段树。具体做法:把每个数拆开,看每一位是多少,如果是0,那么贡献就是无穷大,否则就是原本的数。修改就算重新拆一下数往上但点更新即可。。...原创 2019-09-16 14:31:30 · 129 阅读 · 0 评论 -
Educational Codeforces Round 46 (Rated for Div. 2) F. One Occurrence(线段树)
题目链接大意:给你一个数组,询问一个区间仅出现一次的数。思路:我们记录每个位置x左边的第一个相同数的位置y,记为这个x的值为y,如果左边没数的话就是0,然后询问的区间必然是满足存在一个t,t∈[l,r]t,t\in[l,r]t,t∈[l,r],且f(t)<lf(t)<lf(t)<l,f(t)f(t)f(t)就是左边第一个数的位置,如果找到的这个t,那么答案就存...原创 2019-09-16 21:49:57 · 107 阅读 · 0 评论 -
线段树模板(hdu1166)
#include <set>#include <map>#include <queue>#include <stack>#include <math.h>#include <bitset>#include <vector>#include <stdio.h>#includ原创 2019-01-19 21:25:49 · 116 阅读 · 0 评论