算法题真是几天不写就不行啊……
题面描述 掉落的方块
1000个正方形箱子,位置和边长范围 $10^8$ ,将它们依次像俄罗斯方块一样落下,问每次落下后,屏幕最高的高度是多少。
考虑到要求的答案是整个区间查询,而更新也是区间更新,所以这显然是一个线段树的问题。
每落下一个箱子,就直接将区间值全部更新为箱子所在区间的最大值+箱子高度。
由于箱子很少而距离很远,需要先离散化一下再做。
一个坑点是坐标是1,半径是1的箱子和坐标是2,半径是1的箱子是不会叠起来的。
一个trick是直接将每次查的左端点+1,即[1,1]update的是[2,2]。
一个月没写算法题,很多东西都写不好了。写代码就像背英语,还是要一直坚持的。
1 |  | 
2 | using namespace std; | 
3 |  | 
4 |  | 
5 |  | 
6 |  | 
7 | |
8 | class Solution { | 
9 | public: | 
10 |     int value[5040]; | 
11 |     int lazy[5040]; | 
12 | |
13 |     void build(){ | 
14 |         memset(value,0,sizeof(value)); | 
15 |         memset(lazy,-1,sizeof(lazy)); | 
16 |     } | 
17 | |
18 |     void push_up(int rt){ | 
19 |         value[rt]=max(value[lson],value[rson]); | 
20 |     } | 
21 | |
22 |     void push_down(int rt){ | 
23 |         if (lazy[rt]!=-1){ | 
24 |             lazy[lson]=lazy[rt]; | 
25 |             lazy[rson]=lazy[rt]; | 
26 |             value[lson]=lazy[rt]; | 
27 |             value[rson]=lazy[rt]; | 
28 |             lazy[rt]=-1; | 
29 |         } | 
30 |     } | 
31 | |
32 |     void update(int l,int r,int x,int L,int R,int rt){ | 
33 |         if (l<=L&&r>=R){ | 
34 |             value[rt]=x; | 
35 |             lazy[rt]=x; | 
36 |             return; | 
37 |         } | 
38 |         push_down(rt); | 
39 |         int mid=(L+R)>>1; | 
40 |         if (l<=mid) | 
41 |             update(l,r,x,Lson); | 
42 |         if (r>mid) | 
43 |             update(l,r,x,Rson); | 
44 |         push_up(rt); | 
45 |     } | 
46 | |
47 |     int query(int l,int r,int L,int R,int rt){ | 
48 |         if (l<=L&&r>=R){ | 
49 |             return value[rt]; | 
50 |         } | 
51 |         push_down(rt); | 
52 |         int mid=(L+R)>>1; | 
53 |         int ans=0; | 
54 |         if (l<=mid) | 
55 |             ans=max(ans,query(l,r,Lson)); | 
56 |         if (r>mid) | 
57 |             ans=max(ans,query(l,r,Rson)); | 
58 |         return ans; | 
59 |     } | 
60 | |
61 |     vector<int> fallingSquares(vector<vector<int>>& positions) { | 
62 |         vector<int> ans; | 
63 |         int rk[2010],n=positions.size(),l,r,x; | 
64 |         for (int i=0;i<n;++i){ | 
65 |             rk[2*i]=positions[i][0]+1; | 
66 |             rk[2*i+1]=positions[i][0]+positions[i][1]; | 
67 |         } | 
68 |         sort(rk,rk+2*n); | 
69 |         build(); | 
70 |         for (int i=0;i<n;++i){ | 
71 |             l=lower_bound(rk,rk+2*n,positions[i][0]+1)-rk+1; | 
72 |             r=lower_bound(rk,rk+2*n,positions[i][0]+positions[i][1])-rk+1; | 
73 |             x=query(l,r,1,2*n,1); | 
74 | //            cout<<i<<":"<<endl; | 
75 | //            cout<<"["<<positions[i][0]+1<<" "<<positions[i][0]+positions[i][1]<<"] "<<x<<endl; | 
76 |             update(l,r,x+positions[i][1],1,2*n,1); | 
77 |             ans.push_back(query(1,2*n,1,2*n,1)); | 
78 |         } | 
79 |         return ans; | 
80 |     } | 
81 | }; |