ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#198227 | #2789. 极差 | wosile | 100 | 6201ms | 56228kb | C++11 | 3.0kb | 2023-11-21 11:59:42 | 2023-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