bzoj1513【POI2006】Tet-Tetris 3D
1513: [POI2006]Tet-Tetris 3D
Time Limit: 30 Sec Memory Limit: 162 MB
Submit: 733 Solved: 245
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
4 3 2 0 0
3 3 1 3 0
7 1 2 0 3
2 3 3 2 2
Sample Output
HINT
Source
题目大意:给定一个二维矩阵。每次询问一个矩形范围内最大值max。并把矩形内全部数更新为max+p。
看到这道题非常easy想到二维线段树,可是存在两个问题:二维线段树的标记下传和信息上传不easy实现。
那怎么解决呢?答案是用标记永久化。
我们用v和tag表示由子节点求出的最大值和全然覆盖该区间的最大值。每次改动时把路径上全部的v和底端的tag都改动,每次询问将路径上的全部tag和底端的v取最大值。
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define ll long long
#define inf 1000000000
using namespace std;
ll read()
{ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int D,S,N;
int ql,qr,qd,qu;
struct segx
{int v[3005],tag[3005];void change(int k,int l,int r,int x,int y,int val){v[k]=max(v[k],val);if(l==x&&y==r){tag[k]=max(tag[k],val);return;}int mid=(l+r)>>1;if(x<=mid)change(k<<1,l,mid,x,min(mid,y),val);if(y>mid)change(k<<1|1,mid+1,r,max(x,mid+1),y,val);}int query(int k,int l,int r,int x,int y){if(l==x&&y==r)return v[k];int mid=(l+r)>>1,ans=tag[k];if(x<=mid)ans=max(ans,query(k<<1,l,mid,x,min(mid,y)));if(y>mid)ans=max(ans,query(k<<1|1,mid+1,r,max(x,mid+1),y));return ans;}
};
struct segy
{segx v[3005],tag[3005];void change(int k,int l,int r,int x,int y,int val){v[k].change(1,1,S,qd,qu,val);if(l==x&&y==r){tag[k].change(1,1,S,qd,qu,val);return;}int mid=(l+r)>>1;if(x<=mid)change(k<<1,l,mid,x,min(mid,y),val);if(y>mid)change(k<<1|1,mid+1,r,max(x,mid+1),y,val);}int query(int k,int l,int r,int x,int y){if(l==x&&r==y)return v[k].query(1,1,S,qd,qu);int mid=(l+r)>>1,ans=tag[k].query(1,1,S,qd,qu);if(x<=mid)ans=max(ans,query(k<<1,l,mid,x,min(mid,y)));if(y>mid)ans=max(ans,query(k<<1|1,mid+1,r,max(x,mid+1),y));return ans;}
}T;
int main()
{D=read();S=read();N=read();int d,s,w,x,y;for(int i=1;i<=N;i++){d=read();s=read();w=read();x=read();y=read();ql=x+1;qr=x+d;qd=y+1;qu=y+s;int ans=T.query(1,1,D,ql,qr);T.change(1,1,D,ql,qr,ans+w);}qd=1;qu=S;printf("%d\n",T.query(1,1,D,1,D));return 0;
}
转载于:https://www.cnblogs.com/zsychanpin/p/6984294.html
bzoj1513【POI2006】Tet-Tetris 3D相关推荐
- 【备注】【C24】《Android 3D游戏开发技术详解与典型案例》PDF 下载
[C24]<Android 3D游戏开发技术详解与典型案例>PDF 下载 目前市面上的Android技术书籍还比较少,Android3D游戏开发的书籍更是没有.因此,在现在市面上,Andr ...
- 【转】PCB中3D相关功能详解
如果PCB Layout工程师能够在设计过程中,使用设计工具直观地看到自己设计板子的实际情况,将能够有效的帮助他们的工作.尤其现在PCB板的设计越来越复杂,密度越来越高,如果能够洞察多层板内部则可以帮 ...
- 【Unity】5.1 3D坐标系基础知识
分类:Unity.C#.VS2015 创建日期:2016-04-20 一.简介 在虚拟的游戏世界中,与3D有关的数学知识决定了游戏引擎如何计算和模拟出开发者以及玩家看到的每一帧画面.学习或者回想一下基 ...
- 【常用】2DUI跟随3D物体移动(待修复)
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; ...
- 【Unity】UI或3D场景自动设置渐变色背景
给定一组色值(或者多组色值,每次随机取一组),初始化时创建图片并赋值给UI的Image或3D场景的Sprite.从下/左往上/右,按曲线渐变 using System.Collections; ...
- 【ADNI】对 nii 3D 数据进行裁剪(Matlab)待完善...
crop_ADNI_GM.m function num_list = crop_ADNI_GM(filelistname, save_path, label) %%%% %% 脚本说明 % 1)对AD ...
- 【babylonjs】环形屏幕3d展示
0.前言: 前阵子接到一个需求是需要开发一个能够跑在环形屏幕上的3d展示项目 刚接到这个项目的时候我以为能吧相机fov直接调整成360°,后来发现我想多了..babylonjs中的相机最大视角就是π( ...
- 【集思广益】关于手机3D APP
小伙伴们 集思广益一下 除了3D手游以外还有那些手机APP会运用到3D技术??多多益善 答得多的有奖
- 【ECCV2022】如何解决3D检测中长尾问题?
作者|汽车人 编辑|3D视觉开发者社区 题目:Improving the Intra-class Long-tail in 3D Detection via Rare Example Mining 作 ...
最新文章
- criscriter英语测试软件,English test (英语测验)
- 【转】MYSQL入门学习之七:MYSQL常用函数
- 美女被偷之后.....
- mdb 查询过于复杂_【律联云知产课堂】南京商标查询主要从哪些方面判断一个商标是否适合注册?...
- shift用计算机,电脑Shift键的妙用,你都了解吗?
- win10安装ubuntu系统出现的一些问题以及解决方案
- linux rpm安装mysql5.7.*密码策略,访问策略等常见问题
- mysql pt kill脚本_mysql 案例 ~ pt-kill工具的使用
- linux 下的按键精灵 xdotool
- 如何在VScode中配置python第三方库
- html作业word,Word实验作业——个人简历.doc
- uniapp,小程序返回到指定页面以及到指定页面左上角的房型默认返回首页
- 我用Python+PySide6做了个图形化番茄钟,这下可以提醒自己放松一下了。
- 趣味密码学入门--cryptohack
- Eclipse自动排版设置
- 声光控延时开关设计原理
- Android gif 动画
- dnf跨5无限连接服务器,DNF:跨5跨6被特殊“服务”,请问:会不会有补偿,制裁怎么解决...
- 这样设置,让你的 iPhone 用起来更加得心应手
- google api 得到 天气