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