记录编号 222015 评测结果 AAAAAAAAAA
题目名称 [CQOI2011]动态逆序对 最终得分 100
用户昵称 Gravatarzys 是否通过 通过
代码语言 C++ 运行时间 4.384 s
提交时间 2016-01-27 20:15:38 内存使用 98.79 MiB
显示代码纯文本
#define MAXN 100010UL
#define MAXQ 2000000UL
#define LL long long

#include<cstdio>
#include<algorithm>

using namespace std;

int n,m,seq[MAXN],tot;
LL tree[MAXN],Ans[MAXN];
int pos[MAXN],del[MAXN];

struct AskCnt{
	bool typ;LL val;
	int x,y,id,ti;
}Ask[MAXQ],tmp[MAXQ];

bool cmp(const AskCnt & a,const AskCnt & b)
{
    if(a.x==b.x&&a.y==b.y)return a.typ<b.typ;
	return a.x==b.x?a.y<b.y:a.x<b.x;
}

inline void Add(int x,LL w)
{
	for(int i=x;i<=n;i+=(i&(-i)))
	    tree[i]+=w;
}

inline LL Query(int x)
{
	LL tans=0;
	for(int i=x;i>0;i-=(i&(-i)))
		tans+=tree[i];
	return tans;
}

inline void Add_ask(int x1,int y1,int x2,int y2,int tim)
{
	tot++;Ask[tot].x=x2;Ask[tot].y=y2;Ask[tot].ti=tim;Ask[tot].typ=true;Ask[tot].id=tot;Ask[tot].val=1;
	tot++;Ask[tot].x=x2;Ask[tot].y=y1-1;Ask[tot].ti=tim;Ask[tot].typ=true;Ask[tot].id=tot;Ask[tot].val=-1;
	tot++;Ask[tot].x=x1-1;Ask[tot].y=y2;Ask[tot].ti=tim;Ask[tot].typ=true;Ask[tot].id=tot;Ask[tot].val=-1;
	tot++;Ask[tot].x=x1-1;Ask[tot].y=y1-1;Ask[tot].ti=tim;Ask[tot].typ=true;Ask[tot].id=tot;Ask[tot].val=1;
}

inline void Add_add(int x,int y,int w)
{
	tot++;Ask[tot].x=x;Ask[tot].y=y;Ask[tot].typ=false;Ask[tot].id=tot;Ask[tot].val=1;
}

inline void Add_num(int x,int y,int tim)
{
	Add_ask(1,y,x,n,tim);
	Add_ask(x,1,n,y,tim);
	Add_add(x,y,1);
}

inline void CDQ(int l,int r)
{
	if(l==r)return;
	int mid=(l+r)>>1;
	int l1=l-1,l2=mid;
	for(int i=l;i<=r;i++){
		if(Ask[i].id<=mid&&(!Ask[i].typ))Add(Ask[i].y,Ask[i].val);
		if(Ask[i].id>mid&&(Ask[i].typ))Ans[Ask[i].ti]+=Ask[i].val*Query(Ask[i].y);
	}
	for(int i=l;i<=r;i++)
		if(Ask[i].id<=mid&&(!Ask[i].typ))Add(Ask[i].y,-Ask[i].val);
	for(int i=l;i<=r;i++){
		if(Ask[i].id<=mid)tmp[++l1]=Ask[i];
		else tmp[++l2]=Ask[i];
	}
	for(int i=l;i<=r;i++)Ask[i]=tmp[i];
	CDQ(l,mid);CDQ(mid+1,r);
}

int main()
{
    freopen("inverse.in","r",stdin);
	freopen("inverse.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&seq[i]);
		pos[seq[i]]=i;
	}
	for(int i=1;i<=m;i++){
		scanf("%d",&del[i]);
		seq[pos[del[i]]]=0;
	}
	for(int i=1;i<=n;i++)
	    if(seq[i])Add_num(i,seq[i],0);
	for(int i=m;i>=1;i--)
		Add_num(pos[del[i]],del[i],i);
	sort(Ask+1,Ask+tot+1,cmp);
	CDQ(1,tot);
	Ans[m]+=Ans[0];
	for(int i=m-1;i>=1;i--)Ans[i]+=Ans[i+1];
	for(int i=1;i<=m;i++)printf("%lld\n",Ans[i]);
}