4364: [IOI2014]wall砖墙
Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 262 Solved: 124
[Submit][Status][Discuss]
Description
健佳正在用大小相同的砖块来砌起一面墙。这面墙由 列砖块所组成,它们从左到右的编号0至n-1。各列的高度可
以不同。各列的高度就是该列砖块的数量。健佳用如下方式来建造这面墙。最开始每列都没有砖块。此后,健佳通
过k个阶段的增加(adding)或移除(removing)砖块操作来砌墙。当所有k个阶段完成后,这面墙就砌好了。在每个阶
段中,健佳都会被告知一个连续的砖块列的范围,以及一个高度值h,然后他就完成如下过程:在增加砖块(adding
)阶段,对于给定的列范围中高度小于h的列,健佳会增加砖块使它们的高度都恰好等于h。此时他不会改变那些高
度大于或等于h的列。在移除砖块(removing)阶段,对于给定的列范围中高度大于 的列,健佳会移除砖块使它们的
高度都恰好等于h。此时他不会改变那些高度小于或等于h的列。你的任务就是计算出这面墙的最后形状。
Input
第1行:n, k。
第2+i 行(0≤i≤k-1):op[i], left[i], right[i], height[i]。
n: 这面墙中的列数。
k: 阶段数。
op: 大小为k的数组;op[i]是第i个阶段的类型:1 表示增加阶段(adding) 而 2表示移除阶段(removing)
其中0≤i≤k-1。
left 和 right: 大小为k的数组;在第i个阶段中,列的范围从第left[i] 列开始到第right[i]列结束(包括两端
left[i] 和 right[i]),其中0≤i≤k-1。这里保证满足left[i]≤right[i]。
height: 大小为k的数组;height[i] 表示在阶段i的高度参数,其中0≤i≤k-1。
Output
共n行
第i行包含一个整数表示finalHeight[i]。
finalHeight: 大小为n的数组;你需要把第i列砖块的最终数量存放到finalHeight[i]中做为返回结果
其中0≤i≤n-1。
Sample Input
输入样例1
10 3
1 3 4 91220
1 5 9 48623
2 3 5 39412
输入样例2
10 6
1 1 8 4
2 4 9 1
2 3 6 5
1 0 5 3
1 2 2 5
2 6 7 0
10 3
1 3 4 91220
1 5 9 48623
2 3 5 39412
输入样例2
10 6
1 1 8 4
2 4 9 1
2 3 6 5
1 0 5 3
1 2 2 5
2 6 7 0
Sample Output
输出样例1
0
0
0
39412
39412
39412
48623
48623
48623
48623
输出样例2
3
4
5
4
3
3
0
0
1
0
0
0
0
39412
39412
39412
48623
48623
48623
48623
输出样例2
3
4
5
4
3
3
0
0
1
0
HINT
对于100%的数据,1≤n≤2,000,000,1≤k≤500,000。
2016.6.17时限放至60s
Source
IOI的题Orz 线段树乱搞搞就行了,维护一个当前区间的最大值,维护一个当前区间的最小值即可
1 #include "bits/stdc++.h" 2 #define lson rt<<1,l,m 3 #define rson rt<<1|1,m+1,r 4 using namespace std; 5 typedef long long LL; 6 const int MAX=2e6+5; 7 int n,m; 8 int mn[MAX<<2],mx[MAX<<2]; 9 inline int read(){ 10 int an=0,x=1;char c=getchar(); 11 while (c<'0' || c>'9') {if (c=='-') x=-1;c=getchar();} 12 while (c>='0' && c<='9') {an=an*10+c-'0';c=getchar();} 13 return an*x; 14 } 15 void PushUp(int rt){ 16 mx[rt]=max(mx[rt<<1],mx[rt<<1|1]); 17 mn[rt]=min(mn[rt<<1],mn[rt<<1|1]); 18 } 19 void PushDown(int rt){ 20 if (mn[rt]>mx[rt<<1]) mx[rt<<1]=mn[rt<<1]=mn[rt]; 21 else if (mn[rt]>mn[rt<<1]) mn[rt<<1]=mn[rt]; 22 if (mn[rt]>mx[rt<<1|1]) mx[rt<<1|1]=mn[rt<<1|1]=mn[rt]; 23 else if (mn[rt]>mn[rt<<1|1]) mn[rt<<1|1]=mn[rt]; 24 25 if (mx[rt]<mn[rt<<1]) mx[rt<<1]=mn[rt<<1]=mx[rt]; 26 else if (mx[rt]<mx[rt<<1]) mx[rt<<1]=mx[rt]; 27 if (mx[rt]<mn[rt<<1|1]) mx[rt<<1|1]=mn[rt<<1|1]=mx[rt]; 28 else if (mx[rt]<mx[rt<<1|1]) mx[rt<<1|1]=mx[rt]; 29 } 30 void update1(int rt,int l,int r,int x,int y,int z){//调高 31 if (x<=l && r<=y){ 32 mx[rt]=max(mx[rt],z); 33 mn[rt]=max(mn[rt],z); 34 return; 35 } 36 int m=(l+r)>>1; 37 PushDown(rt); 38 if (x<=m) update1(lson,x,y,z); 39 if (y>m) update1(rson,x,y,z); 40 PushUp(rt); 41 } 42 void update2(int rt,int l,int r,int x,int y,int z){//调低 43 if (x<=l && r<=y){ 44 mx[rt]=min(mx[rt],z); 45 mn[rt]=min(mn[rt],z); 46 return; 47 } 48 int m=(l+r)>>1; 49 PushDown(rt); 50 if (x<=m) update2(lson,x,y,z); 51 if (y>m) update2(rson,x,y,z); 52 PushUp(rt); 53 } 54 int out(int rt,int l,int r){ 55 if (l==r) return printf("%d\n",mx[rt]),0; 56 int m=(l+r)>>1; 57 PushDown(rt); 58 out(lson); 59 out(rson); 60 } 61 int main(){ 62 freopen ("wall.in","r",stdin); 63 freopen ("wall.out","w",stdout); 64 int i,j,x,y,z,w; 65 n=read(),m=read(); 66 for (i=1;i<=m;i++){ 67 w=read(),x=read(),y=read(),z=read();++x,++y; 68 if (w==1) update1(1,1,n,x,y,z); 69 if (w==2) update2(1,1,n,x,y,z); 70 } 71 out(1,1,n); 72 return 0; 73 }
未来是什么样,未来会发生什么,谁也不知道。
但是我知道,
起码从今天开始努力,
肯定比从明天开始努力,
要快一天实现梦想。
千里之行,始于足下! ——《那年那兔那些事儿》