萌新求助CDQ,样例没过
查看原帖
萌新求助CDQ,样例没过
365551
Buckbeak楼主2021/11/8 20:20
#include <algorithm>
#include <cctype>
#include <cstdio>
#include <iostream>

inline int readInt() {
  int ans = 0, c, f = 1;
  while (!isdigit(c = getchar()))
    if (c == '-') f = -1;
  do ans = ans * 10 + c - '0';
  while (isdigit(c = getchar()));
  return ans * f;
}

const int N = 1e5+3, M = 5e4+3;

int n, m, cnt[M], wei[N];

struct Node {
  int a, w, t; 
  Node() {}
}d[N];

bool cmpt(Node x, Node y) {
  return x.t > y.t;
}

bool cmpa(Node x,Node y) {
  return x.a > y.a;//按数字大小排序 
}

struct treeArray{
  int sz[N], len;
  treeArray() {}
  void Update(int x, int y) {
  	for ( ; x <= len; x += x & -x) sz[x] += y;
  }
  int Query(int x) {
  	int s = 0;
  	for ( ; x; x -= x & -x) s += sz[x];
  	return s;
  }
} T;//树状数组 

void CDQ(int l, int r) {
  if (l == r) return;
  int mid = (l + r) >> 1;
  CDQ(l, mid);
  CDQ(mid + 1, r);
  std::sort(d + l, d + mid + 1, cmpa);
  std::sort(d + mid + 1, d + r + 1, cmpa);
  int i = mid + 1, j = l;
  for ( ; i <= r; ++i) {
  	while(d[j].a > d[i].a && j <= mid) {
  	  T.Update(d[j].w, 1);
  	  ++j;
	}
	cnt[d[i].t] += T.Query(d[i].w);
  }
  for (i = l; i < j; ++i) T.Update(d[i].w, -1);
}//CDQ分治 

int main() {
  n = readInt(), m = readInt();
  T.len = n;
  for (int i = 1; i <= n; ++i) {
  	d[i].a = readInt();
  	d[i].w = i;//w存下标 
  	wei[d[i].a] = i;
  }
  for (int i = 1, u; i <= m; ++i) {
  	u = readInt();
  	d[wei[u]].t = i;
  }
  for(int i = 1; i <= n; ++i) if(!d[i].t) {
    d[i].t = m;
  }
  std::sort(d + 1, d + n + 1, cmpt);//先按时间排序 
  CDQ(1, n);
  for (int i = 1; i <= m; ++i) {
  	printf("%d\n", cnt[i]);
  }
  return 0;
}

qwq

2021/11/8 20:20
加载中...