refactor(P11670.cpp): 优化计算逻辑并重命名变量以提高可读性

- 将变量anumcnt重命名为apos和bpos以更清晰表达用途
- 重构计算逻辑,使用双指针方法替代原有循环
- 添加排序操作以提高计算效率
This commit is contained in:
Zengtudor 2025-10-22 16:53:29 +08:00
parent 7148637cb3
commit 3f0a46735d

View File

@ -7,8 +7,8 @@
using ll = int64_t;
ll n,ans;
std::vector<std::vector<ll>> anumcnt;
std::vector<ll> a;
std::vector<std::vector<ll>> apos,bpos;
std::vector<ll> a,b;
int main(){
std::iostream::sync_with_stdio(false);
@ -17,31 +17,37 @@ int main(){
std::cin>>n;
a.resize(n+1);
anumcnt.resize(n+1);
b.resize(n+1);
apos.resize(n+1);
bpos.resize(n+1);
for(ll i=1;i<=n;i++){
std::cin>>a[i];
anumcnt[a[i]].push_back(i);
apos[a[i]].push_back(std::min(i,n-i+1));
}
for(ll i=1;i<=n;i++){
ll b,nans=0;
std::cin>>b;
if(a[i]==b){
std::cin>>b[i];
bpos[b[i]].push_back(std::min(i,n-i+1));
}
for(ll i=1;i<=n;i++){
if(a[i]==b[i]){
ll N=i-1;
nans+=N*(N+1)/2;
ans+=N*(N+1)/2;
N=n-i;
nans+=N*(N+1)/2;
// printf("a[%lld]==b[%lld], +=%lld\n",i,i,nans);
ans+=N*(N+1)/2;
}
ans+=nans;
nans=0;
for(ll ai:anumcnt[b]){
ll l=std::min(ai,i);
ll r=std::min(n-ai+1,n-i+1);
nans += std::min(l,r);
std::sort(apos[i].begin(),apos[i].end());
std::sort(bpos[i].begin(),bpos[i].end());
ll pa=0,pb=0;
while(pa<apos[i].size() && pb<bpos[i].size()){
if(apos[i][pa]<bpos[i][pb]){
ans+=apos[i][pa++]*(bpos[i].size()-pb);
}else{
ans+=bpos[i][pb++]*(apos[i].size()-pa);
}
// printf("b[%lld] l to r +=%lld\n",i,nans);
ans+=nans;
}
}
std::cout<<ans<<"\n";
}