题意 给你长度为$n$的序列,序列中的每个元素$i$有一个区间限制$[l_i,r_i]$,你从中选出一个子序列,并给它们标号$x_i$,要求满足 $,∀i<j,x_i<x_j$,且$, ∀i,x_i∈[l_i,r_i]$. 问满足条件子序列的长度最长为多少? 其中$1\leq n\leq3\times 10^5\ 1\leq l_i\leq r_i\leq 10^9$ 题解 不妨设$f[i][j]$表示已经选到第$i$个,其中最大值为$j$最多能选几个. 显然是开不下的...但是还记得$O(n…
Description 给出 \(n\) 个数 \(a_i\),每一个数有一个取值 \([l_i,r_i]\) ,你来确定每一个数,使得 \(LIS\) 最大 题面 Solution 按照平时做法,设 \(f[i]\) 表示 \(LIS\) 长为 \(i\) 时, \(LIS\) 结尾的最小值 考虑插入一个取值为 \([L,R]\) 可以更新的值 找到小于 \(L\) 的第一个数 \(p\) 和小于 \(R\) 的第一个数 \(q\) 那么 \(f[p+1]\) 可以更新为 \(L\) , \(…
[CF809D]Hitchhiking in the Baltic States(Splay,动态规划) 题面 CF 洛谷 题解 朴素\(dp\):设\(f[i][j]\)表示当前考虑到第\(i\)个元素,结尾位置是\(j\)的最大选择数. 然而这样就很呆. 换个状态:设\(f[i][j]\)表示当前考虑到第\(i\)个元素,长度为\(j\)时,最后一个数可以选择的最小值. 这个东西看起来就舒服多了. 拿\(Splay\)维护第二维,考虑每次加入一个区间对于答案的影响,假装当前加入区间是\([l…
FHQ treap 的整理 treap = tree + heap,即同时满足二叉搜索树和堆的性质. 为了使树尽可能的保证两边的大小平衡,所以有一个key值,使他满足堆得性质,来维护树的平衡,key值是随机的. treap有一般平衡树的功能,前驱.后继.第k大.查询排名.插入.删除.也比较好写 但是对于区间上的问题是不能做的,例如 区间增减 区间求最值 区间反转(倒序) 区间移动(把一段剪切.粘贴) (splay是可以做的) 但是有一种神奇的数据结构,即可以满足treap的功能,也可以区间上进行…
传送门: 解题思路: 算是补坑了,这题除了Invert以外就可以树剖线段树解决了. 考虑Invert操作,延续先前树链剖分的做法,考虑先前算法的瓶颈. 最暴力的方法是暴力交换权值,然而这种方法忽略了当前树链剖分序的一个性质,那就是很多部分的树链是连续的,而且仅有$O(\lg n)$个区间. 考虑只有一个区间的做法,就很显然是区间翻转(这个不会搞的话你是怎么做到这道题的),于是,由于区间个数并不多,我们大胆猜想:正确的解法就是考虑翻如何转这些不连续区间 由于链区间具有一定的连续性,且我们需要翻转其…
题目:http://codeforces.com/contest/809/problem/D 如果值是固定的,新加入一个值,可以让第一个值大于它的那个长度的值等于它. 如今值是一段区间,就对区间内的dp值都有影响:中间的那些的值变成了上一个的值+1,左边 l 处多了一个点,右边第一个大于等于 r 的点被删掉. 用 splay 维护这些点:点的个数就是最多能达到的长度. 又好好学习了一番 splay .带有标记的原来是要在那个 splay 操作前那样一条链地 pushdown下来呀. 非常奇怪的是…
http://www.lydsy.com/JudgeOnline/problem.php?id=2329 需要改变的括号序列一定长这样 :)))((( 最少改变次数= 多余的‘)’/2 [上取整] + 多余的‘(’ /2 [上取整] 把 ‘)’ 看做1,‘(’ 看做-1 那么最少改变次数=最大前缀和/2 [上取整]+ 最小后缀和/2 [上取整] 覆盖标记的优先级高于翻转标记和取反标记 即下放覆盖标记时,同时清空翻转标记和取反标记 且先下放覆盖标记 翻转: 最大前缀和 和 最大后缀和 交换 最小前…
http://www.lydsy.com/JudgeOnline/problem.php?id=1500 1.覆盖标记用INF表示无覆盖标记,要求可能用0覆盖 2.代表空节点的0号节点和首尾的两个虚拟节点,所有有关取max的信息全部设为负无穷,但注意不要无穷相加爆掉int 3.空间,用一个队列回收已删除的节点的编号 4.建树的时候采用的笛卡尔树的构造方式,但并没有比错误的忽略优先级的build快多少 5.手写的max快 inline int& max(int &x, int &y)…
题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 输入输出格式 输入格式: 第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2, \cdots n-1,n)(1,2,⋯n−1,n) m表示翻转操作次数 接下来m行每行两个数 [l,r][l,r] 数据保证 1 \leq l \leq r…
题面 传送门 题解 可持久化\(Treap\)搞一搞 //minamoto #include<bits/stdc++.h> #define R register #define inline __inline__ __attribute__((always_inline)) #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i) #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i) #de…