树状数组
h_tour
这个作者很懒,什么都没留下…
展开
-
最大子矩阵 二维树状数组
题目链接 用树状数组维护一个二维数组即可。和二维前缀和求法一样。 具体实现见代码: #include <bits/stdc++.h> using namespace std; int m, n, x, y; int a[1010][1010], sum[1010][1010]; int lowbit(int x) { return x & -x; } void add(int x, int y, int k) { for (int i = x; i <= m; i += lo原创 2021-04-15 17:06:25 · 81 阅读 · 0 评论 -
DP + 树状数组例题
例题一:HDU 3030 Increasing Speed Limits 题意: 求一组数中有多少严格上升子序列。 题解: 由于要求严格上升,因此相同大小的数只能出现一次,我们开始先对原始数组进行排序去重操作。得到的新数组就是离散化的数组,每个数对应的下标表明它是第几大的元素。 这里的状态表示就是dp[i]dp[i]dp[i]表示以第iii大的元素结尾的严格上升子序列的个数。 显然,对于当前的状态,可以转移到所有满足的d[j]d[j]d[j],这里的d[j]d[j]d[j]要求a[j]<a[i]&am原创 2021-04-15 15:22:22 · 84 阅读 · 0 评论 -
poj 1990 MooFest
题目链接 思路参考链接 实现细节见代码: #include <bits/stdc++.h> using namespace std; #define int long long typedef long long ll; const int MAXN = 1e5 + 10; int sum[2][MAXN]; struct Node { int v, w; }a[MAXN]; bool cmp(Node x, Node y) { return x.v < y.v; } int low原创 2021-04-14 16:10:12 · 66 阅读 · 0 评论 -
PAT 甲级真题 1057 Stack
题目链接 题解: 题目就是求第k小元素问题。由于操作次数比较多,因此直接排序输出中间元素会超时,因此这题要用到第K小元素的经典做法之一,树状数组。用树状数组来维护现在栈内元素的信息,然后使用二分查找中间元素的值。这样时间复杂度是O(nlogn)O(nlogn)O(nlogn)。 实现细节见代码: #include <bits/stdc++.h> using namespace std; const int MAXN = 1e5 + 10; int c[MAXN]; stack<int&g原创 2021-03-08 16:00:43 · 113 阅读 · 0 评论