布什,戈门???
查看原帖
布什,戈门???
1036281
mayisang楼主2025/2/5 06:57

场切了这题,我把代码搬过来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;
}
2025/2/5 06:57
加载中...