Submission #1063137

#TimeUsernameProblemLanguageResultExecution timeMemory
1063137shenfe1Flooding Wall (BOI24_wall)C++17
100 / 100
2886 ms123952 KiB
#include <bits/stdc++.h>
    
#pragma GCC optimize("Ofast")
    
using namespace std;
    
#define ll long long
#define pb push_back
#define pii pair<int,int>
#define F first
#define S second
#define sz(s) (int)s.size()
#define in insert
#define all(v) v.begin(),v.end()
#define lb lower_bound
#define int ll

const int MAX=1e6+10;
const int mod=1e9+7;

int n;
int a[MAX],b[MAX];
vector<int> vec;

struct segtree{
    int t[4*MAX],t1[4*MAX],add[4*MAX];

    void init(int n){
        for(int i=1;i<=4*n;i++){
            t[i]=t1[i]=0;
            add[i]=1;
        }
    }

    void upd(int v,int x){
        t[v]=t[v]*x%mod;
        t1[v]=t1[v]*x%mod;
        add[v]=add[v]*x%mod;
    }

    void push(int v){
        if(add[v]!=1){
            upd(2*v,add[v]);
            upd(2*v+1,add[v]);
            add[v]=1;
        }
    }

    void update(int v,int tl,int tr,int l,int r,int x){
        if(l>r||tl>r||l>tr)return;
        if(l<=tl&&tr<=r){
            upd(v,x);
            return;
        }
        push(v);
        int tm=(tl+tr)/2;
        update(2*v,tl,tm,l,r,x);
        update(2*v+1,tm+1,tr,l,r,x);
        t[v]=(t[2*v]+t[2*v+1])%mod;
        t1[v]=(t1[2*v]+t1[2*v+1])%mod;
    }

    void set(int v,int tl,int tr,int pos,int x){
        if(tl==tr){
            t[v]=x;
            t1[v]=vec[tl]*x%mod;
            return;
        }
        push(v);
        int tm=(tl+tr)/2;
        if(pos<=tm)set(2*v,tl,tm,pos,x);
        else set(2*v+1,tm+1,tr,pos,x);
        t[v]=(t[2*v]+t[2*v+1])%mod;
        t1[v]=(t1[2*v]+t1[2*v+1])%mod;
    }

    int get(int v,int tl,int tr,int l,int r){
        if(l>r||tl>r||l>tr)return 0;
        if(l<=tl&&tr<=r)return t[v];
        push(v);
        int tm=(tl+tr)/2;
        return (get(2*v,tl,tm,l,r)+get(2*v+1,tm+1,tr,l,r))%mod;
    }

    int getT(int v,int tl,int tr,int l,int r){
        if(l>r||tl>r||l>tr)return 0;
        if(l<=tl&&tr<=r)return t1[v];
        push(v);
        int tm=(tl+tr)/2;
        return (getT(2*v,tl,tm,l,r)+getT(2*v+1,tm+1,tr,l,r))%mod;
    }
}T;

int pw[MAX];

void solve(){
    cin>>n;
    pw[0]=1;
    for(int i=1;i<=n;i++)pw[i]=(pw[i-1]*2)%mod;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)cin>>b[i];
    vec.pb(0);
    for(int i=1;i<=n;i++)vec.pb(a[i]),vec.pb(b[i]);
    sort(all(vec));
    vec.erase(unique(all(vec)),vec.end());
    for(int i=1;i<=n;i++){
        a[i]=lb(all(vec),a[i])-vec.begin();
        b[i]=lb(all(vec),b[i])-vec.begin();
        if(a[i]>b[i])swap(a[i],b[i]);
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        ans-=(vec[a[i]]+vec[b[i]])*pw[n-1]%mod;
        if(ans<0)ans+=mod;
    }
    T.init(2*n+1);
    T.set(1,0,2*n,0,1);
    for(int i=1;i<=n;i++){
        int x=T.get(1,0,2*n,0,a[i]);
        int y=(T.get(1,0,2*n,0,b[i])+T.get(1,0,2*n,b[i],b[i]))%mod;
        T.set(1,0,2*n,a[i],x);
        T.set(1,0,2*n,b[i],y);
        T.update(1,0,2*n,0,a[i]-1,0);
        T.update(1,0,2*n,b[i]+1,2*n,2);
        ans+=T.getT(1,0,2*n,0,2*n)*pw[n-i]%mod;
        if(ans>=mod)ans-=mod;
    }
    ans-=T.getT(1,0,2*n,0,2*n)*n%mod;
    if(ans<0)ans+=mod;
    T.init(2*n+1);
    T.set(1,0,2*n,0,1);
    for(int i=n;i>=1;i--){
        int x=T.get(1,0,2*n,0,a[i]);
        int y=(T.get(1,0,2*n,0,b[i])+T.get(1,0,2*n,b[i],b[i]))%mod;
        T.set(1,0,2*n,a[i],x);
        T.set(1,0,2*n,b[i],y);
        T.update(1,0,2*n,0,a[i]-1,0);
        T.update(1,0,2*n,b[i]+1,2*n,2);
        ans+=T.getT(1,0,2*n,0,2*n)*pw[i-1]%mod;
        if(ans>=mod)ans-=mod;    
    }
    cout<<ans<<"\n";
}
    
signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    // cin>>t;
    while(t--)solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...