1 条题解
-
0
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using
namespace
std;
const
int
N=2e5+10;
int
n,a[N],l[N],s[N],w[N<<2];
set<
int
> pre;
void
Change(
int
x,
int
L,
int
R,
int
pos,
int
val){
w[x]=val;
if
(L==R)
return
;
int
mid=(L+R)>>1;
if
(pos<=mid)Change(x*2,L,mid,pos,val);
else
Change(x*2+1,mid+1,R,pos,val);
return
;
}
int
Ask(
int
x,
int
L,
int
R,
int
l,
int
r){
if
(L==l&&R==r)
return
w[x];
int
mid=(L+R)>>1;
if
(r<=mid)
return
Ask(x*2,L,mid,l,r);
if
(l>mid)
return
Ask(x*2+1,mid+1,R,l,r);
return
min(Ask(x*2,L,mid,l,mid),Ask(x*2+1,mid+1,R,mid+1,r));
}
int
main()
{
scanf
(
"%d"
,&n);
pre.insert(0);pre.insert(n+1);
for
(
int
i=1;i<=n;i++){
scanf
(
"%d"
,&a[i]);
l[i]=*(--pre.upper_bound(a[i]));
pre.insert(a[i]);
}
for
(
int
i=0;i<=n+1;i++)
Change(1,0,n+1,i,n+1);
for
(
int
i=n;i>=1;i--){
int
k=a[Ask(1,0,n+1,l[i],a[i])];
if
(k){
s[a[Ask(1,0,n+1,l[i],a[i])]]++;
s[a[i]]--;
}
Change(1,0,n+1,a[i],i);
}
for
(
int
i=1;i<=n;i++)s[i]+=s[i-1];
for
(
int
i=0;i<=n;i++)
printf
(
"%d\n"
,s[i]);
return
0;
}
- 1
信息
- ID
- 7128
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 3
- 已通过
- 2
- 上传者