UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#198227#2789. 极差wosile1006201ms56228kbC++113.0kb2023-11-21 11:59:422023-11-21 14:10:00

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define eps 1e-8
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
inline int lowbit(int x){
	return (x&(-x));
}
ll cs[2][2000005],cp[2][2000005],sum[2][2000005];
int n;
pair<int,int> a[500005];
#define mod 998244353
int p2[500005];
void pushup(int d,int x){
	cs[d][x]=(cs[d][x<<1]*p2[sum[d][x<<1|1]]+cs[d][x<<1|1])%mod;
	cp[d][x]=(cp[d][x<<1]+p2[sum[d][x<<1]]*cp[d][x<<1|1])%mod;
	sum[d][x]=sum[d][x<<1]+sum[d][x<<1|1];
}
void build(int l,int r,int x){
	if(l==r){
		cp[0][x]=cs[0][x]=1;
		cp[1][x]=cs[1][x]=2;
		sum[0][x]=0;
		sum[1][x]=1;
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,x<<1);
	build(mid+1,r,x<<1|1);
	pushup(0,x);
	pushup(1,x);
}
void upd(int l,int r,int x,int pos,int d){
	if(l==r){
		cp[d][x]=cs[d][x]=p2[1-d];
		sum[d][x]=1-d;
		return;
	}
	int mid=(l+r)/2;
	if(pos<=mid)upd(l,mid,x<<1,pos,d);
	else upd(mid+1,r,x<<1|1,pos,d);
	pushup(d,x);
}
int querysum(int l,int r,int x,int L,int R,int d){
	if(L<=l && r<=R)return sum[d][x];
	int mid=(l+r)/2;
	int ans=0;
	if(L<=mid)ans+=querysum(l,mid,x<<1,L,R,d);
	if(R>mid)ans+=querysum(mid+1,r,x<<1|1,L,R,d);
	return ans;
}
ll querys(int l,int r,int x,int L,int R,int d){
	if(L>R)return 0;
	if(L<=l && r<=R)return cs[d][x];
	int mid=(l+r)/2;
	if(R<=mid)return querys(l,mid,x<<1,L,R,d);
	if(L>mid)return querys(mid+1,r,x<<1|1,L,R,d);
	return (querys(l,mid,x<<1,L,R,d)*p2[querysum(mid+1,r,x<<1|1,L,R,d)]+querys(mid+1,r,x<<1|1,L,R,d))%mod;
}
ll queryp(int l,int r,int x,int L,int R,int d){
	if(L>R)return 0;
	if(L<=l && r<=R)return cp[d][x];
	int mid=(l+r)/2;
	if(R<=mid)return queryp(l,mid,x<<1,L,R,d);
	if(L>mid)return queryp(mid+1,r,x<<1|1,L,R,d);
	return (queryp(l,mid,x<<1,L,R,d)+p2[querysum(l,mid,x<<1,L,R,d)]*queryp(mid+1,r,x<<1|1,L,R,d))%mod;
}
void output(int l,int r,int x){
	printf("output l=%d,r=%d\n",l,r);
	printf("cs0=%d,cs1=%d,cp0=%d,cp1=%d\n",cs[0][x],cs[1][x],cp[0][x],cp[1][x]);
	printf("sum0=%d,sum1=%d\n",sum[0][x],sum[1][x]);
	if(l==r)return;
	int mid=(l+r)/2;
	output(l,mid,x<<1);
	output(mid+1,r,x<<1|1);
}
int tmp[500005];
int main(){
	scanf("%d",&n);
	p2[0]=1;
	for(int i=1;i<=n;i++)p2[i]=1LL*p2[i-1]*2%mod;
	for(int i=1;i<=n;i++)scanf("%d",&a[i].first);
	for(int i=1;i<=n;i++)a[i].second=i;
	sort(a+1,a+n+1);
	// for(int i=1;i<=n;i++)printf("%d ",a[i].second);
	// printf("\n");
	int ans=0;
	build(1,n,1);
	// output(1,n,1);
	for(int i=1;i<=n;i++){
		int p=a[i].second;
		// printf("%d %d\n",i,p);
		upd(1,n,1,p,0);
		ans=(ans+1LL*(querys(1,n,1,1,p-1,0)+1)*(queryp(1,n,1,p+1,n,0)+1)%mod*a[i].first%mod)%mod;
		ans=(ans-1LL*(querys(1,n,1,1,p-1,1)+1)*(queryp(1,n,1,p+1,n,1)+1)%mod*a[i].first%mod+mod)%mod;
		// printf("add %d %d mns %d %d\n",querys(1,n,1,1,p-1,0),queryp(1,n,1,p+1,n,0),querys(1,n,1,1,p-1,1),queryp(1,n,1,p+1,n,1));
		// if(i==4)output(1,n,1);
		upd(1,n,1,p,1);
	}
	printf("%d",ans);
	return 0;
}
//quod erat demonstrandum

这程序好像有点Bug,我给组数据试试?

Details

小提示:点击横条可展开更详细的信息

Test #1:

score: 10
Accepted
time: 3ms
memory: 5128kb

input:

10
822569775 140960465 675448100 378356373 881781963 632511858 517856306 355237516 318232566 701815470

output:

783495679

result:

ok "783495679"

Test #2:

score: 10
Accepted
time: 0ms
memory: 5128kb

input:

10
449281704 767368983 682106748 506365083 122199784 498808182 538569145 55437432 155268974 94445018

output:

68844302

result:

ok "68844302"

Test #3:

score: 10
Accepted
time: 0ms
memory: 5132kb

input:

10
591970549 421988862 413830573 240490034 164237038 902977274 59135052 95107365 250425253 324531999

output:

147766221

result:

ok "147766221"

Test #4:

score: 10
Accepted
time: 7ms
memory: 5912kb

input:

5000
646617726 824464102 323759947 246753612 585842690 504415490 14828815 693037963 801159103 946215...

output:

67443460

result:

ok "67443460"

Test #5:

score: 10
Accepted
time: 8ms
memory: 5916kb

input:

5000
654241726 72924489 266088677 295706937 963146543 634317920 182210355 549745450 893149778 174946...

output:

389625531

result:

ok "389625531"

Test #6:

score: 10
Accepted
time: 10ms
memory: 5916kb

input:

5000
38701861 203013652 438779672 247355223 112434120 403380796 731125167 338765345 868447685 883741...

output:

770908379

result:

ok "770908379"

Test #7:

score: 10
Accepted
time: 630ms
memory: 30484kb

input:

200000
695831669 804173945 82349222 653935161 167064728 232585930 988716260 695383039 585257840 3008...

output:

745841684

result:

ok "745841684"

Test #8:

score: 10
Accepted
time: 1816ms
memory: 56228kb

input:

500000
5 8 7 10 7 9 7 4 4 4 5 0 0 10 6 0 0 7 10 6 5 3 9 7 3 8 6 10 3 1 9 6 4 10 1 8 5 3 1 9 2 5 5 9 ...

output:

225099176

result:

ok "225099176"

Test #9:

score: 10
Accepted
time: 1920ms
memory: 56228kb

input:

500000
494353572 796134262 130578837 890308560 320968753 455636669 324898154 477464175 320403450 543...

output:

396578562

result:

ok "396578562"

Test #10:

score: 10
Accepted
time: 1807ms
memory: 56228kb

input:

500000
303781858 81904833 166578999 116580840 916556701 186538262 945202043 778425019 138280242 9981...

output:

394870719

result:

ok "394870719"

Extra Test:

score: 0
Extra Test Passed