QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#19040 | #1877. Matryoshka Dolls | DuanQingQiu | RE | 0ms | 0kb | C++11 | 3.5kb | 2022-01-27 20:03:20 | 2022-05-06 03:39:53 |
Judging History
answer
#include<bits/stdc++.h>
#include<iostream>
#define ll long long
#define back return
#define ri register int
using namespace std;
ll read()
{
ll x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
back x*f;
}
vector<ll> v;
ll n,m,k,id1[500005],a[500005],L[500005],R[500005],ans1[500005];
struct node
{
ll l,r,id;
}q[500005];
bool cmp1(node a,node b)
{
back a.l<b.l;
}
bool cmp2(node a,node b)
{
back a.r<b.r;
}
int main()
{
freopen("rrads2.in","r",stdin);
freopen("rrads.out","w",stdout);
n=read(),m=read();
for(ri i=1;i<=n;i++)
a[i]=read(),id1[a[i]]=i;
for(ri i=1;i<=m;i++)
q[i].l=read(),q[i].r=read(),q[i].id=i;
sort(q+1,q+m+1,cmp1);
int t=sqrt(m),len=m/t;
for(ri i=1;i<=t;i++)
L[i]=(i-1)*len+1,R[i]=i*len;
if(R[t]<m)
t++,L[t]=R[t-1]+1,R[t]=m;
for(ri i=1;i<=t;i++)
sort(q+L[i],q+R[i]+1,cmp2);
ll lastl=0,lastr=0,lastans=0;
for(ri i=1;i<=t;i++)
{
lastl=lastr=lastans=0;
v.clear();
for(ri j=L[i];j<=R[i];j++)
{
ans1[q[j].id]=lastans;
if(j==L[i])
{
for(ri k=q[j].l;k<=q[j].r;k++)
{
if(v.empty())
{
v.push_back(a[k]);
continue;
}
if(v[v.size()-1]<a[k])
{
v.push_back(a[k]);
ans1[q[j].id]+=abs(id1[a[k]]-id1[v[v.size()-2]]);
continue;
}
int lc=lower_bound(v.begin(),v.end(),a[k])-v.begin();
if(lc>0)
ans1[q[j].id]-=abs(id1[v[lc]]-id1[v[lc-1]]);
v.insert(v.begin()+lc,a[k]);
if(lc>0)
ans1[q[j].id]+=abs(id1[v[lc]]-id1[v[lc-1]]);
if(lc<v.size())
ans1[q[j].id]+=abs(id1[v[lc]]-id1[v[lc+1]]);
}
lastl=q[j].l,lastr=q[j].r,lastans=ans1[q[j].id];
continue;
}
if(lastl>=q[j].l)
for(ri k=q[j].l;k<lastl;k++)
{
if(v.empty())
{
v.push_back(a[k]);
continue;
}
if(v[v.size()-1]<a[k])
{
v.push_back(a[k]);
ans1[q[j].id]+=abs(id1[a[k]]-id1[v[v.size()-2]]);
continue;
}
int lc=lower_bound(v.begin(),v.end(),a[k])-v.begin();
if(lc>0)
ans1[q[j].id]-=abs(id1[v[lc]]-id1[v[lc-1]]);
v.insert(v.begin()+lc,a[k]);
if(lc>0)
ans1[q[j].id]+=abs(id1[v[lc]]-id1[v[lc-1]]);
if(lc<v.size()-1)
ans1[q[j].id]+=abs(id1[v[lc]]-id1[v[lc+1]]);
}
else
for(ri k=lastl;k<q[j].l;k++)
{
if(v.empty())
break;
int lc=lower_bound(v.begin(),v.end(),a[k])-v.begin();
if(lc>0)
ans1[q[j].id]-=abs(id1[v[lc]]-id1[v[lc-1]]);
if(lc<v.size()-1)
ans1[q[j].id]-=abs(id1[v[lc]]-id1[v[lc+1]]);
v.erase(v.begin()+lc);
if(lc>0&&lc<v.size())
ans1[q[j].id]+=abs(id1[v[lc]]-id1[v[lc-1]]);
}
for(ri k=max(q[j].l,lastr+1);k<=q[j].r;k++)
{
if(v.empty())
{
v.push_back(a[k]);
continue;
}
if(v[v.size()-1]<a[k])
{
v.push_back(a[k]);
ans1[q[j].id]+=abs(id1[a[k]]-id1[v[v.size()-2]]);
continue;
}
int lc=lower_bound(v.begin(),v.end(),a[k])-v.begin();
if(lc>0)
ans1[q[j].id]-=abs(id1[v[lc]]-id1[v[lc-1]]);
v.insert(v.begin()+lc,a[k]);
if(lc>0)
ans1[q[j].id]+=abs(id1[v[lc]]-id1[v[lc-1]]);
if(lc<v.size()-1)
ans1[q[j].id]+=abs(id1[v[lc]]-id1[v[lc+1]]);
}
lastl=q[j].l,lastr=q[j].r,lastans=ans1[q[j].id];
if(q[j].l==q[j].r)
ans1[q[j].id]=0,lastans=0;
}
}
for(ri i=1;i<=m;i++)
cout<<ans1[i]<<"\n";
back 0;
}
詳細信息
Test #1:
score: 0
Dangerous Syscalls
input:
5 5 1 5 2 4 3 1 5 1 4 1 3 1 2 1 1