Codeforces Round #576 (Div. 2) D. Welfare State

http://codeforces.com/contest/1199/problem/D

Examples

input1

4
1 2 3 4
3
2 3
1 2 2
2 1

output1

3 2 3 4 

input2

5
3 50 2 1 10
3
1 2 0
2 8
1 3 20

output2

8 8 20 8 10 

Note

In the first example the balances change as follows: 1 2 3 4 → 3 3 3 4 → 3 2 3 4 → 3 2 3 4

In the second example the balances change as follows: 3 50 2 1 10 → 3 0 2 1 10 → 8 8 8 8 10 → 8 8 20 8 10

这题很简单 ,可以用线段树做,蒟蒻的我表示不会,只好再另找方法

有两种操作:

操作1(单点修改操作):将x位置处的值变为y

操作2(更新修改操作):输入一个z值,将数组中所有小于z的都改为z

如果没进行单点修改操作,后面更新修改操作的大值会覆盖掉前面更新修改操作的小值

如果该数进行过单点修改操作,那么在该操作之前的操作对该数均无效,只有后面的更新修改操作会生效

如果有10个操作数

c数组形式可能为

c1 c2 c3 c4 c5 c6 c7 c8 c9 c10

9  9  9  7  7  3   2  2  0  0 

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <string>
 5 #include <math.h>
 6 #include <algorithm>
 7 #include <queue>
 8 #include <set>
 9 #include <math.h>
10 const int INF=0x3f3f3f3f;
11 using namespace std;
12 #define maxn 200010
13 
14 int a[maxn];//存放数据
15 int b[maxn];//存放单点修改操作的最后一次操作标号 
16 int c[maxn];//存放更新修改操作,存要修改的值,下标为操作标号 
17 
18 int main()
19 {
20     int n;
21     scanf("%d",&n);
22     for(int i=1;i<=n;i++)
23     {
24         scanf("%d",&a[i]);
25     }
26     int q;
27     scanf("%d",&q);
28     for(int i=1;i<=q;i++)
29     {
30         int t;
31         scanf("%d",&t);
32         if(t==1) //单点修改操作 
33         {
34             int x,y;
35             scanf("%d %d",&x,&y);
36             a[x]=y;//直接改值
37             b[x]=i;//记录该位置最后一次单点操作标号
38         }
39         else if(t==2)//更新修改操作 
40         {
41             scanf("%d",&c[i]);//记录该操作标号下的更新处理的值 
42         }
43     }
44     for(int i=q-1;i>=1;i--)//后面大值会覆盖之前的小值,c[1]为最大值 
45     {
46         c[i]=max(c[i],c[i+1]);
47     }
48     for(int i=1;i<=n;i++)
49     {
50         printf("%d ",max(a[i],c[b[i]+1]));
51     }
52     return 0;
53 }

猜你喜欢

转载自www.cnblogs.com/jiamian/p/11275464.html