算法题解:cf1704d ——前缀和、思维
cf1704D Magical Array
题意
懒得截了随手从网上找一个(

简单地说,就是有很多个一样的数列,其中一个是特殊的。现在对每个都选若干个数对(i,j),如果是特殊的就有
a[i]-1,a[j]-1,a[i-1]+1,a[j+2]+1,如果不是特殊的则会 a[i]-1,a[j]-1,a[i-1]+1,a[j+1]+1。现在给你操作完的这些数列,要求找到特殊的数列是哪一个,以及它执行了多少次操作
思路
注意到特殊的和不特殊的在操作上就是右端的+1位置不同,因此很容易(??)发现:
1.数列的元素和不变
2.端点处的+1,-1容易联想到差分或者前缀和
3.对于不特殊的数列,每次操作后缀和的和是不变的,即\(\sum \limits_{i=1}^na_i*i\)不变,而特殊的数列的后缀和之和则显然会变大1
4.因此只需找到最大的后缀和的和对应的数列编号,并且计算其与非特殊数列的该值之差即可
代码
signed main(){
ios::sync_with_stdio(false),cin.tie(NULL);
//freopen("data.in","r",stdin);
//freopen("T1.out","w",stdout);
cin>>t;
while(t--){
cin>>n>>m;
int minn=0x3f3f3f3f,maxx=0;
int idd=1;
for(int i=1;i<=n;i++)
{
int summ=0;
for(int j=1;j<=m;j++)
{
int x;
cin>>x;
summ+=x*j;
}
if(i==1){
maxx=minn=summ;
}
else
{
minn=min(summ,minn);
maxx=max(summ,maxx);
}
if(summ>minn){
idd=i;
}
}
cout<<idd<<" "<<maxx-minn<<endl;
}
return 0;
}

浙公网安备 33010602011771号