【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 ...
随机推荐
- Linux 系统的常用命令之 rm ,rm -rf , rm -f 以及rm 命令的其他参数命令
1.rm -rf * 删除当前目录下的所有文件,这个命令很危险,应避免使用. 所删除的文件,一般都不能恢复! 2.rm -f 其中的,f参数 (f --force ) 忽略不存在的文件,不显示任何信息 ...
- CODEVS_2144 砝码称重 2 折半搜索+二分查找+哈希
#include<iostream> #include<algorithm> #include<cstring> #include<map> #incl ...
- usaco feb04距离咨询
[USACO FEB04]距离咨询 成绩 开启时间 2014年09月19日 星期五 10:08 折扣 0.8 折扣时间 2014年09月26日 星期五 10:08 允许迟交 是 关闭时间 2014 ...
- oracle内核学习总结
http://blog.csdn.net/bcbobo21cn/article/category/3092145/1
- [转]JVM堆和栈的区别
物理地址 堆的物理地址分配对对象是不连续的.因此性能慢些.在GC的时候也要考虑到不连续的分配,所以有各种算法.比如,标记-消除,复制,标记-压缩,分代(即新生代使用复制算法,老年代使用标记——压缩) ...
- JVM 调优 —— 新生代 Survivor 空间不足
零. 新生代调优规律 增大新生代空间. Minor GC 频率降低, Minor GC 时间上升. 降低新生代空间, Minor GC 频率上升, Minor GC 时间下降 一. 新生代典型问题 先 ...
- Android开发系列(二十一):Spinner的功能和使用方法以及实现列表选择框
Spinner是一个列表选择框.相当于弹出一个菜单供用户进行选择. Spinner继承AdapterView Spinnet支持的XML的属性: android:entries:使用数组资源设置该下拉 ...
- 在java中String类为什么要设计成final?
大神链接:在java中String类为什么要设计成final? - 程序员 - 知乎 我进行了重新排版,并且更换了其中的一个例子,让我们更好理解. String很多实用的特性,比如说“不可变性”,是工 ...
- HTML5开发移动web应用—JQuery Mobile(2)-导航栏和页脚
导航栏部分的代码一般放置在data-role为header的div的内. <div data-role="header"> <a href="#&quo ...
- win10 UWP 申请微软开发人员
申请微软开发人员能够到https://dev.windows.com/zh-cn/programs/join 假设是学生,先去http://www.dreamspark.com/ 假设是英文,点stu ...