全RE求调,线段树,样例能过
  • 板块P1908 逆序对
  • 楼主only_once
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/8 09:58
  • 上次更新2024/7/8 11:25:55
查看原帖
全RE求调,线段树,样例能过
1328928
only_once楼主2024/7/8 09:58
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<cstdio>
#define bug cout<<"-bug-"
#define endl "\n"
#define int long long
#define mem(a,b) memset(a,b,sizeof a)
using namespace std;
const int N=5e5+5;
int n,ans;
struct node{
	int l,r,root,sum;
}tree[4*N];
void update(int root){
	tree[root].sum=tree[root*2+1].sum+tree[root*2].sum;
}
void build(int l,int r,int root){
	tree[root].l=l;
	tree[root].r=r;
	if(l==r) return ;
	int mid=(l+r)>>1;
	build(l,mid,root*2);
	build(mid+1,r,root*2+1);
	update(root);
}
int cheak(int l,int r,int root){
	if(l<=tree[root].l&&r>=tree[root].r) return tree[root].sum;
	int ans=0;
	int mid=(tree[root].l+tree[root].r)>>1;
	if(l<=mid) ans+=cheak(l,r,root*2);
	if(r>mid) ans+=cheak(l,r,root*2+1);
	return ans;
}
void change(int x,int root){
	if(tree[root].l==x&&tree[root].r==x){
		tree[root].sum++;
		return ;
	}
	int mid=(tree[root].l+tree[root].r)>>1;
	if(x<=mid) change(x,root*2);
	else change(x,root*2+1);
	update(root);
}
signed main(){
	cin>>n;
	build(1,n,1);
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		if(x!=n) ans+=cheak(x+1,n,1);
		change(x,1);
	}
	cout<<ans;
	return 0;
}
2024/7/8 09:58
加载中...