其他分享
首页 > 其他分享> > 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 

标签:Stone,cnt,idx,Age,cin,ans,lvl,Problem,se
来源: https://www.cnblogs.com/tyriis/p/16279809.html