动态开点 + 权值线段树做法,全WA求调!!
  • 板块P1908 逆序对
  • 楼主Daniel_yao
  • 当前回复15
  • 已保存回复15
  • 发布时间2022/9/30 08:34
  • 上次更新2023/10/27 09:29:37
查看原帖
动态开点 + 权值线段树做法,全WA求调!!
519573
Daniel_yao楼主2022/9/30 08:34

RT

#include <bits/stdc++.h>
#define int long long
#define H 19260817
#define rint register int
#define For(i,l,r) for(rint i=l;i<=r;++i)
#define FOR(i,r,l) for(rint i=r;i>=l;--i)
#define MOD 1000003
#define mod 1000000007

using namespace std;

inline int read() {
  rint x=0,f=1;char ch=getchar();
  while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
  while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
  return x*f;
}

void print(int x){
  if(x<0){putchar('-');x=-x;}
  if(x>9){print(x/10);putchar(x%10+'0');}
  else putchar(x+'0');
  return;
}

const int N = 500010 * log(1e9);

struct Node {
	int ls, rs;
	int l, r;
	int num; 
}t[N << 2];

int n = read(), a[N], ans, mx, idx = 1;

void pushup(int p) {
	t[p].num = t[t[p].ls].num + t[t[p].rs].num;
}

void add(int p, int l, int r, int k) {
	t[p].l = l, t[p].r = r;
	if(l == r) {
		t[p].num ++;
		return ;
	}
	int mid = l + r >> 1;
	if(k <= mid) {
		if(!t[p].ls) t[p].ls = ++idx;
		add(t[p].ls, l, mid, k);
	} else {
		if(!t[p].rs) t[p].rs = ++idx;
		add(t[p].rs, mid + 1, r, k);
	}
	pushup(p);
}

int query(int p, int l, int r) {
	if(p == 0) return 0;
	if(l <= t[p].l && t[p].r <= r) {
		return t[p].num;
	}
	int mid = t[p].l + t[p].r >> 1, ans = 0;
	if(l <= mid) {
		ans += query(t[p].ls, l, r);
	} 
	if(r > mid) {
		ans += query(t[p].rs, l, r);
	}
	return ans;
}

signed main() {
	For(i,1,n) a[i] = read(), mx = max(mx, a[i]);
	For(i,1,n) {
		add(1, 1, n, a[i]);
		ans += query(1, a[i] + 1, mx);
	}
	cout << ans << '\n';
	return 0;
}


2022/9/30 08:34
加载中...