首页 > 其他分享 >线段树维护单调栈——区间查询版本 & 维护递减序列

线段树维护单调栈——区间查询版本 & 维护递减序列

时间:2024-08-23 23:37:17浏览次数:11  
标签:rs int 线段 mid ans 维护 单调 define

这次算是完全搞懂了吧()()(

#include <bits/stdc++.h>
#define raed read
#define cacl calc
#define pb push_back
#define pii pair <int, int>
#define int long long
#define fi first 
#define se second
#define ls p << 1
#define rs p << 1 | 1
using namespace std;
const int N = 2e5 + 5, M = 20; int read();

int n, la[N], lb[N];
struct node {
	int x, y, id;
} p[N]; 

int ans;

struct sT {
	int maxn, sum;
} T[N << 2];

int get(int p, int l, int r, int x) { // 选的数 > x 
	if(l > r) return 0;
	if(T[p].maxn <= x) return 0;
	if(l == r) return T[p].maxn > x; int mid = l + r >> 1;
	if(T[rs].maxn <= x) return get(ls, l, mid, x);
	return get(rs, mid + 1, r, x) + T[p].sum - T[rs].sum;
}

void update(int p, int k, int x, const int l = 1, const int r = n) {
	if(l == r) return T[p].sum = 1, T[p].maxn = x, void();
	int mid = l + r >> 1;
	if(k <= mid) update(ls, k, x, l, mid);
	else update(rs, k, x, mid + 1, r);
	T[p].maxn = max(T[ls].maxn, T[rs].maxn); 
	int sb = get(ls, l, mid, T[rs].maxn);
	T[p].sum = T[rs].sum + sb; 
}

int now;
int query(int p, int ql, int qr, const int l = 1, const int r = n) { 
	if(ql <= l and r <= qr) {
		int w = get(p, l, r, now);
		now = max(now, T[p].maxn);
		return w;
	}
	int mid = l + r >> 1, ans = 0;
	if(qr > mid) ans += query(rs, ql, qr, mid + 1, r);
	if(ql <= mid) ans += query(ls, ql, qr, l, mid);
	return ans;
}

void solve() {
	cin >> n;
	for(int i = 1;i <= n; ++i) p[i].x = read(), p[i].y = read();
	sort(p + 1, p + n + 1, [&](node a, node b){ return a.x < b.x; });
	for(int i = 1;i <= n; ++i) la[i] = p[i].x, lb[i] = p[i].y;
	sort(la + 1, la + n + 1); sort(lb +1 , lb + n + 1);
	for(int i = 1;i <= n; ++i) 
		p[i].y = lower_bound(lb + 1, lb + n + 1, p[i].y) - lb, p[i].id = i;
	
	sort(p + 1, p + n + 1, [&](node a, node b){ return a.y < b.y; });	
	
	
	for(int i = 1;i <= n; ++i) {
		now = 0;
		ans += query(1, 1, p[i].id);
		update(1, p[i].id, i);	
	}
		
	cout << ans << "\n";
} 


signed main() {
	int T = 1;
	while(T--) solve();
    return 0;
}

/*
对当前点前缀 <= y 的点做单调栈 
类似线段树维护单调栈考虑转换到 CDQ 上,每个点维护当前答案和前缀最小值
你可以找到排序后的那个位置 
按照 y 的大xiao动态加,每次计算答案即可 
线段树维护单调栈怎么做 
*/

int read() {
   char c; int f = 1, sum = 0;
   while(c < '0' or c > '9') {if(c == '-') f = -1;c = getchar();}
   while(c >= '0' and c <= '9') {sum = (sum << 3) + (sum << 1) + (c ^ 48);c = getchar();} 
   return sum * f;
}

标签:rs,int,线段,mid,ans,维护,单调,define
From: https://www.cnblogs.com/LCat90/p/18377244

相关文章

  • LeetCode84(柱状图中最大的矩形)理解单调栈
    1.LeetCode84(柱状图中最大的矩形)给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。示例1:输入:heights=[2,1,5,6,2,3]输出:10解释:最大的矩形为图中红色区域,面积为10示例2:输入......
  • 维护区间信息
    维护区间信息(在线)暴力做法,\(O(n)\)修改,\(O(n)\)查询。但我们会发现多次询问会重复查询一些点,所以我们可以记录下一些区间的信息,查询时就可以节约时间。但我们记录的区间必须满足一些优秀性质:灵活性:记录下的区间组合灵活性高,即查询区间可以尽可能被记录下来的区间记录下来。......
  • 线段树(2)——懒惰标记Lazy Tag(单运算)及例题
    上一篇文章我们讲了线段树的最基本的操作。如果有一种操作叫做区间加法呢?这个时候显然可以依次单点修改,但是时间复杂度太高了。所以可以考虑优化,由于思考过程可能很长,此处直接引入懒惰标记。懒惰标记就是在对一颗树的所有节点进行某种统一操作时,只对根节点做一个标记表示它的子树......
  • 洛谷P10878 [JRKSJ R9] 在相思树下 III && 单调队列
    传送门:P10878[JRKSJR9]在相思树下III将军啊,早卸甲,他还在廿二,等你回家……一道练习单调队列的好题qwq题目意思:很明白了,不再复述。(注意$\foralli$表示对于任意的i,可理解为所有)思路:贪心是很明显的,因为我们要让最后的值最大,首先要把小的值删掉。最后的答案就是进......
  • 蛋托清洗机的优势特点以及维护和保养:
    蛋托清洗机,作为蛋类制品加工领域不可或缺的一环,其全面解答与深入探讨对于提升蛋品加工效率与品质至关重要。本文将详细解答关于蛋托清洗机的各方面问题,方便您更好地了解和应用这一高效、智能的清洗设备。一、蛋托清洗机的基本构成与工作原理蛋托清洗机主要由喷淋系统、智能控......
  • Little Bird(单调队列优化的DP)
    题目描述有一排\(n\)棵树,第\(i\)棵树的高度是\(d_i\)。有一只鸟要从第\(1\)棵树飞到第\(n\)棵树。如果鸟降落在第\(i\)棵树,那么它下一步可以降落到第\(i+1,i+2,\dots,i+k\)棵树之中的一棵。如果鸟降落到一棵不矮于当前树的树,那么它的劳累值会\(+1\),否则不会。求劳累值的最小值......
  • Sound(单调队列)
    题目描述第一行有三个整数\(n,m,c(1\leqn\leq10^6,1\leqm\leq10^4,0\leqc\leq10^4)\)。第二行\(n\)个非负整数\(a_1,a_2,\dots,a_n(1\leqa_i\leq10^6)\)。求有多少个i满足[i...i+m-1]区间的极差<=c输出从小到大输出所有满足条件的\(i\),一行一个。如果没有\(i\)满足条......
  • 单调栈和单调队列优化DP
    单调栈和单调队列优化DPluoguP1725琪露诺一道比较板的题明显是一个DP,则有\[{dp}_i=\max_{j=i-r}^{i-l}dp_j+a_i\]如果暴力则为\(O(n^2)\)但是发现\(\max_{j=i-r}^{i-l}dp_j\)就是单调队列所解决的问题,所以直接单调队列维护即可#include<bits/stdc++.h>#defineFAS......
  • 【模板】单调栈
    洛谷P5788【模板】单调栈单调栈就是使栈内元素单调递增或者单调递减的栈,单调栈也只能在栈顶操作。做一个比喻,比方说:有个集训队招人,一个数代表了一个选手的能力值,先进来的选手年龄会比较大,后面的选手年龄比较小,但是这个集训队没有人数限制,那么如果遇到一个比你小还比你强的人那......
  • Element Plus表单调用resetFields方法失效
    问题描述:你会发现在第一次点击新增按钮的时候然后再点击编辑按钮,再点击新增按钮表单是可以正常清空的。但是如果你第一次点击编辑按钮,表单数据回显,关闭窗口再点击新增按钮发现编辑的数据竟然还在,就很玄乎。而且,你点击编辑其他数据再点击新增按钮发现竟然是第一次点击编辑的数据!......