ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Luogu P1502.窗口的星星

2021-01-15 08:35:07  阅读:190  来源: 互联网

标签:星星 P1502 rs int Luogu mid update ls ans


分析

一个非常显然的单调队列+线段树的常规题
当然,扫描线一样一样的

但因为以前是直接动态开点的,所以这次打个离散化版本

\(Code\)

#include<cstdio>
#include<algorithm>
#include<iostream>
#define LL long long
#define ls (k << 1)
#define rs (ls | 1)
using namespace std;

const int N = 10004;
int n, W, H, X[N], Y[N], T, d[N];
LL ans, mx[N << 2], tag[N << 2];
struct point{int x, y, v;}a[N];

inline bool cmp1(point a, point b){return a.x < b.x;}
inline bool cmp2(point a, point b){return a.y < b.y;}

void build(int l, int r, int k)
{
	mx[k] = tag[k] = 0;
	if (l == r) return;
	int mid = (l + r) >> 1;
	build(l, mid, ls), build(mid + 1, r, rs);
}
void update(int l, int r, int k, int x, int y, int v)
{
	if (x <= l && r <= y) return void(tag[k] += v);
	int mid = (l + r) >> 1;
	if (x <= mid) update(l, mid, ls, x, y, v);
	if (y > mid) update(mid + 1, r, rs, x, y, v);
	mx[k] = max(mx[ls] + tag[ls], mx[rs] + tag[rs]);
}

inline int search_up(int y)
{
	int l = 1, r = n, mid, ret;
	while (l <= r)
	{
		mid = (l + r) >> 1;
		if (Y[mid] >= y) ret = mid, r = mid - 1;
		else l = mid + 1;
	}
	return ret;
}

int main()
{
	scanf("%d", &T);
	for(; T; T--)
	{
		scanf("%d%d%d", &n, &W, &H);
		ans = 0, build(1, n, 1);
		for(register int i = 1; i <= n; i++) scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].v);
		sort(a + 1, a + n + 1, cmp2);
		for(register int i = 1; i <= n; i++) Y[i] = a[i].y, a[i].y = i;
		sort(a + 1, a + n + 1, cmp1);
		for(register int i = 1; i <= n; i++) X[i] = a[i].x, a[i].x = i;
		int h = 1, t = 0;
		for(register int i = 1; i <= n; i++)
		{
			while (h <= t && X[a[i].x] - X[a[d[h]].x] >= W) 
				update(1, n, 1, search_up(Y[a[d[h]].y] - H + 1), a[d[h]].y, -a[d[h]].v), ++h;
			d[++t] = i, update(1, n, 1, search_up(Y[a[i].y] - H + 1), a[i].y, a[i].v);
			ans = max(ans, mx[1] + tag[1]);
		}
		printf("%lld\n", ans);
	}
}

标签:星星,P1502,rs,int,Luogu,mid,update,ls,ans
来源: https://www.cnblogs.com/leiyuanze/p/14280319.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有