Submission #1326948

#TimeUsernameProblemLanguageResultExecution timeMemory
1326948boclobanchatFlooding Wall (BOI24_wall)C++20
100 / 100
1104 ms62644 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+5;
const long long mod=1e9+7;
struct value { int x,idx,p; };
bool comp(value a,value b)
{
	if(a.x==b.x)
	{
		if(a.idx==b.idx) return a.p<b.p;
		return a.idx<b.idx;
	}
	return a.x<b.x;
}
struct node
{
	long long sum,pw;
};
node operator+(const node& a,const node& b)
{
	return {(b.sum*a.pw+a.sum)%mod,a.pw*b.pw%mod};
}
value val[MAXN];
pair<int,int> P[MAXN],A[MAXN];
long long pref[MAXN],pw[MAXN];
node seg[MAXN*4];
int F[MAXN],suff[MAXN];
void build(int l,int r,int pos)
{
	seg[pos]={0,1};
	if(l==r)
	{
		F[l]=pos;
		return ;
	}
	int mid=(l+r)/2;
	build(l,mid,pos*2);
	build(mid+1,r,pos*2+1);
}
void update(int i,node val)
{
	seg[i=F[i]]=val;
	while(i/=2) seg[i]=seg[i*2]+seg[i*2+1];
}
node get(int n,int i)
{
	if(i==n) return seg[1];
	node ans={0,1};
	int l=0,r=n,pos=1;
	while(l<r)
	{
		int mid=(l+r)/2;
		if(mid<=i) ans=ans+seg[pos*2],pos=pos*2+1,l=mid+1;
		else pos*=2,r=mid;
	}
	return ans;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,cnt=0;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>A[i].first;
	for(int i=1;i<=n;i++)
	{
		cin>>A[i].second;
		if(A[i].first>A[i].second) swap(A[i].first,A[i].second);
		val[++cnt]={A[i].first,i,0},val[++cnt]={A[i].second,i,1};
	}
	sort(val+1,val+cnt+1,comp);
	for(int i=1;i<=cnt;i++) if(val[i].p) P[val[i].idx].second=i;
	else P[val[i].idx].first=i;
	long long ans=0;
	pw[0]=1;
	for(int i=1;i<=n;i++) pw[i]=pw[i-1]*2%mod;
	build(0,cnt,1);
	int mx=0;
	for(int i=1;i<=n;i++)
	{
		mx=max(mx,P[i].first);
		update(P[i].first,{A[i].first,1});
		update(P[i].second,{A[i].second,2});
		ans=(ans+(seg[1].sum-get(cnt,mx-1).sum+mod)%mod*pw[n-i]%mod)%mod;
	}
	ans=(ans-(seg[1].sum-get(cnt,mx-1).sum+mod)%mod*n%mod+mod)%mod;
	for(int i=n;i;i--) suff[i]=max(suff[i+1],P[i].first);
	for(int i=1;i<=n;i++)
	{
		ans=(ans+(seg[1].sum-get(cnt,suff[i]-1).sum+mod)%mod*pw[i-1]%mod)%mod;
		update(P[i].first,{0,1});
		update(P[i].second,{0,1});
	}
	for(int i=1;i<=n;i++) ans=(ans-(A[i].first+A[i].second)%mod*pw[n-1]%mod+mod)%mod;
	cout<<ans;
}
#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...