洛谷 P3437 [POI2006]TET-Tetris 3D

二维线段树区间更新啊

树套树的外层树,如果是线段树的话一般似乎不能打标记?(毕竟标记不好下传)

然而起码对于这题是可以的...对于外层线段树,每个节点放两个值dat和setv,分别是得到的值和修改操作留下的标记。

然后外层线段树要标记永久化...标记永久化之后,标记的定义不一样了。

这道题里用dat[i]表示i节点表示的整段区间都达到的值,setv[i]表示i节点表示的区间的最大值

这样进行修改操作的时候,更新所有经过的节点的setv(因为只要经过该点,那么该点表示的区间和目标区间一定有相交部分),更新被目标区间完全包含的区间所在节点的dat(自然整段都达到那个值了)

进行查询操作的时候,"所有经过节点的dat"和"所有被目标区间完全包含的区间所在节点的setv"的最大值就是答案。

二维都一样,只不过外层线段树的查询是对于内层线段树的给定区间查询/修改

标记不下传

(一眼看起来似乎不是很对?有些信息被遗漏了?然而的确是对的23333)

(似乎修改和查询完全是对称的...)

错误记录:71行少了分号后的两个语句导致WA一片

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define lc (num<<1)
 5 #define rc (num<<1|1)
 6 #define mid ((l+r)>>1)
 7 using namespace std;
 8 int n,m;
 9 namespace XXX
10 {
11     int L,R,x;
12 struct Y
13 {
14     int dat[2100],setv[2100];
15     //dat表示整段区间都达到的值,setv表示区间最大值
16     void update(int l,int r,int num)
17     {
18         setv[num]=max(setv[num],x);
19         if(L<=l&&r<=R)
20         {
21             dat[num]=max(dat[num],x);
22             return;
23         }
24         if(L<=mid)    update(l,mid,lc);
25         if(mid<R)    update(mid+1,r,rc);
26     }
27     int query(int l,int r,int num)
28     {
29         if(L<=l&&r<=R)    return setv[num];
30         int ans=dat[num];
31         if(L<=mid)    ans=max(ans,query(l,mid,lc));
32         if(mid<R)    ans=max(ans,query(mid+1,r,rc));
33         return ans;
34     }
35 };
36 }
37 int L,R,x;
38 XXX::Y dat[2100],setv[2100];
39 void update(int l,int r,int num)
40 {
41     XXX::x=x;
42     setv[num].update(1,m,1);
43     if(L<=l&&r<=R)
44     {
45         XXX::x=x;
46         dat[num].update(1,m,1);
47         return;
48     }
49     if(L<=mid)    update(l,mid,lc);
50     if(mid<R)    update(mid+1,r,rc);
51 }
52 int query(int l,int r,int num)
53 {
54     if(L<=l&&r<=R)    return setv[num].query(1,m,1);
55     int ans=dat[num].query(1,m,1);
56     if(L<=mid)    ans=max(ans,query(l,mid,lc));
57     if(mid<R)    ans=max(ans,query(mid+1,r,rc));
58     return ans;
59 }
60 int main()
61 {
62     int Q,d,s,w,xx,yy;
63     scanf("%d%d%d",&n,&m,&Q);
64     while(Q--)
65     {
66         scanf("%d%d%d%d%d",&d,&s,&w,&xx,&yy);xx++;yy++;
67         L=xx;R=xx+d-1;XXX::L=yy;XXX::R=yy+s-1;
68         x=query(1,n,1)+w;//printf("%d\n",x);
69         update(1,n,1);
70     }
71     L=1;R=n;XXX::L=1;XXX::R=m;
72     printf("%d",query(1,n,1));
73     return 0;
74 }

原文地址:https://www.cnblogs.com/hehe54321/p/8591707.html

时间: 2024-11-17 15:57:50

洛谷 P3437 [POI2006]TET-Tetris 3D的相关文章

洛谷P3434 [POI2006]KRA-The Disks(线段树)

洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直观的思路(最差的程序效率) 题目相当于每次让我们找区间\([1,las-1]\)中上数第一个比当前盘子半径小的位置(las为上一次盘子掉到的位置)于是用线段树无脑搞一下,维护区间最小值,每次找这个位置,能往左跳就往左,不能的话再往右,当然如果超过了las-1就不用找了,直接放在las上面(相当于la

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 Task: Tetris 3D "Tetris" 游戏的作者决定做一个新的游戏, 一个三维的版本, 在里面很多立方体落在平面板,一个立方体开始落下直到碰上一个以前落下的立方体或者落地即停止. 作者想改变一下游戏的目的使得它更

洛谷P1157 组合的输出

洛谷1157 组合的输出 题目描述 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<=n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数.     现要求你不用递归的方法输出所有组合.     例如n=5,r=3,所有组合为:     l 2 3    l 2 4    1 2 5    l 3 4    l 3 5    1 4 5    2 3 4    2 3 5    2 4 5    3 4 5 输入输出格式 输入格式: 一行两个自

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

洛谷1231 教辅的组成

洛谷1231 教辅的组成 https://www.luogu.org/problem/show?pid=1231 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含一本书.一本练习册和一份答案,然而现在全都乱做了一团.许多书上面的字迹都已经模糊了,然而HansBug还是可

洛谷教主花园dp

洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的

洛谷 P2801 教主的魔法 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=2801 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不

洛谷P1466 集合 Subset Sums

洛谷P1466 集合 Subset Sums这题可以看成是背包问题 用空间为 1--n 的物品恰好填充总空间一半的空间 有几种方案 01 背包问题 1.注意因为两个交换一下算同一种方案,所以最终 要 f [ v ] / 2 2.要开 long long 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include <cstring> 5 #include <string&g

洛谷P1160 队列安排 链表

洛谷P1160 队列安排   链表 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdlib> 5 #include <string> 6 #include <algorithm> 7 #include <iomanip> 8 #include <iostream> 9 using namespace std