首页 > 其他分享 >线段树维护扫描线

线段树维护扫描线

时间:2024-01-16 23:56:26浏览次数:42  
标签:struct int 线段 long maxn 扫描线 维护 void

你需要实现一种数据结构支持以下操作:

  1. 区间加减 1
    保证加减区间一一对应,且先加后减,序列中永远不出现负数。
  2. 查询完整序列中 0 的个数
#include <cstdio>
#include <algorithm>

const int maxn = 1e5 + 10;

long long x[maxn * 2];

struct segmentTree
{
	struct node
	{
		int l, r;
		long long min, len, tag;
	}
	T[maxn * 2 * 4];
	
	void downdata(int p)
	{
		T[p << 1].min += T[p].tag, T[p << 1].tag += T[p].tag;
		T[(p << 1) | 1].min += T[p].tag, T[(p << 1) | 1].tag += T[p].tag;
		T[p].tag = 0;
	}
	
	void updata(int p)
	{
		T[p].min = std::min(T[p << 1].min, T[(p << 1) | 1].min);
		T[p].len = T[p << 1].len * (T[p << 1].min == T[p].min) + T[(p << 1) | 1].len * (T[(p << 1) | 1].min == T[p].min);
	}
	
	void build(int p, int l, int r)
	{
		T[p].l = l, T[p].r = r, T[p].tag = 0, T[p].min = 0, T[p].len = x[r + 1] - x[l];
		if (l != r) build(p << 1, l, (l + r) >> 1), build((p << 1) | 1, ((l + r) >> 1) + 1, r), updata(p);
	}
	
	void add(int p, int l, int r, long long k)
	{
		if (r < T[p].l || T[p].r < l) return;
		else if (l <= T[p].l && T[p].r <= r) T[p].tag += k, T[p].min += k;
		else downdata(p), add(p << 1, l, r, k), add((p << 1) | 1, l, r, k), updata(p);
	}
	
	long long query(int p, int l, int r)
	{
		if (r < T[p].l || T[p].r < l) return 0;
		else if (l <= T[p].l && T[p].r <= r) return T[p].min == 0 ? T[p].len : 0;
		else return downdata(p), query(p << 1, l, r) + query((p << 1) | 1, l, r);
	}
}
T;

struct node
{
	long long x1, x2, y, k;
	bool operator < (const node &that) const { return (*this).y < that.y; }
	node(long long _x1 = 0, long long _x2 = 0, long long _y = 0, long long _k = 0) { x1 = _x1, x2 = _x2, y = _y, k = _k; }
}
a[maxn * 2];

int main()
{
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		long long x1, y1, x2, y2;
		scanf("%lld %lld %lld %lld", &x1, &y1, &x2, &y2);
		a[2 * i - 1] = {x1, x2, y1, 1}, a[2 * i] = {x1, x2, y2, -1};
		x[2 * i - 1] = x1, x[2 * i] = x2;
	}
	std::sort(a + 1, a + 2 * n + 1);
	std::sort(x + 1, x + 2 * n + 1);
	int len = std::unique(x + 1, x + 2 * n + 1) - (x + 1);
	T.build(1, 1, len - 1);
	long long ans = 0;
	for (int i = 1; i <= 2 * n - 1; i++)
	{
		T.add(1, std::lower_bound(x + 1, x + len + 1, a[i].x1) - x, std::lower_bound(x + 1, x + len + 1, a[i].x2) - x - 1, a[i].k);
		ans += (a[i + 1].y - a[i].y) * (x[len] - x[1] - T.query(1, 1, len - 1));
	}
	printf("%lld", ans);
	return 0;
}

标签:struct,int,线段,long,maxn,扫描线,维护,void
From: https://www.cnblogs.com/wxr-blog/p/17968886

相关文章

  • 【线段树/懒标】-【LG】P1253 扶苏的问题
    \(\mathtt{TAGS}\):懒标线段树\(\mathtt{ESTIMATION}\):Tag*2题意实现:区间\(\max\)区间修改某个值区间加First.确定数据结构很显然,区间修改+区间查询所以——线段树。Second.LazyTag由于区间修改和区间加两个操作会互相干扰,所以对于每一个节点给两个Tag,一个......
  • 可持久化线段树学习笔记
    Q&A主席树与可持久化线段树有什么区别?主席树全称:可持久化权值线段树。定义可查询与修改历史版本的线段树。基本思想根据某个定理:空间复杂度一定不会超过时间复杂度。所以我们没有必要在每一次操作时把整个线段树复制一遍。我们在更新版本时,把我们要访问的节点单独......
  • P3373 【模板】线段树 2
    原题链接code#include<bits/stdc++.h>usingnamespacestd;#definelllonglonglla[100005]={0};lllazyadd[400005]={0};lllazymul[400005]={0};lltree[400005]={0};lln,q,m;voidbuild(llnode,llstart,llend){lazyadd[node]=0;lazymul[no......
  • 用于PostgreSQL索引维护的有用查询
    PostgreSQL拥有丰富的索引功能,并且有很多文章解释索引的语法、用法和价值。在本文中,我将编写基本且有用的查询来查看数据库索引的状态。人们开发数据库一段时间后,当需要对软件架构进行更改时,他们忘记了以前的索引清理。这种方法会造成混乱,有时还会因为索引太多而降低数据库速度。......
  • 线段树练习
    Ⅰ.差分与前缀和P2184贪婪大陆题意:给定防线长度\(n\)和操作次数\(m\),每次在[\(l\),\(r\)]内布下一种雷,查询区间雷的种类数。分析:用线段的方式表示区间布的雷:如[2,4]内的种类=[1,4]内的起点-[1,2]内的终点P1438无聊的数列题意:区间加等差......
  • 【LeetCode1747. 应该被禁止的 Leetflex 账户】MySQL用户变量编程;尝试维护一个multise
    题目地址https://leetcode.cn/problems/leetflex-banned-accounts/description/代码witht1as(selectaccount_id,ip_address,loginastick,"login"asmytypefromLogInfounionallselectaccount_id,ip_address,logoutastick......
  • 李超线段树
    李超线段树李超线段树是一种求函数定点最值的线段树,思路高妙,用处也很广。以模板题为例。P4097[HEOI2013]Segment有\(n\)个操作,操作分两种。在平面上加入一条线段,两端端点为\((x_0,y_0)\)和\((x_1,y_1)\),第\(i\)条被插入的线段的标号为\(i\)。给定整数\(k\),询......
  • 程序维护手册
    ......
  • 程序维护手册
    ......
  • 为什么要对服务器进行维护
    我们在日常使用服务器的过程中,经常会遇到死机,卡顿等等,那么该怎么做才能避免出现类似情况。为了确保服务器的正常运行和企业的顺利运营,定期进行服务器维护是必要的。服务器日常维护可以提高性能、保障安全、保持稳定性、延长使用寿命、降低成本、提高服务质量、提升数据安全、支持业......