【POI 2006】 Tet-Tetris-3D
【题目链接】
【算法】
二维线段树(树套树)
注意标记永久化
【代码】
#include<bits/stdc++.h>
using namespace std;
#define MAXD 1000 int D,S,N,d,s,w,x,y,tmp; struct SegmentTree {
struct Node {
int l,r,Max,tag;
} Tree[MAXD*+];
inline void build(int index,int l,int r) {
int mid;
Tree[index].l = l;
Tree[index].r = r;
Tree[index].Max = Tree[index].tag = ;
mid = (l + r) >> ;
if (l == r) return;
build(index<<,l,mid);
build(index<<|,mid+,r);
}
inline void pushdown(int index) {
Tree[index<<].Max = max(Tree[index<<].Max,Tree[index].tag);
Tree[index<<|].Max = max(Tree[index<<|].Max,Tree[index].tag);
Tree[index<<].tag = max(Tree[index<<].tag,Tree[index].tag);
Tree[index<<|].tag = max(Tree[index<<|].tag,Tree[index].tag);
Tree[index].tag = ;
}
inline void pushup(int index) {
Tree[index].Max = max(Tree[index<<].Max,Tree[index<<|].Max);
}
inline void modify(int index,int l,int r,int val) {
int mid;
if (Tree[index].l == l && Tree[index].r == r) {
Tree[index].Max = max(Tree[index].Max,val);
Tree[index].tag = max(Tree[index].tag,val);
return;
}
pushdown(index);
mid = (Tree[index].l + Tree[index].r) >> ;
if (mid >= r) modify(index<<,l,r,val);
else if (mid + <= l) modify(index<<|,l,r,val);
else {
modify(index<<,l,mid,val);
modify(index<<|,mid+,r,val);
}
pushup(index);
}
inline int query(int index,int l,int r) {
int mid;
if (Tree[index].l == l && Tree[index].r == r) return Tree[index].Max;
pushdown(index);
mid = (Tree[index].l + Tree[index].r) >> ;
if (mid >= r) return query(index<<,l,r);
else if (mid + <= l) return query(index<<|,l,r);
else return max(query(index<<,l,mid),query(index<<|,mid+,r));
}
}; struct SegmentTree2D {
struct Node {
int l,r;
SegmentTree Max,tag;
} Tree[MAXD*+];
inline void build(int index,int l,int r) {
int mid;
Tree[index].l = l;
Tree[index].r = r;
Tree[index].Max.build(,,S);
Tree[index].tag.build(,,S);
mid = (l + r) >> ;
if (l == r) return;
build(index<<,l,mid);
build(index<<|,mid+,r);
}
inline void modify(int index,int l1,int r1,int l2,int r2,int val) {
int mid;
Tree[index].Max.modify(,l2,r2,val);
if (Tree[index].l == l1 && Tree[index].r == r1) {
Tree[index].tag.modify(,l2,r2,val);
return;
}
mid = (Tree[index].l + Tree[index].r) >> ;
if (mid >= r1) modify(index<<,l1,r1,l2,r2,val);
else if (mid + <= l1) modify(index<<|,l1,r1,l2,r2,val);
else {
modify(index<<,l1,mid,l2,r2,val);
modify(index<<|,mid+,r1,l2,r2,val);
}
}
inline int query(int index,int l1,int r1,int l2,int r2) {
int mid,ret = ;
ret = Tree[index].tag.query(,l2,r2);
if (Tree[index].l == l1 && Tree[index].r == r1) return max(ret,Tree[index].Max.query(,l2,r2));
mid = (Tree[index].l + Tree[index].r) >> ;
if (mid >= r1) return max(ret,query(index<<,l1,r1,l2,r2));
else if (mid + <= l1) return max(ret,query(index<<|,l1,r1,l2,r2));
else return max(ret,max(query(index<<,l1,mid,l2,r2),query(index<<|,mid+,r1,l2,r2)));
}
} T; template <typename T> inline void read(T &x) {
int f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
template <typename T> inline void write(T x) {
if (x < ) { putchar('-'); x = -x; }
if (x > ) write(x/);
putchar(x%+'');
}
template <typename T> inline void writeln(T x) {
write(x);
puts("");
} int main() { read(D); read(S); read(N);
T.build(,,D);
while (N--) {
read(d); read(s); read(w); read(x); read(y);
tmp = T.query(,x+,x+d,y+,y+s);
T.modify(,x+,x+d,y+,y+s,tmp+w);
} writeln(T.query(,,D,,S)); return ;
}
【POI 2006】 Tet-Tetris-3D的更多相关文章
- 【HAOI 2006】 受欢迎的牛
[题目链接] 点击打开链接 [算法] 先用tarjan缩点,然后找出度为零的点,即可 [代码] #include<bits/stdc++.h> using namespace std; # ...
- 【ZJOI 2006】 物流运输
[题目链接] 点击打开链接 [算法] 令cost(i,j) = 第i天到第j天走相同的路线,路线长度的最小值 那么,只需筛选出第i天到第j天可以装卸货物的码头,然后将这些码头之间连边,跑弗洛伊德(或其 ...
- 【POI 2010】 Pilots
[题目链接] 点击打开链接 [算法] 单调队列 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 3000010 ...
- 【POI 2010】 Antisymmetry
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2084 [算法] manacher [代码] #include<bits/std ...
- 【POI 2007】 山峰和山谷
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1102 [算法] 广度优先搜索 [代码] #include<bits/stdc+ ...
- 【POI word】使用POI实现对Word的读取以及生成
项目结构如下: 那第一部分:先是读取Word文档 package com.it.WordTest; import java.io.FileInputStream; import java.io.Fil ...
- 【POI xlsx】使用POI对xlsx的单元格样式进行设置 / 使用POI对xlsx的字体进行设置
涉及到的样式都在代码中有说明: package com.it.poiTest; import java.io.FileNotFoundException; import java.io.FileOut ...
- 【BZOJ 2006】2006: [NOI2010]超级钢琴(RMQ+优先队列)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2792 Solved: 1388 Description 小 ...
- 【POI xls】解析xls遇到的问题
问题1:Package should contain a content type part org.apache.poi.POIXMLException: org.apache.poi.openxm ...
随机推荐
- (4)Swing布局
一.FlowLayout-流布局 新增第一个组件后默认在第一行的居中位置,之后 组件按照加入的先后顺序按照设置的对齐方式从左向右排列 二.borderLayout-边框布局 容器划分为东.西.南.北. ...
- Codeforces Gym 100418K Cards 组合数学
CardsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action? ...
- luogu P1476 休息中的小呆
题目描述 当大家在考场中接受考验(折磨?)的时候,小呆正在悠闲(欠扁)地玩一个叫“最初梦想”的游戏.游戏描述的是一个叫pass的有志少年在不同的时空穿越对抗传说中的大魔王chinesesonic的故事 ...
- kafka基础介绍
kafka基础介绍 一.kafka介绍 1.1主要功能 根据官网的介绍,kafka是一个分布式流媒体的平台,它主要有三大功能: 1.11:It lets you publish and subscri ...
- 解决树莓派8G的SD卡只能识别3.3G,SD卡扩容
8GB microSD在Windows下使用Win32 Disk Imager下载映像后,在RPi中只能识别出3.3GB.而本身还有很多容量没有释放出来. 使用sudo raspi-config工具可 ...
- 【kotlin】报错 Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type List<String>?
报错如下: 解决如下: 另一种情况: 解决如下:
- 创建es索引-格式化和非格式化
创建es索引-格式化和非格式化 学习了:https://www.imooc.com/video/15768 索引有结构化和非结构化的区分: 1, 先创建索引,然后POST修改mapping 首先创建索 ...
- iOS 获取appstore 版本
项目上线以后一般都涉及到升级.那么iOS 怎样从appstore获取到版本 事实上非常easy NSString *url = [[NSString alloc] initWithFormat:@&q ...
- FlashBuilder找不到所需要的AdobeFlashPlayer调试器版本的解决方案
这个问题就是因为你所装的FlashPlayer不是调试器版本.如果你的FlashPlayer是调试版,那么你随便打开一个有Flash的页面,然后右键点击Flash,就会有一个调试器,菜单,当然它现在是 ...
- 基于SpringMVC框架使用ECharts3.0实现堆叠条形图的绘制(下篇)
<script type="text/javascript"> $().ready(function() { var myChart = echarts.init(do ...