- chenshixian 的博客
day14
- @ 2025-7-28 18:51:51
T5
我们可以发现,最终的答案为假设全要修改的,减去序列内不要给的
而假设全要修改的值为
$$\sum_{i=1}^n (n-i+1)\times \lfloor\frac{i}{2}\rfloor$$而对于不用修改的部分,我们可以把每种数的位置催在一个集合里,然后用双指针去找两两对称,每个位置的贡献是
且这部分可以用双指针实现,再把这两个数相减就行了
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,cnt,ans;
int a[200010];
vector<int>b[200010];
signed main() {
freopen("E.in","r",stdin);
freopen("E.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
cnt+=(n-i+1)*(i/2);
b[a[i]].push_back(i);
}
for(int i=1;i<= n;i++){
int l=0,r=b[i].size()-1;
while (l<r){
if(b[i][l]<n-b[i][r]+1) {
ans+=(r-l)*b[i][l];
l++;
} else {
ans+=(r-l)*(n-b[i][r]+1);
r--;
}
}
}
cout << cnt - ans;
return 0;
}