比赛 |
4043级NOIP2022欢乐赛8th |
评测结果 |
AAAAAATTTTTTTTTTTTAT |
题目名称 |
No Time to Dry |
最终得分 |
35 |
用户昵称 |
ZRQ |
运行时间 |
14.757 s |
代码语言 |
C++ |
内存使用 |
22.29 MiB |
提交时间 |
2022-11-21 21:45:02 |
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=200005;
struct qs
{
int id,l,r;
}q[N];
int n,m,a[N],ans[N],cnt[N],res,len,st[N][20],t[N],pre[N],nxt[N],l,r;
inline bool cmp1(qs a,qs b)
{
if(a.l/len==b.l/len) return a.r<b.r;
return a.l<b.l;
}
int query(int l,int r)
{
int k=0;
while((1<<(k+1))<r-l+1) ++k;
return min(st[l][k],st[r-(1<<k)+1][k]);
}
void add(int i,int k)
{
int j;
if(k==1) j=pre[i];
else if(k==0) j=nxt[i];
if(!j||j<l||j>r)
{
++res;
return ;
}
int x=query(min(i,j),max(i,j));
if(x<a[i]) ++res;
}
void del(int i,int k)
{
int j;
if(k==1) j=pre[i];
else if(k==0) j=nxt[i];
if(!j||j<l||j>r)
{
--res;
return ;
}
int x=query(min(i,j),max(i,j));
if(x<a[i]) --res;
}
int main()
{
freopen("usaco_21Feb_dry.in","r",stdin);
freopen("usaco_21Feb_dry.out","w",stdout);
scanf("%d%d",&n,&m);
len=sqrt(n);
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
st[i][0]=a[i];
pre[i]=t[a[i]];
t[a[i]]=i;
}
for(int i=1;i<=n;++i)
if(pre[i])
nxt[pre[i]]=i;
for(int i=1;i<=m;++i) scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;
for(int i=1;i<=18;++i)
for(int j=1;j+(1<<i)-1<=n;++j)
st[j][i]=min(st[j][i-1],st[j+(1<<(i-1))][i-1]);
sort(q+1,q+1+m,cmp1);
l=1,r=0;
for(int i=1;i<=m;++i)
{
while(r<q[i].r) add(++r,1);
while(r>q[i].r) del(r--,1);
while(l<q[i].l) del(l++,0);
while(l>q[i].l) add(--l,0);
ans[q[i].id]=res;
}
for(int i=1;i<=m;++i) printf("%d\n",ans[i]);
return 0;
}