CDQ求调 0 pts
查看原帖
CDQ求调 0 pts
754310
Pepsee楼主2023/12/21 14:57

我 time 是第一维,val 是第二维,pos 是第三维

#include <bits/stdc++.h>
#define INF 1000000007ll;
using namespace std;
inline int read(){
	int res=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){res=(res<<1)+(res<<3)+(c^48);c=getchar();}
	return res*f;
}
void write(int x){
    if(x<0){putchar('-');x=-x;}
    if(x>9)write(x/10);
    putchar(x%10+'0');
}
int n,m;
int tr[214514],ans[214514];
int ton[214514];
struct node{
	int x,y,z;//x time; y val; z pos
}a[214514];
bool cmp(node a,node b){
	return a.x > b.x;
}
bool cmp2(node a,node b){
	if (a.y == b.y) return a.z < b.z;
	return a.y > b.y;
}
bool cmp3(node a,node b){
	if (a.y == b.y) return a.z > b.z;
	return a.y < b.y;
}
void add(int x,int a){
	for (; x <= 1e5; x += (x&-x))
		tr[x] += a;
}
int query(int x){
	int res = 0;
	for (; x; x -= (x&-x))
		res += tr[x];
	return res;
}
void solve(int l,int r)
{
	if (l == r) return ;
	int mid = (l+r) >> 1;
	solve(l,mid); solve(mid+1,r);
	sort(a+l,a+mid+1,cmp2);
	sort(a+mid+1,a+r+1,cmp2);
	int j = l;
	for (int i = mid+1; i <= r; i++)
	{
		while (a[i].y < a[j].y && j <= mid)
			add(a[j].z,1),j++;
		ans[a[i].z] += query(a[i].z);
	}
	for (int i = l; i < j; i++)
		add(a[i].z,-1),i++;
	sort(a+l,a+mid+1,cmp3);
	sort(a+mid+1,a+r+1,cmp3);
	j = l;
	for (int i = mid+1; i <= r; i++)
	{
		while (a[i].y > a[j].y && j <= mid)
			add(a[j].z,1),j++;
		ans[a[i].z] += query(1e5)-query(a[i].z);
	}
	for (int i = l; i < j; i++)
		add(a[i].z,-1),i++;
}
int main()
{
	int as = 0;
	n = read(); m = read();
	for (int i = 1; i <= n; i++)
		a[i].y = read(),a[i].z = i,ton[a[i].y] = i;
	for (int i = 1,x; i <= m; i++)
		x = read(),a[ton[x]].x = i;
	for (int i = 1; i <= n; i++)
		if (!a[i].z) a[i].x = INF;
//	for (int i = n; i >= 1; i--)
//		as += query(a[i].y-1),add(a[i].y,1);
//	printf("%d\n\n",as);
	memset(tr,0,sizeof tr);
	sort(a+1,a+n+1,cmp);
	solve(1,n);
	for (int i = 1; i <= m; i++)
		write(ans[i]),puts("");
	return 0;
}
2023/12/21 14:57
加载中...