1. 程式人生 > 其它 >B. Stone Age Problem_思維

B. Stone Age Problem_思維

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