随笔分类 -  数据结构 - 树状数组

摘要:打表发现一个排列满足要求,当且仅当这个排列以被拆成两个 LIS(其中一个可以为空)考虑状压 DP:$f[S][i][0/1]$ 表示加进去数集 $S$,第二个 LIS 的最大值为 $i$,是否顶上界.我们拆分 $LIS$ 的方式是贪心地将较大的值分给第一个,剩下的分给第二个. 这个时间复杂度大概是 阅读全文
posted @ 2020-08-10 22:08 EM-LGH 阅读(185) 评论(0) 推荐(0)
摘要:找规律+猜结论. 不难发现这个旋转 180 度其实是对于一个 $2 \times 2$ 的正方形内部对角线分别交换. 所以对于这个 $2 \times n$ 的数组来说可以将所有格子分成两类,这两类互不干扰. 那么判断是否合法的条件之一就是初态和末态对应种类的格子应该相同. 即 $(1,1)$,$( 阅读全文
posted @ 2020-07-27 08:03 EM-LGH 阅读(231) 评论(0) 推荐(0)
摘要:手画一下发现最优策略是统一向左/向右移,那我们就让鞋子向左移. 因为一个鞋子向左移不会使右面的答案变差,而最左面没有被匹配的鞋子也迟早要和一个鞋子去匹配. 写了一个 $O(n^2)$ 的暴力,过掉了 50pts. 然后我们发现将鞋子从 $j$ 移到 $i$ 的代价是 $j-i-$ $[i,j]$ 中 阅读全文
posted @ 2020-07-16 23:00 EM-LGH 阅读(174) 评论(0) 推荐(0)
摘要:求:对一个数列进行 $k$ 次冒泡排序后的结果. 先考虑数字互不相同的情况. 设 $i$ 位置前大于 $v[i]$ 的数字有 $ma[i]$ 个. 那么,如果 $k \leqslant ma[i]$,则 $i$ 位置的数就会移到 $i-k$. 否则,$i$ 位置的数就会向前移动 $ma[i]$ 次后 阅读全文
posted @ 2020-07-13 14:48 EM-LGH 阅读(163) 评论(0) 推荐(0)
摘要:非常好的一道题. 假设当前要求 $ans[x]$. 先令 $x$ 为根,然后发现对于子树 $y$ 来说,令 $g[y]$ 表示距离 $y$ 最近的叶子节点. 若 $g[y] \leqslant dis(x,y) $ 则 $y$ 子树的叶子中选一个就可以防止 $x$ 走到 $y$ 的子树中. 那么这个 阅读全文
posted @ 2020-07-09 10:46 EM-LGH 阅读(163) 评论(0) 推荐(0)
摘要:往届学长的一场比赛. 总结:三道水题 haha! Task 1 省选 jloi.cpp/in/out 给你一个字符串,你每次只能删除一个回文串,问你最少需要几步将字符串删完,或输出无解. 题解:显然,答案最多为 2,而如果这个串本身就不是回文串答案就是 1,所以难点就是判断无解的情况. 手画几组发现 阅读全文
posted @ 2020-06-16 14:20 EM-LGH 阅读(155) 评论(0) 推荐(0)
摘要:我之前一直以为这道题很厉害,没想到就是一个整体二分模板题,就当省选前练练手了. 我们计算每个木棍是被哪个子弹所击碎的,然后这个显然具有单调性. 每一条木棍分别去二分答案的话时间复杂度大概是 $O(n^2 \log n)$ 的. 所以我们就采用整体二分的方式,然后判断的话用一个树状数组来一个区间加法就 阅读全文
posted @ 2020-06-11 08:37 EM-LGH 阅读(156) 评论(0) 推荐(0)
摘要:code: #include <vector> #include <cstdio> #include <cstring> #include <map> #include <set> #include <algorithm> #define N 300005 #define MAX 320005 #d 阅读全文
posted @ 2020-02-15 17:14 EM-LGH 阅读(229) 评论(2) 推荐(0)
摘要:这道题在家里仔细想想还是挺好想的... 考场的时候还是要镇定,给每道题要安排足够的思考时间. code: #include <cstdio> #include <cstring> #include <vector> #include <string> #include <algorithm> #de 阅读全文
posted @ 2020-01-26 19:47 EM-LGH 阅读(173) 评论(0) 推荐(0)
摘要:有一个长度为 $m$ 的整数序列 $c$,初始值都是 0 还有一个长度为 $n$ 的操作序列,第 $i$ 个元素用三元组 $(l_{i},r_{i},v_{i})$ 描述,代表将 $c[l_{i}] \sim c[r_{i}]$ 都赋值为 $v_{i}$ 有 $q$ 个询问,第 $i$ 次询问让你求 阅读全文
posted @ 2020-01-07 18:28 EM-LGH 阅读(201) 评论(0) 推荐(0)
摘要:这道题的思路很神啊 ~ #include <cstdio> #include <string> #include <cstring> #include <algorithm> using namespace std; const int N=200006; int cur_id; namespace 阅读全文
posted @ 2019-12-24 20:55 EM-LGH 阅读(323) 评论(0) 推荐(0)
摘要:以前一直以为这道题很恶心,事实证明还好,好多地方脑残写丑了. code: #include <cstdio> #include <string> #include <cstring> #include <algorithm> #define N 50003 using namespace std; 阅读全文
posted @ 2019-12-21 16:00 EM-LGH 阅读(207) 评论(0) 推荐(0)
摘要:题意:给定一颗树,有 $m$ 次操作. 操作 0 :向集合 $S$ 中加入一条路径 $(p,q)$,权值为 $v$ 操作 1 :给定一个点集 $T$,求 $T$ 的并集与 $S$ 中路径含交集的权和.(就是如果路径 $i$ 与 $T$ 有交集,就产生 $v_{i}$ 的贡献) 数据范围:路径长度 $ 阅读全文
posted @ 2019-12-20 17:56 EM-LGH 阅读(266) 评论(0) 推荐(0)
摘要:这个思路很巧妙啊 ~ code: #include <cstdio> #include <algorithm> #define N 2050 #define ll int #define setIO(s) freopen(s".in","r",stdin) using namespace std; 阅读全文
posted @ 2019-12-19 20:48 EM-LGH 阅读(159) 评论(0) 推荐(0)
摘要:问题转化为求每一个极长横线段与极长纵线段的交点个数. 这个东西用扫描线+树状数组维护一下就可以了. code: #include <cstdio> #include <algorithm> #define N 200005 #define setIO(s) freopen(s".in","r",st 阅读全文
posted @ 2019-12-18 09:17 EM-LGH 阅读(155) 评论(0) 推荐(0)
摘要:易得方程 $f[i]=max(f[j])+v[i]$,条件是 $t[i]<t[j]$ 且 $2t[j]-x[j]<=2t[i]-x[i]$ 且 $2t[j]+x[j]<=2t[i]+x[i]$ 一共有 3 个条件,但是你发现如果满足后面两个条件,自然满足第一个条件. 所以可以将问题转化为一个二位偏序 阅读全文
posted @ 2019-11-02 14:17 EM-LGH 阅读(126) 评论(0) 推荐(0)
摘要:有一个小性质:就是一个下标排列的最小移动次数就是逆序对数. 我们发现最终形态一定是一个波峰. 那么我们求的就是形成波峰的下标最少逆序对数. 考虑将元素从小到大依次插入. 那么,对于第 $i$ 个元素,一定是放到左面或右面(就是从 1....left 或 right....n) 中的left和righ 阅读全文
posted @ 2019-10-29 16:32 EM-LGH 阅读(142) 评论(0) 推荐(0)
摘要:将要查询的信息放到 dfs 序上并用树状数组查一个前缀和即可. 阅读全文
posted @ 2019-09-28 13:14 EM-LGH 阅读(179) 评论(0) 推荐(0)
摘要:发现每一次 $[b[i]+1,n-a[i]]$ 这个区间的分数必须相同,否则不合法. 而一个相同的区间 $[l,r]$ 最多只能出现区间长度次. 于是,就得到了一个 $dp:$ 将每一种区间的出现次数看作是价值,要选出若干个互不相交的区间使得价值最大. 这个直接用树状数组优化 dp 跑一下就行了~ 阅读全文
posted @ 2019-09-26 09:50 EM-LGH 阅读(143) 评论(0) 推荐(0)
摘要:开始zz写了一个主席树,后来发现写个树状数组就行~ 阅读全文
posted @ 2019-09-07 00:18 EM-LGH 阅读(183) 评论(0) 推荐(0)