首页 > 其他分享 >题解:SP1741 TETRIS3D - Tetris 3D

题解:SP1741 TETRIS3D - Tetris 3D

时间:2024-09-24 16:39:04浏览次数:1  
标签:node R2 int 题解 modify query SP1741 mx 3D

题意

维护一个 \(D\times S\) 的平面,每个点有一个高度。

要求支持一个操作:查询一个矩形区域的最大值,并将该区域更新为最大值加上给定的数。

分析

发现 \(D,S\leq10^3\),考虑使用二维线段树维护。

二维线段树,顾名思义,就是在普通线段树的每一个节点上维护一棵线段树。

在本题中,外层节点上的最大值 mx 和懒标记 tag 均为一棵普通线段树。

普通的修改和查询操作和一般线段树无异。

但是普通的标记下放会涉及到线段树合并,单次下放有可能卡到 \(O(D\log D)\)。

所以本题需要使用标记永久化的技巧。

具体地说,标记不会下放,而是在查询的时候连带标记一同查询。

时间复杂度 \(O(N\log^2D)\)。

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;
}

标签:node,R2,int,题解,modify,query,SP1741,mx,3D
From: https://www.cnblogs.com/redacted-area/p/18429460

相关文章

  • 题解:P10950 太鼓达人
    分析显然答案包含长度为\(K\)的所有\(01\)串,每个串和前一个的重叠长度为\(K-1\),所以每个串对长度的贡献为\(1\)。因此该串的长度为所有\(01\)串的个数,即\(2^K\)。考虑第二个如何解决。发现每个位置的状态只有\(0\)和\(1\),考虑爆搜。显然直接搜的复杂度为\(O(2^......
  • 题解:P5184 [COCI2009-2010#2] PASIJANS
    分析考虑贪心,每次尽量选最小的字符。显然是每次选字典序最小的弹栈。我们要比较的是每个栈的字典序,但是朴素比较是\(O(L)\)的,考虑将它优化到\(O(1)\)。这个时候我们可以先离散化然后套路地将所有串拼一起跑SA。记得在每个串之间加分割符。这样每次比较字典序就变成了\(......
  • 题解:P6351 [PA2011] Hard Choice
    题意维护一张无向图,要求支持以下操作:切断一条边。查询两个点是否有有两条完全不同的路径相连。分析因为断边操作不好维护,考虑离线后将断边变为加边。因此,我们只需要维护加边操作即可。考虑使用LCT。首先,因为涉及到边权,套路地用节点代替边。如果某一条边连接的两个点......
  • ABC245G Foreign Friends 题解 / 二进制分组
    ABC245GForeignFriends题解回顾一下二进制分组。题目大意给定一张\(N\)个点\(M\)条边的无向图,及\(L\)个特殊点。每个点有颜色\(C_i\)。求每个点到离他最近的与他颜色不同特殊点的距离。Solve两个点颜色不同,等价于他们的颜色在二进制下至少有一位不同。所以我们考......
  • MySQL GROUP BY 分区大小写问题解析
    在数据库操作中,GROUPBY是一个常用的SQL语句,用于根据一个或多个列的值对结果集进行分组。然而,在使用MySQL时,你可能会遇到一个常见问题:大小写敏感性。本文将探讨MySQL中GROUPBY的大小写敏感性问题,并提供一些解决方案。什么是大小写敏感性?在计算机科学中,大小写敏感性是指......
  • Codeforces Round 974 (Div.3) 题解
    CodeforcesRound974(Div.3)题解A.RobinHelps模拟按照题意模拟即可。voidShowball(){intn,k;cin>>n>>k;intcur=0,ans=0;for(inti=0;i<n;i++){intx;cin>>x;if(x>=k)cur+=x;elseif(!x){if(cur>=1)cu......
  • AT_jsc2021_g Spanning Tree 题解
    感觉自己稍微有一点唐了。思路我们首先可以把一定要连的边连起来。这样就变成了一个无向图生成树计数问题。如何求解。使用矩阵树定理!我们可以求出基尔霍夫矩阵,然后跑一遍行列式就可以了。时间复杂度:\(O(n^3)\)。Code#include<bits/stdc++.h>usingnamespacestd;con......
  • Count Equation Solutions 题解
    前言题目链接:洛谷;UVA。题意简述求以下方程解的个数:\[a_1x_1-a_2x_2+a_3x_3-a_4x_4+a_5x_5-a_6x_6=0\]其中\(1\leqx_i\leqm\leq10^2\),\(x_i\in\mathbb{Z}\),多测。题目分析把\(a_2,a_4,a_6\)变成其相反数,变成\(\sum\limits_{i=1}^6a......
  • C++和OpenGL实现3D游戏编程【连载11】——光照效果进阶
    1、本节要实现的内容我们在前面的章节里内容简单的介绍了一下光照,随着后期对纹理内容的增加,我们需要了解更多的光照知识,本节我们回顾一下光照相关内容,并了解一下怎样实现纹理的光照效果。下面这个图就是我们借助于纹理文字产生的半透明光照效果。半透明纹理文字光照演......
  • 2024.9.23docker常用命令
    1.容器管理查看运行中的容器:dockerps查看所有容器(包括已停止的):dockerps-a启动容器:dockerstart<container_id或container_name>停止容器:dockerstop<container_id或container_name>重启容器:dockerrestart<container_id或container_name>删除......