正解:主席树

解题报告:

传送门!

一直在做$dp$题好久没做做别的了,,,所以来做点儿别的练练手,,,不然以前学的全忘了要/$kk$

然后这题好像可以莫队/主席树/线段树/树状数组?

我就先只港下主席树的辣$QAQ$

考虑先预处理,给第$i$个数就记录下它的上一次出现的位置$lst_{i}$,然后现在询问就变成了,问$[l,r]$内所有$lst_{i}<l$的数量

然后接下来先考虑如果询问的是$[1,r]$怎么做鸭$QAQ$?就先开个值域线段树,然后查询$[1,l)$的和就好嘛

然后现在变成询问$[l,r]$?于是就考虑变成主席树?然后就做完了鸭$QwQ$

昂然后有个算是小技巧趴,,,

就本来这个值域线段树的范围是$[0,r)$?于是考虑对$lst_{i},l,r$全都+1鸭,这样就方便维护些是趴$QwQ$

然后就做完啦啦啦啦啦啦$QwQ$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=+,M=1e6+;
int n,pre[M],lst[N],q,rt[N],nw_nod;
struct nod{int ls,rs,dat,l,r;}tr[N*]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il int modify(ri x,ri l,ri r,ri dat)
{
ri nw=++nw_nod;tr[nw]=tr[x];++tr[nw].dat;tr[nw].l=l;tr[nw].r=r;if(l==r)return nw;
ri mid=(l+r)>>;
if(dat<=mid)tr[nw].ls=modify(tr[x].ls,l,mid,dat);else tr[nw].rs=modify(tr[x].rs,mid+,r,dat);
return nw;
}
il int query(ri rt_l,ri rt_r,ri l,ri r,ri dat)
{
// printf("rt_l=%d rt_r=%d l=%d r=%d dat=%d\n{\n",rt_l,rt_r,l,r,dat);
ri ret;
if(l==r)ret=tr[rt_r].dat-tr[rt_l].dat;
else
{
ri mid=(l+r)>>;
if(dat<=mid)ret=query(tr[rt_l].ls,tr[rt_r].ls,l,mid,dat)+tr[tr[rt_r].rs].dat-tr[tr[rt_l].rs].dat;
else ret=query(tr[rt_l].rs,tr[rt_r].rs,mid+,r,dat);
}
// printf("ret=%d\n}\n",ret);
return ret;
}
il void print(ri x)
{
printf(" tr[%d].ls=%d,rs=%d,dat=%d l=%d r=%d\n",x,tr[x].ls,tr[x].rs,tr[x].dat,tr[x].l,tr[x].r);
if(tr[x].ls)print(tr[x].ls);if(tr[x].rs)print(tr[x].rs);
} int main()
{
// freopen("sp3267.in","r",stdin);freopen("sp3267.out","w",stdout);
n=read();rp(i,,n){ri x=read();lst[i]=pre[x],pre[x]=i;}
rp(i,,n)rt[i]=modify(rt[i-],,n,lst[i]+);
// rp(i,1,n)printf("%d ",lst[i]+1);printf("\n");
// rp(i,1,n)printf("\n\n new root:%d\n",i),print(rt[i]);
// printf("\n\n=====end=====\n\n");
q=read();while(q--){ri l=read(),r=read();printf("%d\n",(r-l+)-query(rt[l-],rt[r],,n,l+));}
return ;
}

放下$code$鸭$QwQ$

随机推荐

  1. jmter对于函数的处理

    1.获取当天的时间函数 ${__time(yyyy-MM-dd_HH-mm-ss)} 2.获取随机函数 ${__Random(100,300,)} 3.查看结果数

  2. BT17破解软件

             大家好我QQ是1617089375 有非常多网友非常好奇新版BT17无线网破解软件究竟怎么样.无图无真相,所以我上传给大家看看,眼下视频正在录制.稍后也会把相应的视频公布到网上.因为 ...

  3. Python基础:27执行环境

    一:可调用对象 可调用对象,是任何能通过函数操作符“()”来调用的对象.Python 有4 种可调用对象:函数,方法,类,以及一些类的实例. 1:函数 python 有 3 种不同类型的函数对象. a ...

  4. protobuf DNK下的编译

    protobuffer 编译配置 mkdir -p ./cmake/build cd ./cmake/build cmake \ -Dprotobuf_BUILD_SHARED_LIBS=OFF \ ...

  5. eclipse maven项目导出所使用的jar包

    在eclipse中定位到maven项目的pom.xml文件右击pom.xml文件,选择Run As-->Maven build…在打开的页面中,GOLAS栏输入“dependency:copy- ...

  6. H3C Comware的作用

  7. H3C 广域网的作用

  8. 手动实现如何从H264流中提取SPS/PPS信息

    1,代码比较简单,可以直接用了.流的第一个NALU一定是SPS void get_sps_pps_nalu(uint8_t *data, int len, std::vector<uint8_t ...

  9. 微信小程序中 不点击picker 点击一个button 怎么调用picker 弹出选择框

    把按钮放在picker区域里就好了 picker本身就是一个区域 <picker mode = "selector" class='info' bindchange=&quo ...

  10. java 集合类 & 容器

    为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就要对对象进行存储,集合就是存储对象最常用的一种方式. 数组和集合类同是容器,有何不同? 数组虽然也可以存储 ...