| 比赛 |
2026.8.26 |
评测结果 |
WWWWWWWAAAAAAAAWWTTTTTTTT |
| 题目名称 |
sort |
最终得分 |
32 |
| 用户昵称 |
zcx |
运行时间 |
2.717 s |
| 代码语言 |
C++ |
内存使用 |
27.68 MiB |
| 提交时间 |
2026-08-26 12:36:18 |
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
#define lson num * 2
#define rson num * 2 + 1
#define M ((L + R)>>1)
using namespace std;
const int N = 2e6 + 5;
struct tree{
int l,r,maxn;
}tr[N * 4] ;
int n,ans = 0,flag = 1;
int t[N],g[N];
void build(int num,int L,int R){
tr[num].l = L;tr[num].r = R;tr[num].maxn = 0;
if(L == R) return;
build(lson,L,M);build(rson,M + 1,R);
}
void add(int num,int x,int k){
tr[num].maxn = k;
if(tr[num].l == tr[num].r) return;
if(x <= tr[lson].r) add(lson,x,k);
else add(rson,x,k);
}
int ask(int num,int x,int y){
if(tr[num].l >= x && tr[num].r <= y) return tr[num].maxn;
int res = 0;
if(x <= tr[lson].r) res = ask(lson,x,y);
if(y >= tr[rson].l) res = max(res,ask(rson,x,y));
return res;
}
int c[N];
void add1(int x){
while(x <= n) {
c[x]++;
x += (x & -x);
}
}
int ask1(int x){
int ssum = 0;
while(x){
ssum += c[x];
x -= (x & -x);
}
return ssum;
}
signed main()
{
freopen("sorttros.in","r",stdin);
freopen("sorttros.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;build(1,1,n);
int xx;
for(int i = 1;i <= n;i++) cin>>xx,t[xx] = i;
for(int i = 1;i <= n;i++){
add(1,t[i],i);add1(t[i]);if(ask1(t[i]) == 3 && flag) ans++,flag = 0;
if(t[i] != n){
int k = ask(1,t[i] + 1,n);
if(k) g[i] = g[k] + 1;
}
if(t[i] != 1){
int k = ask(1,1,t[i] - 1);
if(k) ans++;
}
}
int top = 0;
for(int i = n;i >= 1;i--){
if(t[i] > t[top]) top = i;
ans += g[top];
}
cout<<ans<<'\n';
return 0;
}