Submission #67007544


Source Code Expand

#include <bits/stdc++.h>
#define ll long long
#define N 500010
using namespace std;
ll read(){
	char cc;
	while(1){cc=getchar();if((cc>='0'&&cc<='9')||cc=='-')break;}
	ll sum=0,flag=1;
	cc=='-'?flag=-1:sum=(cc^48);
	while(1){cc=getchar();if(!(cc>='0'&&cc<='9'))break;sum=(sum<<1)+(sum<<3)+(cc^48);}
	return sum*flag;
}
void write(ll x){
	if(!x)putchar('0');
	if(x<0){x=-x;putchar('-');}
	ll cc[25],cntt=0;
	while(x){cc[++cntt]=x%10;x/=10;}
	for(ll i=cntt;i>=1;i--)putchar(cc[i]+'0');
	putchar('\n');
}

const ll mod=998244353;

ll n,p[N],t[N<<2],T[N],tag[N<<2],sum=0,ans=0,shu2[N];
void add(ll &x,ll y){x=(x+y)%mod;}


void init(){
	sum=0;
	memset(T,0,sizeof(T));
	memset(t,0,sizeof(t));
	for(ll i=1;i<=n*4;i++)tag[i]=1;
}
void change1(ll x){for(;x<=n;x+=x&-x)T[x]++;}
ll ask1(ll x){ll ans=0;for(;x;x-=x&-x)ans+=T[x];return ans;}

void mul(ll x,ll w){
	tag[x]=tag[x]*w%mod;
	t[x]=t[x]*w%mod;
}
void pushdown(ll x){
	if(tag[x]!=1){
		mul(x<<1,tag[x]);
		mul(x<<1|1,tag[x]);
		tag[x]=1;
	}
}
void change(ll x,ll l,ll r,ll L,ll R,ll w){
	if(L>R)return ;
	if(L<=l&&r<=R){
		mul(x,w);
		return ;
	}
	pushdown(x);
	ll mid=(l+r)>>1;
	if(mid>=L)change(x<<1,l,mid,L,R,w);
	if(mid<R)change(x<<1|1,mid+1,r,L,R,w);
	t[x]=(t[x<<1]+t[x<<1|1])%mod;
}
void changesi(ll x,ll l,ll r,ll L,ll w){
	if(l==r){
		t[x]=w;
		return ;
	}
	pushdown(x);
	ll mid=(l+r)>>1;
	if(mid>=L)changesi(x<<1,l,mid,L,w);
	else changesi(x<<1|1,mid+1,r,L,w);
	t[x]=(t[x<<1]+t[x<<1|1])%mod;
}
ll ask(ll x,ll l,ll r,ll L,ll R){
	if(L>R)return 0;
	if(L<=l&&r<=R)return t[x];
	pushdown(x);
	ll mid=(l+r)>>1;
	if(mid>=L&&mid<R)return (ask(x<<1,l,mid,L,R)+ask(x<<1|1,mid+1,r,L,R))%mod;
	if(mid>=L)return ask(x<<1,l,mid,L,R);
	return ask(x<<1|1,mid+1,r,L,R);
}
int main(){
	shu2[0]=1;
	for(ll i=1;i<=500000;i++)shu2[i]=shu2[i-1]*2%mod;
	n=read();
	for(ll i=1;i<=n;i++)p[i]=read();

// maxi maxp
	init();
	for(ll i=1;i<=n;i++){
		ll shu=ask1(p[i]);
		change1(p[i]);
		changesi(1,1,n,p[i],p[i]*shu2[shu]%mod);
		add(sum,i*ask(1,1,n,p[i],n)%mod);
		// printf("%lld : %lld\n",i,ask(1,1,n,p[i],n));
		change(1,1,n,p[i]+1,n,2);
	}
	add(ans,sum);
	// printf("%lld \n",sum);
	// return 0;

// maxi minp
	init();
	for(ll i=1;i<=n;i++){
		ll shu=i-1-ask1(p[i]);
		change1(p[i]);
		changesi(1,1,n,p[i],p[i]*shu2[shu]%mod);
		add(sum,i*ask(1,1,n,1,p[i])%mod);
		// printf("%lld : %lld\n",i,ask(1,1,n,1,p[i]));
		change(1,1,n,1,p[i]-1,2);
	}
	add(ans,mod-sum);
	// printf("%lld \n",sum);

// mini maxp
	init();
	for(ll i=n;i>=1;i--){
		ll shu=ask1(p[i]);
		change1(p[i]);
		changesi(1,1,n,p[i],p[i]*shu2[shu]%mod);
		add(sum,i*ask(1,1,n,p[i],n)%mod);
		change(1,1,n,p[i]+1,n,2);
	}
	add(ans,mod-sum);
	// printf("%lld \n",sum);

// mini minp
	init();
	for(ll i=n;i>=1;i--){
		ll shu=n-i-ask1(p[i]);
		change1(p[i]);
		changesi(1,1,n,p[i],p[i]*shu2[shu]%mod);
		add(sum,i*ask(1,1,n,1,p[i])%mod);
		change(1,1,n,1,p[i]-1,2);
	}
	add(ans,sum);
	// printf("%lld \n",sum);


	write(ans);
	return 0;
}

Submission Info

Submission Time
Task E - Total Area of Bounding Boxes
User yixiuge777
Language C++ 20 (gcc 12.2)
Score 800
Code Size 3072 Byte
Status AC
Exec Time 526 ms
Memory 34916 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 800 / 800
Status
AC × 2
AC × 14
Set Name Test Cases
Sample sample-01.txt, sample-02.txt
All 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, sample-01.txt, sample-02.txt
Case Name Status Exec Time Memory
01-01.txt AC 13 ms 26884 KiB
01-02.txt AC 14 ms 26952 KiB
01-03.txt AC 297 ms 31704 KiB
01-04.txt AC 524 ms 34724 KiB
01-05.txt AC 526 ms 34720 KiB
01-06.txt AC 521 ms 34720 KiB
01-07.txt AC 517 ms 34916 KiB
01-08.txt AC 510 ms 34712 KiB
01-09.txt AC 517 ms 34712 KiB
01-10.txt AC 517 ms 34716 KiB
01-11.txt AC 333 ms 34732 KiB
01-12.txt AC 332 ms 34720 KiB
sample-01.txt AC 14 ms 26900 KiB
sample-02.txt AC 14 ms 26848 KiB