UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#198220#2789. 极差snow_trace1006314ms146172kbC++113.7kb2023-11-21 11:30:292023-11-21 14:09:17

answer

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define lowbit(x) x&(-x)
int n;
int a[500005];
const int mod = 998244353;
const int inv = mod+1>>1;
const int N = 500005;
int inv2[1000005],pw[1000005];
struct tree{
	int l,r;
	int pre,suf;
	int lazy1 = 0,lazy2 = 0,tot1 = 0,tot2 = 0;
	void add1(int x){
		pre = pre*pw[x]%mod;
		lazy1+=x,tot1+=x;
	}void add2(int x){
		suf = suf*pw[x]%mod;
		lazy2+=x,tot2+=x;
	}
}tree[2000005];
void push_up(int k){
	tree[k].pre = tree[k<<1].pre+tree[k<<1|1].pre;
	if(tree[k].pre>mod)tree[k].pre-=mod;
	tree[k].suf = tree[k<<1].suf+tree[k<<1|1].suf;
	if(tree[k].suf>mod)tree[k].suf-=mod;
}void push_down(int k){
	if(tree[k].lazy1)tree[k<<1].add1(tree[k].lazy1),tree[k<<1|1].add1(tree[k].lazy1),tree[k].lazy1 = 0;
	if(tree[k].lazy2)tree[k<<1].add2(tree[k].lazy2),tree[k<<1|1].add2(tree[k].lazy2),tree[k].lazy2 = 0;
}
void build(int l,int r,int k){
	tree[k].l = l,tree[k].r = r;tree[k].tot1 = tree[k].tot2 = 0;
	tree[k].pre = tree[k].suf =0 ;tree[k].lazy1 = tree[k].lazy2 = 0;
	if(l+1 == r){return;}
	build(l,l+r>>1,k<<1),build(l+r>>1,r,k<<1|1);
}inline void upd1(int l,int r,int k){
	int ll = tree[k].l,rr = tree[k].r;
	if(l>=rr or ll>=r)return;
	if(l<=ll and rr<=r){
		tree[k].add1(1);return;
	}push_down(k),upd1(l,r,k<<1),upd1(l,r,k<<1|1);push_up(k);
}inline void upd2(int l,int r,int k){
	int ll = tree[k].l,rr = tree[k].r;
	if(l>=rr or ll>=r)return;
	if(l<=ll and rr<=r){
		tree[k].add2(1);return;
	}push_down(k),upd2(l,r,k<<1),upd2(l,r,k<<1|1);push_up(k);
}inline void nrd(int pos,int k){
	int l = tree[k].l,r = tree[k].r,mid = l+r>>1;
	if(l+1 == r){
		tree[k].pre = pos*pw[tree[k].tot1]%mod,tree[k].suf = (n-pos+1)*pw[tree[k].tot2]%mod;return;
	}push_down(k);
	if(pos<mid)nrd(pos,k<<1);
	else nrd(pos,k<<1|1);
	push_up(k);
}
inline int query1(int pos){
	int l = 1,r=n+1,k = 1,ans =0;
	while(l+1!=r){push_down(k);
		int mid =l+r>>1;
		if(pos>=mid)ans = (ans+tree[k<<1].pre),k = k<<1|1,l = mid;
		else k = k<<1,r = mid;
	}return ans%mod;
}inline int query2(int pos){
	int l = 1,r = n+1,k = 1,ans =0;
	while(l+1!=r){push_down(k);
		int mid = l+r>>1;
		if(pos<=mid)ans = (ans+tree[k<<1|1].suf),k = k<<1,r = mid;
		else k = k<<1|1,l = mid;
	}return ans%mod;
}/*
inline int query1(int l,int r,int k){
	int ll = tree[k].l,rr = tree[k].r;
	if(ll>=r or l>=rr)return 0;
	if(l<=ll and rr<=r)return tree[k].pre;
	push_down(k);return (query1(l,r,k<<1)+query1(l,r,k<<1|1))%mod;
}inline int query2(int l,int r,int k){
	int ll = tree[k].l,rr = tree[k].r;
	if(ll>=r or l>=rr)return 0;
	if(l<=ll and rr<=r)return tree[k].suf;
	push_down(k);return (query2(l,r,k<<1)+query2(l,r,k<<1|1))%mod;
}*/
vector<pair<int,int> >p;
bool cmp(pair<int,int>a,pair<int,int>b){
	return a.first<b.first;
}
signed main(){srand(time(0));
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin >> n;for(int i = 1;i<=n;i++)cin >> a[i];
//	cin >> n;
//n = 500000;
inv2[0] = 1;for(int i = 1;i<=n;i++)inv2[i] = inv2[i-1]*inv%mod;
//	for(int i= 1;i<=n;i++)a[i] = rand();
	pw[0] =1;for(int i = 1;i<=n;i++)pw[i] = pw[i-1]*2%mod;
	for(int i = 1;i<=n;i++){
		p.push_back({a[i],i});
	}sort(p.begin(),p.end(),cmp);build(1,n+1,1);
	int ans = 0;
	for(int i =0;i<p.size();i++){
		int pos = p[i].second,val = p[i].first;
		nrd(pos,1);
		ans+=query1(pos+1)*query2(pos)%mod*val%mod*inv2[i]%mod;ans%=mod;
		upd1(1,pos,1),upd2(pos+1,n+1,1);
	}
	reverse(p.begin(),p.end());build(1,n+1,1);
	for(int i =0;i<p.size();i++){
		int pos = p[i].second,val = p[i].first;
		nrd(pos,1);
		ans-=query1(pos+1)*query2(pos)%mod*val%mod*inv2[i]%mod;ans%=mod;ans +=mod;ans%=mod;
		upd1(1,pos,1),upd2(pos+1,n+1,1);
	}cout << ans << endl;
	
	return 0;
}/*
3
2 3 1 
*/

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

详细

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

Test #1:

score: 10
Accepted
time: 12ms
memory: 126280kb

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: 126276kb

input:

10
449281704 767368983 682106748 506365083 122199784 498808182 538569145 55437432 155268974 94445018

output:

68844302

result:

ok "68844302"

Test #3:

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

input:

10
591970549 421988862 413830573 240490034 164237038 902977274 59135052 95107365 250425253 324531999

output:

147766221

result:

ok "147766221"

Test #4:

score: 10
Accepted
time: 20ms
memory: 126540kb

input:

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

output:

67443460

result:

ok "67443460"

Test #5:

score: 10
Accepted
time: 12ms
memory: 126536kb

input:

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

output:

389625531

result:

ok "389625531"

Test #6:

score: 10
Accepted
time: 23ms
memory: 126536kb

input:

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

output:

770908379

result:

ok "770908379"

Test #7:

score: 10
Accepted
time: 588ms
memory: 134952kb

input:

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

output:

745841684

result:

ok "745841684"

Test #8:

score: 10
Accepted
time: 2069ms
memory: 146172kb

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: 1864ms
memory: 146172kb

input:

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

output:

396578562

result:

ok "396578562"

Test #10:

score: 10
Accepted
time: 1719ms
memory: 146172kb

input:

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

output:

394870719

result:

ok "394870719"

Extra Test:

score: 0
Extra Test Passed