场切了这题,我把代码搬过来0pts,什么鬼?,,
我题解都写好了,一看代码过不了😂
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rint register int
const int N = 5e5 + 10;
int n,a[N],b[N],ans,poi[N],poi2[N],cntnum;
vector<int>v[N];
vector<int>pre[N];
inline int find(int tar,int num){
while(poi[num] > -1 && v[num][poi[num]] > tar){
poi[num] --;
cntnum ++;
}
return poi[num] + 1;
}//找idx的函数
inline int find2(int tar,int num){
while(poi2[num] < v[num].size() && v[num][poi2[num]] <= tar){
poi2[num] ++;
cntnum ++;
}
return poi2[num];
}//找idy的函数
signed main(){
scanf("%lld",&n);
for(rint i = 1;i <= n;i ++){
scanf("%lld",&a[i]);
}
for(rint i = 1;i <= n;i ++){
scanf("%lld",&b[i]);
v[b[i]].push_back(i);
if(pre[b[i]].size() == 0){
pre[b[i]].push_back(i);
}
else{
pre[b[i]].push_back(pre[b[i]][pre[b[i]].size() - 1] + i);
}//前缀和部分
}
for(rint i = 1;i <= n;i ++){
if(a[i] == b[i]){
ans += i * (i - 1) / 2 + (n - i) * (n - i + 1) / 2;
}
}
for(rint i = 1;i <= N;i ++){
poi[i] = v[i].size() - 1;//idx单调递减,是从最大的位置往前找的
}
for(rint i = 1;i <= n;i ++){
int u = a[i];
int siz = v[u].size();
if(!siz) continue;//不加这一行会RE
int idx = find(n + 1 - i,u);
ans += (n + 1) * siz;
if(idx) ans += (idx * i + pre[u][idx - 1] - (n + 1) * idx);
int idy = find2(i,u);
ans -= pre[u][siz - 1];
if(idy) ans -= (idy * i - pre[u][idy - 1]);//分别计算idx和idy带来的贡献,事实上自己拆一下式子就好了,式子有点长所以这里没写。
}
cout << ans << endl;
return 0;
}