# codeforces 1199 D. Welfare State(思維+dp)
阿新 • • 發佈:2020-07-13
題目大意
codeforces 1199 D
給出n個數,q種操作:
1 p x
將第p個數變成x2 x
將n個數中小於x的數變成x
求最後的序列。\(1 <= n,q <= 10^5\)
解題思路
注意到對於每個數,只有在對該數的最後一次1 p x
操作之後的操作才對最後答案有貢獻,並且在最後一次1 p x
之後的2 x
操作只有x
最大對應的那個操作才有貢獻。
那麼問題轉化成對於每個數,維護對於該數的最後一次1 p x
操作和該操作之後的最大的2 p
操作。可以使用lastModify[maxn]
記錄對於每個數最後一次單次修改操作的時間,使用maxGroupModify[maxn]
記錄每一次1 p x
maxGroupModify[i]
為從i
開始的操作中最大的一次2 x
操作。最後答案max(a[i],maxGroupModify[lastModify[i]+1])
。
#include <iostream> using namespace std; const int maxn=2e5+5; int a[maxn],lastModify[maxn],maxGroupModify[maxn]; int n,q,p,x,op; int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; cin>>q; for(int i=1;i<=q;i++){ cin>>op>>p; if(op==1){ cin>>x; a[p]=x; lastModify[p]=i; } else{ maxGroupModify[i]=p; } } for(int i=q-1;i>0;i--) maxGroupModify[i]=max(maxGroupModify[i],maxGroupModify[i+1]); for(int i=1;i<=n;i++){ if(i-1)putchar(' '); printf("%d",max(a[i],maxGroupModify[lastModify[i]+1])); } return 0; }