求大佬找找问题,谢谢
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/6 21:27
  • 上次更新2023/11/7 10:24:34
查看原帖
求大佬找找问题,谢谢
1183222
封禁用户楼主2023/11/6 21:27

https://www.luogu.com.cn/problem/P1966

//P1966 [NOIP2013 提高组] 火柴排队
/*
运用映射转换思想:
		
	顺序 > 乱序 也就是说a的最大和b的最大对应....
	
	定义C数组C[a[i]] = b[i];
	问题转化:求C中逆序对个数 
		 
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
const int mod = 1e8 - 3; 
int n;
int a[maxn], b[maxn];
int  c[maxn];
int bit[maxn];

int lowbit(int x){
	return x & -x;
}

void update(int pos, int x){
	while (pos <= n){
		bit[pos] += x;
		pos += lowbit(pos);
	}
}

int query(int x){
	int res = 0;
	while(x){
		res += bit[x];
		x -= lowbit(x);
	}
	return res;
}

int un[maxn];

int main () {
	cin >> n;
	for (int i = 1 ;i <= n ;i++){
		cin >> a[i];
		un[i] = a[i];
	}
	
	sort(un+1,un+1+n);
	int m = unique(un+1,un+1+n) - un - 1;	// 离散化 
	
	for (int i = 1;i <= n;i++){
		int id = lower_bound(un+1,un+1+m,a[i]) - un;
		a[i] = id;
//		cout << a[i] << " ";
	}
	
	memset(un, 0, sizeof(un));
	
	for (int i = 1; i <= n; i++){
		cin >> b[i];
		un[i] = b[i];
	}
	
	sort(un+1,un+1+n);
	m = 0;
	m = unique(un+1,un+1+n) - un - 1;	// 离散化 
	
	for (int i = 1;i <= n;i++){
		int id = lower_bound(un+1,un+1+m,b[i]) - un;
		b[i] = id;
//		cout << b[i] << " ";
	}
	
	
	for (int i = 1;i <= n ;i++){
		c[a[i]] = b[i];
	}
	
//	for (int i = 1;i <= n; i++){
//		cout<< c[i]<<" ";
//	}
	
	int ans = 0;
	
	for (int i = n; i >= 1; i--){
		ans += query(c[i] - 1);
		update(c[i],1);
	}
	
	cout << ans;
	return 0;
}
2023/11/6 21:27
加载中...