B. Stone Age Problem_思維
阿新 • • 發佈:2022-05-17
B. Stone Age Problem_思維
題目大意:
給定一個序列a和q次詢問。第一種詢問要將ai換成x,第二次詢問將整個序列換成x。每次詢問要給出整個序列的和。
思路和程式碼:
乍一看是一個區間查詢問題,用線段樹可能會T,我毛姑姑這個懶標記應該會很慢。
仔細想一下可以發現不論單點修改了幾次,只要有一次區間修改所有數字都回歸相同。所以維護一個lvl表示整個數列的基礎值,再維護一個pair陣列d,second表示該值和lvl偏差了多少,first表示該偏差對應的是第幾次基礎值。
void solve(){ ll ans = 0 ; int n , m ; cin >> n >> m ; vct<pll> d(n + 1 , {0 , 0}) ; rep(i , 1 , n) cin >> d[i].se ; rep(i , 1 , n) ans += d[i].se ; int cnt = 0 , lvl = 0 ; while(m -- ){ int op , idx , x ; cin >> op ; if(op == 1){ cin >> idx >> x ; if(cnt == d[idx].fi){ ans -= d[idx].se - lvl ; d[idx].se = x ; ans += d[idx].se - lvl ; }else{ d[idx].fi = cnt ; d[idx].se = x ; ans += d[idx].se - lvl ; } }else{ cin >> x ; lvl = x ; cnt ++ ; ans = 1LL * n * x ; } cout << ans << "\n" ; } }//code_by_tyrii