这凭啥啊Qwq||玄关
查看原帖
这凭啥啊Qwq||玄关
989997
DGL__DGL_AFO楼主2024/10/30 16:55

写的CDQ分治

然而以n==EOF||n==-1结束会T,

卡个1s的时就过了

为啥咧Qwq

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
struct Node
{
	int a,b,c;
} d[2145140];
int p[2145140];
int tr[2145140];
ll s[1145140];
int op;

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

inline void add(int x,int k)
{
	for(int i=x;i<=n;i+=lowbit(i))
	  tr[i]+=k;
}

inline ll ask(int x)
{
	ll res=0;
	for(int i=x;i;i-=lowbit(i))
	  res+=tr[i];
	return res;  
}

inline bool cmp1(Node a,Node b)
{
	if(a.a!=b.a)  return a.a<b.a;
	if(b.a!=b.b)  return a.b>b.b;
	return a.c<b.c;  
}

inline bool cmp2(Node a,Node b)
{
	if(a.a!=b.a)  return a.a>b.a;
	if(b.a!=b.b)  return a.b<b.b;
	return a.c<b.c;
}

inline bool cnmp1(Node a,Node b)
{
	if(a.b!=b.b)  return a.b>b.b;
	return a.c<b.c;
}

inline bool cnmp2(Node a,Node b)
{
	if(a.b!=b.b)  return a.b<b.b;
	return a.c<b.c;
}

void cdq1(int l,int r)
{
	if(l>=r)
	  return ;
	int mid=(l+r)>>1;
	cdq1(l,mid);cdq1(mid+1,r);
	sort(d+l,d+mid+1,cnmp1);
	sort(d+mid+1,d+r+1,cnmp1);
	int cnt=l;
	for(int i=mid+1;i<=r;i++)
	{
		while(d[cnt].b>=d[i].b&&cnt<=mid)
		{
			add(d[cnt].c,1);
			cnt++;//cout<<cnt<<' ';
		}
		s[d[i].c]+=ask(d[i].c);
	}  
	for(int i=l;i<cnt;i++)
	  add(d[i].c,-1);
}

void cdq2(int l,int r)
{
	if(l>=r)
	  return ;
	int mid=(l+r)>>1;
	cdq2(l,mid);cdq2(mid+1,r);
	sort(d+l,d+mid+1,cnmp2);
	sort(d+mid+1,d+r+1,cnmp2);
	int cnt=l;
	for(int i=mid+1;i<=r;i++)
	{
		while(d[cnt].b<=d[i].b&&cnt<=mid)
		{
			add(d[cnt].c,1);
			cnt++;
		}
		s[d[i].c]+=ask(d[i].c);
	}  
	for(int i=l;i<cnt;i++)
	  add(d[i].c,-1);
}

int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	while(1)
	{
		memset(s,0,sizeof s);
		memset(d,0,sizeof d);
		cin>>n;
		
		if((double)clock()/CLOCKS_PER_SEC>1)
		  return 0;  
		cin>>m;
		op=n-m;
		for(int i=1;i<=n;i++)
		{
			d[i].a=i;
			cin>>d[i].b;
			p[d[i].b]=i;
		}
		for(int i=1;i<=m;i++)
		{
			int x;
			cin>>x;
			d[p[x]].c=n-i+1;
		}
		for(int i=n;i>=1;i--)
		  if(!d[i].c)
		    d[i].c=op--;
		     
		sort(d+1,d+1+n,cmp1);
		cdq1(1,n);
		sort(d+1,d+1+n,cmp2);
		cdq2(1,n);
		
		/*for(int i=1;i<=n;i++)
		  cout<<s[i]<<' ';  */
		
		for(int i=1;i<=n;i++)
		  s[i]+=s[i-1];
		for(int i=1;i<=m;i++)
		  cout<<s[n-i+1]<<"\n"; 
	}

	
	return 0;
}
/*
3 2
3 4 2 
4
2
*/
/*
3 1
3 4 2
4
*/
2024/10/30 16:55
加载中...