Even-Odd Increments
Even-Odd Increments
题目大意:给定一个长度为 的数列,有 次操作,每次对数列中的奇偶数进行操作,问每次执行完操作后数列的总和。
如果一一遍历去修改的话,时间是 会超时。
但是,他只对数列中的奇数或偶数进行加和,我们只要统计出奇数和偶数的个数,加和就是他们的个数乘上这个加上的数就是现阶段的贡献。
但是,把一个数加上某个数,这个数的奇偶性就会发生变化。
如果当前的数是偶数,加上的数是奇数的话,这个数就变成奇数,那么所有的偶数变成奇数,奇数的个数就是 ,偶数就是 。
奇数的如上所示,是一样的。
最后记得要统计初始的贡献。
#include<bits/stdc++.h>
using namespace std;
const int N =1e6+10;
#define int long long
signed main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
int t;
cin>>t;
while(t--)
{
int n,q,sum=0,ans=0,ans1=0;
cin>>n>>q;
for(int i=1,x;i<=n;i++)
{
cin>>x,sum+=x;
if(x%2==0)
ans++;
else
ans1++;
}
while(q--)
{
int opt,s;
cin>>opt>>s;
if(opt==0)
{
sum+=ans*s,cout<<sum<<endl;
if(s%2!=0)
ans1=n,ans=0;
}
else
{
sum+=ans1*s,cout<<sum<<endl;
if(s%2!=0)
ans1=0,ans=n;
}
}
}
return 0;
}