算法题解: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.对于不特殊的数列,每次操作后缀和的和是不变的,即
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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下