题解:P15729 [JAG 2024 Summer Camp #2] Add Add Add
CJY_Holmes · · 题解
超详细题解,求赞!
有点思维含量,让我瑟瑟发抖。
题意简述
给定两个长度为
对于
其中
输出
思路
问题转化
设:
第二项中求和下标是
- 对每个
A_i ,若存在j=t-i 且1 \le j \le N ,则贡献一次A_i 。 - 对每个
B_i ,若存在i=t-j 且1 \le i \le N ,则贡献一次B_i 。
则原式变为:
问题转化为:先计算
计算 F(t)
计算
计算
所以令
因为
用前缀和预处理即可。
Code
记得开 long long。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int n,a[maxn],b[maxn];
long long sa[maxn],sb[maxn],ans;
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],sa[i]=sa[i-1]+a[i];
for(int i=1;i<=n;i++) cin>>b[i],sb[i]=sb[i-1]+b[i];
for(int t=2;t<=2*n;t++){
int l=max(1,t-n),r=min(n,t-1);
ans+=(sa[r]-sa[l-1])+(sb[r]-sb[l-1]),cout<<ans<<'\n';
}
}