求Hack
查看原帖
求Hack
580608
lupengheyyds楼主2023/11/2 17:49

极限数据拍了半个小时全过,但30分

#include<bits/stdc++.h>
using namespace std;
const int szl=2*5e4+5,mod=1e9+7,inf=1e5;
int n,m,root[szl],tot,a[szl],v[szl];
long long ans;
struct Node{
	int ls,rs,num;
	long long val;
	#define ls(x) sgt[x].ls
	#define rs(x) sgt[x].rs
	#define num(x) sgt[x].num
	#define val(x) sgt[x].val
}sgt[szl*400];
inline void Up(int p){
	val(p)=(val(ls(p))+val(rs(p)))%mod;
	num(p)=(num(ls(p))+num(rs(p)))%mod;
	return;
}
int bin[szl*400];
inline void Del(int &mem){
	sgt[mem]={0,0,0,0};
	bin[++bin[0]]=mem;
	mem=0;
	return;
}
inline int New(){
	return bin[0]?bin[bin[0]--]:++tot;
}
int Pick(int p,int L,int R,int val,int l=1,int r=inf){
	if(!p)return 0;
	if(r<L||l>R)return 0;
	if(L<=l&&r<=R)return (val(p)+num(p)*val)%mod;
	int mid=l+r>>1;
	return (1ll*Pick(ls(p),L,R,val,l,mid)+Pick(rs(p),L,R,val,mid+1,r))%mod;
}
void Prune(int &p,int pos,int val,int l=1,int r=inf){
	if(!p)p=New();
	if(l==r){
		val(p)=(val(p)+val)%mod,num(p)+=val/abs(val);
		if(!num(p))Del(p);
		return;
	}
	int mid=l+r>>1;
	if(pos<=mid)Prune(ls(p),pos,val,l,mid);
	else		Prune(rs(p),pos,val,mid+1,r);
	Up(p);
	if(!num(p))Del(p);
	return;
}
inline void Add(int x,int y,int val){
	for(register int i=x;i<=n;i+=i&-i)Prune(root[i],y,val);
	return;
}
inline void Chan(int i,int f){
	return Add(i,a[i],f*v[i]);
}
inline int Ask(int x,int pos,int val){
	long long sum=0;
	for(register int i=x;i;i-=i&-i)sum=(sum+Pick(root[i],1,pos,val))%mod;
	return sum;
}
inline int Value(int x){
	return (1ll*Ask(x-1,inf,v[x])-Ask(x-1,a[x],v[x])+Ask(n,a[x]-1,v[x])-Ask(x,a[x]-1,v[x])+mod)%mod;
}
signed main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(register int i=1;i<=n;i++){
		cin>>a[i]>>v[i];
		Chan(i,1);
		ans+=Value(i);
		ans=(ans+mod)%mod;
	}
//	cout<<ans<<"!!";
	for(register int i=1;i<=m;i++){
		int x,y;cin>>x>>y;
		if(x==y){
			cout<<ans<<endl;
			continue;
		}
		if(x>y)swap(x,y);
		ans-=Value(x),Chan(x,-1);
		ans=(ans+mod)%mod;
		ans-=Value(y),Chan(y,-1);
		ans=(ans+mod)%mod;
		swap(a[x],a[y]),swap(v[x],v[y]);
		Chan(x,1),ans+=Value(x);
		ans=(ans+mod)%mod;
		Chan(y,1),ans+=Value(y);
		ans=(ans+mod)%mod;
		cout<<ans<<endl;
	}
	return 0;
}
2023/11/2 17:49
加载中...