社区讨论

求助

题目总版参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo14tgt4
此快照首次捕获于
2023/10/22 15:13
2 年前
此快照最后确认于
2023/11/02 14:45
2 年前
查看原帖
CPP
/*
题目:
给定一个序列a ,你需要维护对于该序列的q次操作:
1 x y,令ax=y
2 y ,将数组数字改成y 
每次操作完成后,输出当前数组中所有元素的总和。
 输入格式
第一行两个整数n,q 。
第二行n个整数,表示a中的元素 。
接下来有q行,首先输入一个整数t。
若t=1,接着输入两个整数x,y
若t=2,接着输入一个整数y
输出格式
共q行,每行一个整数, 表示当前数组a中所有元素的和。
输入 
5 5
1 2 3 4 5
1 1 5
2 10
1 5 11
1 4 1
2 1
输出
19
50
51
42
5

*/
#include <bits/stdc++.h>
using namespace std;
long long n,q;
long long a[200010];
long long t;
long long x,y;
long long ans=0;
bool h=0;
long long cnt=0;
bool vis[200010];
int main(){
//	freopen("ds.in","r",stdin); // 从文件 ds.in 中读入
//	freopen("ds.out","w",stdout); // 输出到文件 ds.out
	cin>>n>>q;
	for(long long i=0;i<n;i++){
	cin>>a[i];
	ans+=a[i]; //总值 
	}
	while(q--){
		cin>>t;//输入t 
		if(t==1){//t为1 
			cin>>x>>y;
			if(h==0){//以前没有2出现 
			ans+=(y-a[x-1]);//元素相加 
			a[x-1]=y;//变成y 
			}		
		else{//以前有2 
			if(vis[x-1]==0){//如果变2后没有1变过这个数 
				ans+=(y-cnt);//cnt为上一个2变的数 
				a[x-1]=y;//这个数变成y 
				vis[x-1]=1;//标记已被1变过 
			}
			else{//被1变过 
				ans+=(y-a[x-1]);//元素相加 
				a[x-1]=y;//这个数变为y 
			}
			
		}
		cout<<ans<<endl;
		}
/////////////////////////////////////////
		else if(t==2){//t为2 
			cin>>y;//输入y 
			memset(vis,sizeof(vis),0);//把vis初始化 
			cnt=y;//cnt变为y 
			ans=y*n;//元素相加 
			h=1;//h变成1证明进入下一次循环 
			cout<<ans<<endl;
		}
}

//fclose(stdin);
//fclose(stdout);
return 0;
}
全wa求助

回复

2 条回复,欢迎继续交流。

正在加载回复...