MD谁调出来赏10个@ACPC的小号关注
查看原帖
MD谁调出来赏10个@ACPC的小号关注
749630
wxzzzz楼主2023/12/21 21:08

SB题去死吧

#include <bits/stdc++.h>
#define ll int
#define rll register ll
#define cll const ll
#define N 100005
#define M 25
using namespace std;
inline ll read()
{
    rll x=0;bool f=1;register char c=getchar();
    while(c<48||c>57){if(c=='-') f=0;c=getchar();}
    while(c>=48&&c<=57){x=x*10+(c^48);c=getchar();}
    return f?x:-x;
}
inline void write(ll x)
{
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+48);
}
cll n=read();
ll m=read(),cl,cr,ans,idt=1,a[N],rt[N],pl[M],pr[M],tpl[M],tpr[M],pos[N];
struct node{ll ls,rs,cnt;}t[N*400];
inline void build(ll p,ll l,ll r)
{
	if(l==r) return;
	t[p].ls=++idt,t[p].rs=++idt;
	rll mid=l+r>>1;
	build(t[p].ls,l,mid);
	build(t[p].rs,mid+1,r);
}
inline ll change(ll p,ll l,ll r,ll x,ll k)
{
	rll q=++idt;
	t[q]=t[p],t[q].cnt+=k;
	if(l==r) return q;
	rll mid=l+r>>1;
	if(x<=mid) t[q].ls=change(t[p].ls,l,mid,x,k);
	else t[q].rs=change(t[p].rs,mid+1,r,x,k);
	return q;
}
inline ll query(ll l,ll r,ll ql,ll qr)
{
	rll cnt=0;
	if(l>=ql&&r<=qr)
	{
		for(rll i=1;i<=cr;i++) cnt+=t[pr[i]].cnt;
		for(rll i=1;i<=cl;i++) cnt-=t[pl[i]].cnt;
//		cout << "sb[" << l << ',' << r << "]=" << cnt << '\n';
//		if(l==4&&r==4)
//		{
//			cout << "\n\n\n";
//			cout << "cnt4:";
//			for(rll i=1;i<=cr;i++) cout << pr[i] << ' ';
//			cout << "\n\n\n";
//		}
		return cnt;
	}
	rll mid=l+r>>1,ret=0;
	memcpy(tpl,pl,sizeof tpl);
	memcpy(tpr,pr,sizeof tpr);
	if(ql<=mid)
	{
		for(rll i=1;i<=cl;i++) pl[i]=t[pl[i]].ls;
		for(rll i=1;i<=cr;i++) pr[i]=t[pr[i]].ls;
		ret+=query(l,mid,ql,qr);
	}
	memcpy(pl,tpl,sizeof pl);
	memcpy(pr,tpr,sizeof pr);
	if(mid<qr)
	{
		for(rll i=1;i<=cl;i++) pl[i]=t[pl[i]].rs;
		for(rll i=1;i<=cr;i++) pr[i]=t[pr[i]].rs;
		ret+=query(mid+1,r,ql,qr);
	}
	return ret;
}
inline void getrt(ll x,ll y)
{
	cl=cr=0,x--;
	while(x)
	{
		pl[++cl]=rt[x];
		x-=(x&-x);
	}
	while(y)
	{
		pr[++cr]=rt[y];
		y-=(y&-y);
	}
}
inline void changert(ll x,ll v,ll k)
{
	while(x<=n)
	{
		if(!rt[x]) rt[x]=1;
		rt[x]=change(rt[x],1,n,v,k);
		//cout << "change(" << v << ',' << k << ")\n";
//		if(v==4) cout << "SBSBSBSBSBSBSBSBSBSB=" << rt[x] << '\n';
		x+=(x&-x);
	}
}
int main()
{
	rt[0]=1,build(1,1,n);
    for(rll i=1;i<=n;i++)
    {
		a[i]=read(),pos[a[i]]=i;
//		cout << "SB:";
		if(i>1&&a[i]>1)
		{
			getrt(1,i-1);
			ans+=i-1-query(1,n,1,a[i]-1);
//			getrt(1,i-1);
//			cout << i-1-query(1,n,1,a[i]-1) << '\n';
		}
//		else cout << "0\n";
		changert(i,a[i],1);
	}
	while(m--)
	{
		cll x=read();
//		cout << "\n\n\n";
//		getrt(4,4);
//		cout << "cnt[4]=" << query(1,n,4,4) << '\n';
//		cout << "\n\n\n";
		write(ans),putchar('\n');
//		cout << "sb:";
		if(pos[x]>1&&x<n)
		{
			getrt(1,pos[x]-1);
//			for(rll i=1;i<=cl;i++) cout << "pl[" << i << "]=" << pl[i] << '\n';
//			for(rll i=1;i<=cr;i++) cout << "pr[" << i << "]=" << pr[i] << '\n';
			ans-=query(1,n,x+1,n);
			getrt(1,pos[x]-1);
//			cout << query(1,n,x+1,n) << ' ';
		}
//		else cout << "0 ";
		if(pos[x]<n&&x>1)
		{
			getrt(pos[x]+1,n);
			ans-=query(1,n,1,x-1);
			getrt(pos[x]+1,n);
//			cout << query(1,n,1,x-1) << '\n';
		}
//		else cout << "0\n";
		changert(pos[x],x,-1);
	}
    return 0;
}
2023/12/21 21:08
加载中...