首页 > 其他分享 >[POI2006] TET-Tetris 3D

[POI2006] TET-Tetris 3D

时间:2023-09-10 18:22:43浏览次数:40  
标签:标记 int 线段 POI2006 tg 区间 Tetris TET mx

题目链接1题目链接2

注意到这道题本质就是一个矩形求和矩形赋值的操作。其中满足:对于任意一个点,每次赋予的权值是单调递增的。

这看起但就像是一个二维线段树能做的范畴。但是众所周知,二维线段树的外层无法进行标记上传操作(无法 pushup),故而这题我们考虑标记永久化。同时,为了简化问题,我们先关心一维的情况。

我们考虑对于每个点,记录两个权值:\(mx\) 和 \(tg\)。前者为当前区间的最大值,后者为标记值。

  • 对于修改操作。沿用常规的懒标记线段树的方法,更新那些被当前区间完全包含的极大区间的 \(tg\) 值。同时,更新修改过程中遍历到过的所有节点的 \(mx\)。
  • 对于询问操作,进行标记永久化的查询。同时,对于那些被当前区间完全包含的极大区间,我们也拿它的 \(mx\) 值区更新答案。

二维情况类似。

点击查看代码
#include <bits/stdc++.h>
#define FL(i, a, b) for(int i = (a); i <= (b); i++)
#define FR(i, a, b) for(int i = (a); i >= (b); i--)
using namespace std;
int D, S, N;
namespace T{
	struct SGTx{
		int mx[2050], tg[2050];
		void Upd(int p, int l, int r, int x, int y, int v){
			mx[p] = max(mx[p], v);
			if(x <= l && r <= y){tg[p] = max(tg[p], v); return;}
			int mid = l + r >> 1;
			if(x <= mid) Upd(p << 1, l, mid, x, y, v);
			if(mid < y) Upd(p << 1 | 1, mid + 1, r, x, y, v);
		}
		int Qry(int p, int l, int r, int x, int y){
			if(x <= l && r <= y) return mx[p];
			int mid = l + r >> 1, ret = tg[p];
			if(x <= mid) ret = max(ret, Qry(p << 1, l, mid, x, y));
			if(mid < y) ret = max(ret, Qry(p << 1 | 1, mid + 1, r, x, y));
			return ret;
		}
	} mx[2050], tg[2050];
	void Upd(int p, int l, int r, int x1, int y1, int x2, int y2, int v){
		mx[p].Upd(1, 1, S, x2, y2, v);
		if(x1 <= l && r <= y1){tg[p].Upd(1, 1, S, x2, y2, v); return;}
		int mid = l + r >> 1;
		if(x1 <= mid) Upd(p << 1, l, mid, x1, y1, x2, y2, v);
		if(mid < y1) Upd(p << 1 | 1, mid + 1, r, x1, y1, x2, y2, v);
	}
	int Qry(int p, int l, int r, int x1, int y1, int x2, int y2){
		if(x1 <= l && r <= y1) return mx[p].Qry(1, 1, S, x2, y2);
		int mid = l + r >> 1, ret = tg[p].Qry(1, 1, S, x2, y2);
		if(x1 <= mid) ret = max(ret, Qry(p << 1, l, mid, x1, y1, x2, y2));
		if(mid < y1) ret = max(ret, Qry(p << 1 | 1, mid + 1, r, x1, y1, x2, y2));
		return ret;
	}
}
int main(){
	scanf("%d%d%d", &D, &S, &N), D++, S++;
	FL(i, 1, N){
		int d, s, w, x, y, h;
		scanf("%d%d%d%d%d", &d, &s, &w, &x, &y), x++, y++;
		h = T::Qry(1, 1, D, x, x + d - 1, y, y + s - 1);
		T::Upd(1, 1, D, x, x + d - 1, y, y + s - 1, h + w);
	}
	printf("%d\n", T::Qry(1, 1, D, 1, D, 1, S));
	return 0;
}

标签:标记,int,线段,POI2006,tg,区间,Tetris,TET,mx
From: https://www.cnblogs.com/zac2010/p/17691626.html

相关文章

  • @JsonFormat 和 @DateTimeFormat
    前端传给后端:当前端传来的是键值对,用@DateTimeFormat规定接收的时间格式。当前端传来json串,后台用@RequestBody接收,用@JsonFormat规定接收的时间格式。后端传给前端:后端返回给前端的时间值,只能用@JsonFormat规定返回格式,@DateTimeFormat无法决定返回值的格式。参......
  • Qt QDateTime类型加减计算
    在Qt框架中,QDateTime类提供了一系列可以进行日期和时间的加减计算的方法,可用于处理日期和时间相关的问题。一些常用的方法如下:1.QDateTime::addDays(intdays):在当前时间的基础上增加指定天数后的日期和时间。1QDateTimecurrentDateTime=QDateTime::currentDateTime();2Q......
  • QT QDateTime 计算两个日期时间差
    1、计算两个日期天数差1QDateTimetime1=QDateTime::fromString("2020-11-2616:40:02","yyyy-MM-ddhh:mm:ss");2//QDateTimetime2=QDateTime::fromString("2020-11-2616:43:02","yyyy-MM-ddhh:mm:ss");3QDateTimetime2=QD......
  • ElementUI-DateTimePicker时间限制+清空
    1需求有两个时间控件,开始时间不能大于结束时间<el-col:span="8"><el-date-pickerv-model="queryParams.startDate"size="small"type="datetime"......
  • Pandas中的to_datetime函数用法
    Pandas中的to_datetime函数用法importdatetimeimportpandasaspdimportnumpyasnp将字符串转换为日期时间:pd.to_datetime('2023-09-06')Timestamp('2023-09-0600:00:00')将多个字符串转换为日期时间:pd.to_datetime(['2023-09-06','2023-09-07'......
  • dotnet 将任意时区的 DateTimeOffset 转换为中国时区时间文本
    本文告诉大家在拿到任意时区的DateTimeOffset对象,将DateTimeOffset转换为使用中国的+8时区表示的时间在开始之前,需要说明的是,采用DateTimeOffset会比DateTime更优的一个点是DateTimeOffset是带上时区的,这就意味着方便的在多个不同的时区进行传递和序列化的时候,不会丢......
  • mysql 8.0 date、datetime time, timestamp的区别
    详解date、datetime的区别顾名思义,date日期,time是时间,datetime日期时间,所以date,time是datetime的日期部分,可以理解为时间戳date类型。它表示日期,格式为“YYYY-MM-DD”。它可以存储从公元1000年到9999年之间的日期。date类型的存储空间为3个字节。time类......
  • eclipse下wtp+HibernateTools开发笔记
    作者fbysss关键字:eclipse,hibernate准备包:HibernateTools-3.1.0.beta4.zipGEF-SDK-3.1.1.ziphibernate-3.1.2.zipJEM-SDK-1.1.0.1.zipwtp-sdk-M200602010238.zip1.新建一个javaProject,建立src目录,建立com.sss.common包,2.Java->BuilderPa......
  • java时间类LocalDateTime的前世今生
                                                                        1.日期类API导学设计初衷:Java原本自带的java.util.Date和......
  • LightDB数据库支持datetime类型
    在MySQL中datetime存储包含日期和时间的值。当从datetime列查询数据时,MySQL会以以下格式显示datetime值:YYYY-MM-DDHH:MM:SS。默认情况下,datetime的值范围为1000-01-0100:00:00至9999-12-3123:59:59。当前在LightDB数据库(包括LightDB-X和LightDB-A)已经支持了datetime类型,其实......