题解:SP1741 TETRIS3D - Tetris 3D
题意
维护一个
要求支持一个操作:查询一个矩形区域的最大值,并将该区域更新为最大值加上给定的数。
分析
发现
二维线段树,顾名思义,就是在普通线段树的每一个节点上维护一棵线段树。
在本题中,外层节点上的最大值 mx
和懒标记 tag
均为一棵普通线段树。
普通的修改和查询操作和一般线段树无异。
但是普通的标记下放会涉及到线段树合并,单次下放有可能卡到
所以本题需要使用标记永久化的技巧。
具体地说,标记不会下放,而是在查询的时候连带标记一同查询。
时间复杂度
Code
#include<bits/stdc++.h> using namespace std; #define maxv 1000 #define mid ((l+r)>>1) #define lson x->lc, l, mid #define rson x->rc, mid+1, r struct In_SegT { struct node { node *lc, *rc; int mx, tag; node() {lc=rc=0, mx=tag=0;} }*rt; In_SegT() {rt=0;} void modify(node *&x, int l, int r, int L, int R, int v) { if(!x) x=new node; x->mx=max(x->mx, v); if(L<=l&&r<=R) return x->tag=max(x->tag, v), void(); if(L<=mid) modify(lson, L, R, v); if(R>mid) modify(rson, L, R, v); } int query(node *x, int l, int r, int L, int R) { if(!x) return 0; if(L<=l&&r<=R) return x->mx; int ret=x->tag; if(L<=mid) ret=max(ret, query(lson, L, R)); if(R>mid) ret=max(ret, query(rson, L, R)); return ret; } void modify(int L, int R, int v) {modify(rt, 1, maxv, L, R, v);} int query(int L, int R) {return query(rt, 1, maxv, L, R);} }; struct Out_SegT { struct node { node *lc, *rc; In_SegT *mx, *tag; node() {lc=rc=0, mx=new In_SegT, tag=new In_SegT;} }*rt; void modify(node *&x, int l, int r, int L1, int R1, int L2, int R2, int v) { if(!x) x=new node; x->mx->modify(L2, R2, v); if(L1<=l&&r<=R1) return x->tag->modify(L2, R2, v); if(L1<=mid) modify(lson, L1, R1, L2, R2, v); if(R1>mid) modify(rson, L1, R1, L2, R2, v); } int query(node *x, int l, int r, int L1, int R1, int L2, int R2) { if(!x) return 0; if(L1<=l&&r<=R1) return x->mx->query(L2, R2); int ret=x->tag->query(L2, R2); if(L1<=mid) ret=max(ret, query(lson, L1, R1, L2, R2)); if(R1>mid) ret=max(ret, query(rson, L1, R1, L2, R2)); return ret; } }tr; int main() { int d, s, n, w, x, y; cin>>d>>s>>n; while(n--) { cin>>d>>s>>w>>x>>y; int h0=tr.query(tr.rt, 1, maxv, x+1, d+x, y+1, s+y); tr.modify(tr.rt, 1, maxv, x+1, d+x, y+1, s+y, h0+w); } cout<<tr.rt->mx->rt->mx; }
本文作者:redacted-area
本文链接:https://www.cnblogs.com/redacted-area/p/18429460
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步