记录编号 153113 评测结果 AAAAAAAAAA
题目名称 [CQOI2011]动态逆序对 最终得分 100
用户昵称 Gravatarnew ioer 是否通过 通过
代码语言 C++ 运行时间 3.950 s
提交时间 2015-03-16 20:12:48 内存使用 20.41 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
using namespace std;
typedef unsigned int lnt;
const int maxn=100005;
bool del[maxn];
lnt c[maxn],ans[maxn];
int n,m,tot,a[maxn],b[maxn],pos[maxn];
char ci[2000000],co[1000000],*pi=ci,*po=co;
struct ques{int id,x,y,v,p;}q1[maxn<<2],q2[maxn<<2];
bool cmp(ques a,ques b){
	if(a.x==b.x) return a.id<b.id;
	return a.x<b.x;
}
void in(int &x){
	x=0;
	while(*pi<48) pi++;
	while(*pi>47) x=x*10+*pi++-48;
}
void out(lnt x){
	if(!x) {*po++='0',*po++='\n';return;}
	int p=0;char buf[20];
	while(x) buf[++p]=x%10+'0',x/=10;
	while(p) *po++=buf[p--];
	*po++='\n';
}
void solve(int l,int r){
	if(l==r) return;
	int mid=(l+r)>>1,cnt=0;
	for(int i=l;i<=mid;i++) if(!q1[i].v) q2[++cnt]=q1[i];
	for(int i=mid+1;i<=r;i++) if(q1[i].v)q2[++cnt]=q1[i];
	sort(q2+1,q2+cnt+1,cmp);
	for(int i=1;i<=cnt;i++){
		if(!q2[i].v) for(int j=q2[i].y;j<=n;j+=j&-j) c[j]++;
		else{
			lnt res=0;
			for(int j=q2[i].y;j;j-=j&-j) res+=c[j];
			ans[q2[i].p]+=res*q2[i].v;
		}
	}
	for(int i=1;i<=cnt;i++)
		if(!q2[i].v) 
			for(int j=q2[i].y;j<=n;j+=j&-j) c[j]--;
	solve(l,mid),solve(mid+1,r);
}
int main(){
	freopen("inverse.in" ,"r",stdin ) ;
	freopen("inverse.out","w",stdout) ;
	fread(ci,1,2000000,stdin);
	in(n),in(m);
	for(int i=1;i<=n;i++) in(a[i]),pos[a[i]]=i;
	for(int i=1,k;i<=m;i++) in(b[i]),del[pos[b[i]]]=1;
	for(int i=1;i<=n;i++) 
		if(!del[i]){
			tot++,q1[tot]=(ques){tot,n,a[i]-1,1,0};
			tot++,q1[tot]=(ques){tot,i-1,n,1,0};
			tot++,q1[tot]=(ques){tot,i-1,a[i]-1,-2,0};
			tot++,q1[tot]=(ques){tot,i,a[i],0,0};
		}
	for(int i=m;i;i--){
		tot++,q1[tot]=(ques){tot,n,b[i]-1,1,i};
		tot++,q1[tot]=(ques){tot,pos[b[i]]-1,n,1,i};
		tot++,q1[tot]=(ques){tot,pos[b[i]]-1,b[i]-1,-2,i};
		tot++,q1[tot]=(ques){tot,pos[b[i]],b[i],0,i};
	}
	solve(1,tot);
	ans[m+1]=ans[0];
	for(int i=m;i;i--) ans[i]+=ans[i+1];
	for(int i=1;i<=m;i++) out(ans[i]);
	fwrite(co,1,po-co,stdout);
}