萌新求助
查看原帖
萌新求助
521276
张凯_巨大楼主2021/11/18 11:30
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const long long mod=1000000007;
int n,m;
int v[100010],a[100010];
int st[1000010],sd;
int rt[400010];
struct nod
{
    int l,r,v,v2;
};
vector<nod>s;
void add2(int o,int l,int r,int i,int x,int ad)
{
    if(l==r)
    {
        s[o].v+=x;
        s[o].v2+=ad;
        return;
    }
    if(i<=(l+r>>1))
    {
        if(s[o].l==-1)
        {
            if(sd)
            {
                s[o].l=st[sd];
                sd--;
            }
            else
            {
                s[o].l=s.size();
                s.push_back((nod){-1,-1,0,0});
            }
        }
        add2(s[o].l,l,(l+r>>1),i,x,ad);
        if(!s[s[o].l].v2&&sd<=1000000)
        {
            st[++sd]=s[o].l;
            s[s[o].l]={-1,-1,0,0};
            s[o].l=-1;
        }
    }
    else
    {
        if(s[o].r==-1)
        {
            if(sd)
            {
                s[o].r=st[sd];
                sd--;
            }
            else
            {
                s[o].r=s.size();
                s.push_back((nod){-1,-1,0,0});
            }
        }
        add2(s[o].r,(l+r>>1)+1,r,i,x,ad);
        if(!s[s[o].r].v2&&sd<=1000000)
        {
            st[++sd]=s[o].r;
            s[s[o].r]={-1,-1,0,0};
            s[o].r=-1;
        }
    }
    s[o].v=0;
    s[o].v2=0;
    if(s[o].l!=-1)
    {
        s[o].v+=s[s[o].l].v;
        s[o].v2+=s[s[o].l].v2;
    }
    if(s[o].r!=-1)
    {
        s[o].v+=s[s[o].r].v;
        s[o].v2+=s[s[o].r].v2;
    }
    s[o].v%=mod;
}
void build(int o,int l,int r)
{
    if(l<r)
    {
        build(o<<1,l,(l+r>>1));
        build(o<<1|1,(l+r>>1)+1,r);
    }
    rt[o]=s.size();
    s.push_back((nod){-1,-1,0,0});
    for(int i=l;i<=r;i++)
    {
        add2(rt[o],1,50000,v[i],a[i],1);
    }
}
void dlt(int o,int l,int r,int x,int ad)
{
    add2(rt[o],1,50000,v[x],ad*a[x],ad);
    if(l==r)
    {
        return;
    }
    if(x<=(l+r>>1))
    {
        dlt(o<<1,l,(l+r>>1),x,ad);
    }
    else
    {
        dlt(o<<1|1,(l+r>>1)+1,r,x,ad);
    }
}
long long r1,r2;
void query2(int o,int l,int r,int il,int ir)
{
    if(il<=l&&ir>=r)
    {
        r1+=s[o].v;
        r2+=s[o].v2;
        r1%=mod;
        return;
    }
    if(il<=(l+r>>1)&&s[o].l!=-1)
    {
        query2(s[o].l,l,(l+r>>1),il,ir);
    }
    if(ir>(l+r>>1)&&s[o].r!=-1)
    {
        query2(s[o].r,(l+r>>1)+1,r,il,ir);
    }
}
void query(int o,int l,int r,int il,int ir,int jl,int jr)
{
    if(il<=l&&ir>=r)
    {
        query2(rt[o],1,50000,jl,jr);
        return;
    }
    if(il<=(l+r>>1))
    {
        query(o<<1,l,(l+r>>1),il,ir,jl,jr);
    }
    if(ir>(l+r>>1))
    {
        query(o<<1|1,(l+r>>1)+1,r,il,ir,jl,jr);
    }
}
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return x*f;
}
signed main()
{
    n=read();
    m=read();
    for(int i=1;i<=n;i++)
    {
        v[i]=read();
        a[i]=read();
    }
    build(1,1,n);
    long long cnt=0;
    for(int i=1;i<=n;i++)
    {
        r1=r2=0;
        query(1,1,n,1,i,v[i],50000);
        cnt+=(r1+(r2-2)*a[i])%mod;
        cnt%=mod;
    }
    while(m--)
    {
        int x,y;
        x=read();
        y=read();
        r1=r2=0;
        query(1,1,n,1,x,v[x],50000);//cout<<r1<<' '<<r2<<endl;
        cnt-=(r1+a[x]*(r2-2)+mod)%mod;
        cnt=(cnt+mod)%mod;
        r1=r2=0;
        query(1,1,n,x,n,1,v[x]);//cout<<r1<<' '<<r2<<endl;
        cnt-=(r1+a[x]*(r2-2)+mod)%mod;
        cnt=(cnt+mod)%mod;
        dlt(1,1,n,x,-1);
        r1=r2=0;
        query(1,1,n,1,y,v[y],50000);//cout<<r1<<' '<<r2<<endl;
        cnt-=(r1+a[y]*(r2-2)+mod)%mod;
        cnt=(cnt+mod)%mod;
        r1=r2=0;
        query(1,1,n,y,n,1,v[y]);//cout<<r1<<' '<<r2<<endl;
        cnt-=(r1+a[y]*(r2-2)+mod)%mod;
        cnt=(cnt+mod)%mod;
        dlt(1,1,n,y,-1);
        swap(v[x],v[y]);
        swap(a[x],a[y]);
        dlt(1,1,n,x,1);
        r1=r2=0;
        query(1,1,n,1,x,v[x],50000);//cout<<r1<<' '<<r2<<endl;
        cnt+=(r1+a[x]*(r2-2)+mod)%mod;
        cnt=(cnt+mod)%mod;
        r1=r2=0;
        query(1,1,n,x,n,1,v[x]);//cout<<r1<<' '<<r2<<endl;
        cnt+=(r1+a[x]*(r2-2)+mod)%mod;
        cnt=(cnt+mod)%mod;
        dlt(1,1,n,y,1);
        r1=r2=0;
        query(1,1,n,1,y,v[y],50000);//cout<<r1<<' '<<r2<<endl;
        cnt+=(r1+a[y]*(r2-2)+mod)%mod;
        cnt=(cnt+mod)%mod;
        r1=r2=0;
        query(1,1,n,y,n,1,v[y]);//cout<<r1<<' '<<r2<<endl;
        cnt+=(r1+a[y]*(r2-2)+mod)%mod;
        cnt=(cnt+mod)%mod;
        cout<<cnt<<endl;
    }
    return 0;
}

wa成30分求助

2021/11/18 11:30
加载中...