UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#199158#26. T1snow_trace1001038ms21656kbC++113.5kb2023-12-05 11:20:232023-12-05 12:07:14

answer

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define lowbit(x) x&(-x)
const int mod = 1000000007;
const int N = 200000;
int n;int a[200005];
struct BIT{
	int tree[200005];
	void upd(int pos,int add){
		for(int i = pos;i<=N;i+=lowbit(i))tree[i] +=add;
	}int Query(int pos){
		int res =0 ;
		for(int i = pos;i>0;i-=lowbit(i))res+=tree[i];
		return res%mod;
	}int query(int l,int r){
		return (Query(r)-Query(l-1)+mod)%mod;
	}
}tree_suf,tree_pre;
int l[200005],r[200005],ed[200005],len[200005],bg[200005],ok[200005],fa[200005];
bool cmp(pair<int,int>a,pair<int,int>b){
	if(a.first == b.first)return a.second > b.second;
	return a.first<b.first;
}int find(int x){
	if(fa[x] == x)return x;return fa[x] = find(fa[x]);
}void merge(int x,int y){
	int X = find(x),Y = find(y);
	if(X == Y)return;
	fa[X] = Y;
	tree_suf.upd(bg[X],-len[X]*(len[X]+1)/2);
	tree_suf.upd(bg[Y],-len[Y]*(len[Y]+1)/2);
	tree_pre.upd(ed[X],-len[X]*(len[X]+1)/2);
	tree_pre.upd(ed[Y],-len[Y]*(len[Y]+1)/2);
	len[Y] = len[Y]+len[X];
	//cout << " a sofklsajaskflasjkl" << " " << len[Y] << endl;
	bg[Y] = min(bg[Y],bg[X]);
	ed[Y] = max(ed[Y],ed[X]);
	tree_suf.upd(bg[Y],len[Y]*(len[Y]+1)/2);
	tree_pre.upd(ed[Y],len[Y]*(len[Y]+1)/2);
}int pre[200005];
signed main(){
	cin >> n;
	for(int i = 1;i<=n;i++)cin >> a[i];
	pre[0] = 0;
	for(int i = 1;i<=n;i++)pre[i] = (pre[i-1]+i*(i+1)/2)%mod;
	a[0] = a[n+1] = 0;
	vector<int>p;p.push_back(0);
	for(int i = 1;i<=n;i++){
		while(a[p.back()]>=a[i])p.pop_back();
		l[i] = p.back();p.push_back(i);
	}p.clear();p.push_back(n+1);
	for(int i = n;i>=1;i--){
		while(a[p.back()]>a[i])p.pop_back();
		r[i] = p.back();p.push_back(i);
	}vector<pair<int,int> >s;
	for(int i = 1;i<=n;i++){
		s.push_back({a[i],i});
	}sort(s.begin(),s.end(),cmp);reverse(s.begin(),s.end());
	for(int i = 1;i<=n;i++){
		//cout<< " " << l[i] <<" " << r[i] << endl;
		ok[i] = 0;fa[i] = i;bg[i] = i;ed[i] = i;len[i] = 1;
	}int ans =0 ;
	for(int i =0;i<s.size();i++){
		int id = s[i].second,val = s[i].first,tot = 0;
		//cout << id << " " << val << endl;
		//cout << "ACTIVATE:";for(int j = 1;j<=n;j++)cout << ok[j] << " ";cout << endl;
		//cout << "TREESUF:";for(int j = 1;j<=n;j++)cout << tree_suf.query(j,j) << " ";cout << endl;
		//cout << "TREEPRE:";for(int j = 1;j<=n;j++)cout << tree_pre.query(j,j) << " ";cout << endl;
		//左边自由的区间
		int p = l[id]-1;
		if(p>0){
			int L = bg[find(p)],R = ed[find(p)];
			tot += (ok[find(p)]*(p-L+1)*(p-L+2)/2+tree_pre.query(1,L-1))%mod*(r[id]-id)%mod*(id-l[id])%mod;
		//	cout<<"L"<< " " << ok[find(p)]*(p-L+1)*(p-L+2)/2 << " " << tree_pre.query(1,L-1) << endl;
			tot%=mod;
		}//右边自由的区间 
		p = r[id]+1;
		if(p<=n){
			int L = bg[find(p)],R = ed[find(p)];
			tot += (ok[find(p)]*(R-p+1)*(R-p+2)/2+tree_suf.query(R+1,n))%mod*(r[id]-id)%mod*(id-l[id])%mod;
		//	cout << "R" << " " <<  ok[find(p)]*(R-p+1)*(R-p+2)/2 << " " << tree_suf.query(R+1,n)%mod << endl;
		}//中间的两端
		tot += pre[id-l[id]-1]*(r[id]-id)%mod+pre[r[id]-id-1]*(id-l[id])%mod;tot%=mod;
		//cout << " " << pre[id-l[id]-1]*(r[id]-id) << " " << pre[r[id]-id-1]*(id-l[id]) << endl;
		//激活id
		ok[id] = 1;tree_suf.upd(id,1),tree_pre.upd(id,1); 
		if(id>1 and ok[id-1])merge(id-1,id);
		if(id<n and ok[id+1])merge(id,id+1);
		//cout << "    " << tot << endl;
		ans += tot*a[id];ans%=mod;
	}cout << ans << endl; 
}/*
20 
1245438 3120948 50349850 12059812 5349080
34906843 53409634 12095813 503498531 34059834
50349863 60596323 58943021 58493404 50493821
56984534 6590477 47283956 312985748 65894234
*/

详细

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

Test #1:

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

input:

50
55892241
441028315
56244117
659101962
534791587
51590963
870682245
964013917
14874241
555206021
2...

output:

634701953

result:

ok 1 number(s): "634701953"

Test #2:

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

input:

50
268415021
590138010
754876784
937913390
355940776
911253523
260554933
730964311
974778246
5942043...

output:

120404797

result:

ok 1 number(s): "120404797"

Test #3:

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

input:

300
101950659
656431205
452641072
798029135
798932366
94440971
874749233
183737751
826318346
9153952...

output:

426644943

result:

ok 1 number(s): "426644943"

Test #4:

score: 10
Accepted
time: 2ms
memory: 1404kb

input:

300
926032387
288287103
59609871
547058800
31514417
769120932
449758640
879362321
320093778
79140946...

output:

455847635

result:

ok 1 number(s): "455847635"

Test #5:

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

input:

3000
513506508
625942144
548699623
523842250
527990194
627668442
44085509
931065051
761404158
292968...

output:

821817530

result:

ok 1 number(s): "821817530"

Test #6:

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

input:

3000
88977868
431976112
480642599
3339407
7536134
433825556
898912134
423034201
789393381
622616604
...

output:

520573386

result:

ok 1 number(s): "520573386"

Test #7:

score: 10
Accepted
time: 264ms
memory: 21620kb

input:

200000
575599953
347584841
763322860
786706030
291249061
557489637
19661154
92850266
746422101
81163...

output:

767941915

result:

ok 1 number(s): "767941915"

Test #8:

score: 10
Accepted
time: 254ms
memory: 21616kb

input:

200000
213193834
292875878
381304070
239835857
274410721
940670416
58211570
862760907
769957319
8896...

output:

542862980

result:

ok 1 number(s): "542862980"

Test #9:

score: 10
Accepted
time: 267ms
memory: 21656kb

input:

200000
328984979
92574708
256369614
305711520
924334494
168590560
528918555
495141056
849357604
9597...

output:

425914056

result:

ok 1 number(s): "425914056"

Test #10:

score: 10
Accepted
time: 245ms
memory: 21520kb

input:

200000
94748359
776818954
340750244
684072673
886283932
737346853
273321095
526054467
694709118
8542...

output:

530472968

result:

ok 1 number(s): "530472968"

Extra Test:

score: 0
Extra Test Passed