【题目链接】

点击打开链接

【算法】

二维线段树(树套树)

注意标记永久化

【代码】

#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的更多相关文章

  1. 【HAOI 2006】 受欢迎的牛

    [题目链接] 点击打开链接 [算法] 先用tarjan缩点,然后找出度为零的点,即可 [代码] #include<bits/stdc++.h> using namespace std; # ...

  2. 【ZJOI 2006】 物流运输

    [题目链接] 点击打开链接 [算法] 令cost(i,j) = 第i天到第j天走相同的路线,路线长度的最小值 那么,只需筛选出第i天到第j天可以装卸货物的码头,然后将这些码头之间连边,跑弗洛伊德(或其 ...

  3. 【POI 2010】 Pilots

    [题目链接] 点击打开链接 [算法] 单调队列 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 3000010 ...

  4. 【POI 2010】 Antisymmetry

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2084 [算法] manacher [代码] #include<bits/std ...

  5. 【POI 2007】 山峰和山谷

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1102 [算法] 广度优先搜索 [代码] #include<bits/stdc+ ...

  6. 【POI word】使用POI实现对Word的读取以及生成

    项目结构如下: 那第一部分:先是读取Word文档 package com.it.WordTest; import java.io.FileInputStream; import java.io.Fil ...

  7. 【POI xlsx】使用POI对xlsx的单元格样式进行设置 / 使用POI对xlsx的字体进行设置

    涉及到的样式都在代码中有说明: package com.it.poiTest; import java.io.FileNotFoundException; import java.io.FileOut ...

  8. 【BZOJ 2006】2006: [NOI2010]超级钢琴(RMQ+优先队列)

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2792  Solved: 1388 Description 小 ...

  9. 【POI xls】解析xls遇到的问题

    问题1:Package should contain a content type part org.apache.poi.POIXMLException: org.apache.poi.openxm ...

随机推荐

  1. Google解决跨域

    1.添加   --disable-web-security --user-data-dir=D:\tmp 2.在D的根目录新建tmp文件夹

  2. webStorm汉化

    http://www.sdbeta.com/xiazai/2015/0603/35070.html 注册时选择“License server”输入“http://idea.imsxm.com/”点击“ ...

  3. luogu P1476 休息中的小呆

    题目描述 当大家在考场中接受考验(折磨?)的时候,小呆正在悠闲(欠扁)地玩一个叫“最初梦想”的游戏.游戏描述的是一个叫pass的有志少年在不同的时空穿越对抗传说中的大魔王chinesesonic的故事 ...

  4. UNIDAC不能识别CLIENTDATASET的TSINGLEFIELD

    UNIDAC不能识别CLIENTDATASET的TSINGLEFIELD FIREDAC,UNIDAC这些通用的数据引擎,对某种数据库的支持,细节方面总有BUG. UNIDAC6.2.8发现不能识别C ...

  5. android开发教程之使用线程实现视图平滑滚动示例 改

    package com.melonsapp.messenger.ui.popupuser; import android.os.Handler; import android.view.View; i ...

  6. Python机器学习--聚类

    K-means聚类算法 测试: # -*- coding: utf-8 -*- """ Created on Thu Aug 31 10:59:20 2017 @auth ...

  7. SolidEdge 如何绘制剖视图

    如果要创建剖视图,则点击切割平面按钮,然后绘制剖面线,画好之后点击完成   然后点击剖视图按钮,鼠标单击刚才的剖面线,往要的方向拖动,即可生成剖面视图   剖视图有时也需要用到旋转剖视图 如下图所示, ...

  8. Eclipse打包Android项目时用到proguard.cfg后,出现的Warning:can&#39;t find referenced class问题的解决方式

    Warning: can't find superclass or interface Warning: can't find referenced class 这两个问题的解决方法: 1.要把你项目 ...

  9. 终端中的乐趣:6个有趣的Linux命令行工具

    文章链接: http://hpw123.net/a/Linux/ruanjiananzhuang/2014/1103/117.html​ 很多其它文章尽在 http://www.hpw123.net ...

  10. HashMap源代码学习笔记

        HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快的查询速度主要是由于它是通过计算散列码来决定存储的位置. HashMap中主要是通过key的hashCode来计算hash值的 ...