性感代码求调
查看原帖
性感代码求调
471571
封禁用户楼主2024/3/30 21:41

样例是过的,但是全 WAWA

悬关

#include<bits/stdc++.h>
#define M 50001
#define ls p<<1
#define rs p<<1|1
#define ll long long
using namespace std;
inline ll read()
{
	ll k=0,f=0;char c=getchar();
	for(;!isdigit(c);c=getchar()) f|=c=='-';
	for(;isdigit(c);c=getchar()) k=(k<<1)+(k<<3)+(c^48);
	return f?-k:k;
}
mt19937_64 rnd(time(0));
const ll mod=1e9+7;
ll n,m;
ll tr[M<<2],Node;
ll ans;
struct node
{
	ll h,v;
}w[M<<4];
struct tree
{
	ll lson,rson,h,val,tot,siz,key;
}t[M<<6];
inline void push_up(ll p)
{
	t[p].siz=t[t[p].lson].siz+t[t[p].rson].siz+1,t[p].tot=t[t[p].lson].tot+t[t[p].rson].tot+t[p].val;
	return;
}
inline void split(ll p,ll k,ll &x,ll &y)
{
	if(!p)
	{
		x=0,y=0;
		return;
	}
	if(t[p].h<=k) x=p,split(t[p].rson,k,t[p].rson,y);
	else y=p,split(t[p].lson,k,x,t[p].lson);
	push_up(p);
	return;
}
inline ll merge(ll x,ll y)
{
	if(!x) return y;
	if(!y) return x;
	if(t[x].key<=t[y].key)
	{
		t[x].rson=merge(t[x].rson,y),push_up(x);
		return x;
	}
	else
	{
		t[y].lson=merge(x,t[y].lson),push_up(y);
		return y;
	}
}
inline void new_node(ll &p,node f)
{
	p=++Node,t[p].lson=0,t[p].rson=0,t[p].h=f.h,t[p].val=t[p].tot=f.v,t[p].siz=1,t[p].key=rnd();
	return;
}
inline void add(ll &root,node f)
{
	ll x,y,z;
	new_node(z,f),split(root,f.h,x,y),root=merge(merge(x,z),y);
	return;
}
inline void del(ll &root,node f)
{
	ll x,y,z;
	split(root,f.h,x,y),split(x,f.h-1,x,z),root=merge(x,y);
	return;
}
inline void modify(ll p,ll l,ll r,ll x,node a,node b)
{
	if(a.h) add(tr[p],a);
	if(b.h) del(tr[p],b);
	if(l==r) return;
	ll mid=(l+r)>>1;
	if(x<=mid) modify(ls,l,mid,x,a,b);
	else modify(rs,mid+1,r,x,a,b);
	return;
}
inline void update(ll p,ll l,ll r,ll st,ll en,node a,node b)
{
	if(st<=l&&r<=en)
	{
		ll x,y,z;
		split(tr[p],a.h,x,y),split(x,a.h-1,x,z),ans=ans+(t[y].siz-t[x].siz)*a.v+t[y].tot-t[x].tot,ans=((ans+mod)%mod+mod)%mod,tr[p]=merge(merge(x,z),y);
		split(tr[p],b.h,x,y),split(x,b.h-1,x,z),ans=ans+(t[x].siz-t[y].siz)*b.v+t[x].tot-t[y].tot,ans=((ans+mod)%mod+mod)%mod,tr[p]=merge(merge(x,z),y);
		return;
	}
	ll mid=(l+r)>>1;
	if(st<=mid)  update(ls,l,mid,st,en,a,b);
	if(en>mid) update(rs,mid+1,r,st,en,a,b);
	return;
}
int main()
{
	n=read(),m=read(),w[1].h=read(),w[1].v=read(),modify(1,1,n,1,w[1],w[0]);
	for(ll i=2;i<=n;i++)
	{
		ll x,y;
		w[i].h=read(),w[i].v=read(),split(tr[1],w[i].h,x,y),ans=ans+t[y].siz*w[i].v+t[y].tot,ans=((ans+mod)%mod+mod)%mod,tr[1]=merge(x,y),modify(1,1,n,i,w[i],w[0]);
	}
	while(m--)
	{
		ll x=read(),y=read();
		if(x>y) swap(x,y);
		if(x+1<=y-1) update(1,1,n,x+1,y-1,w[x],w[y]);
		if(w[x].h>w[y].h) ans=ans-w[x].v-w[y].v,ans=((ans+mod)%mod+mod)%mod;
		if(w[x].h<w[y].h) ans=ans+w[x].v+w[y].v,ans=((ans+mod)%mod+mod)%mod;
		modify(1,1,n,x,w[y],w[x]),modify(1,1,n,y,w[x],w[y]),swap(w[x],w[y]),printf("%lld\n",((ans+mod)%mod+mod)%mod);
	}
	return 0;
}
2024/3/30 21:41
加载中...