社区讨论
求助
题目总版参与者 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 条回复,欢迎继续交流。
正在加载回复...