ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#199158 | #26. T1 | snow_trace | 100 | 1038ms | 21656kb | C++11 | 3.5kb | 2023-12-05 11:20:23 | 2023-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