正解:主席树

解题报告:

传送门!

一直在做$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. JavaScript原型链中toString()方法输出alert()和console.log()得到不同的结果

    <script language="javascript"> function myObj(){ var total = 0; } myObj.prototype.ad ...

  2. Google 各国地址

    google各国域名大全 香港www.google.com.hk 台湾www.google.com.tw 日本www.google.co.jp 中国www.google.cn 韩国www.google ...

  3. 微信小程序 mode 的几种模式

    mode="aspectFill" mode 有效值: mode 有 13 种模式,其中 4 种是缩放模式,9 种是裁剪模式. 模式 值 说明缩放 scaleToFill 不保持纵 ...

  4. Docker 领衔 OpenSource.com 2014十佳开源软件排行榜

    Docker 领衔 OpenSource.com 2014十佳开源软件排行榜 每年 Opensource.com 都会收集最佳的十个开源软件,今年也不例外,废话不多说,直接进入主题. Docker 应 ...

  5. Python 进阶02 文本文件的输入输出

    Python 具有基本的文本文件读写功能,Python的标准库提供有更丰富的读写功能. 文本文件的读写主要通过open()所构建的文件对象来实现 创建文件对象 我们打开一个文件,并适用一个对象来表示该 ...

  6. 记一次sublime text3更新 注册码失效问题和永久解决~

    前言: 一段时间不用sublime,打开提示我更新,不知怎么想的鬼使神差给点了~ 然后喵喵喵??? 取消 一会又出来了 受不了啦 搞事开整~ 正文: 本想直接找个注册码完事,奈何好多都用不了,想着再更 ...

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

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

  8. Python--day69--ORM多对多查询

    ManyToManyField class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器. 它存在于下面两种情况: 外键关系的反向查询 ...

  9. poj 3181 Dollar Dayz(完全背包)

    Dollar Dayz Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5419   Accepted: 2054 Descr ...

  10. WOE:信用评分卡模型中的变量离散化方法(生存分析)

    WOE:信用评分卡模型中的变量离散化方法 2016-03-21 生存分析 在做回归模型时,因临床需要常常需要对连续性的变量离散化,诸如年龄,分为老.中.青三组,一般的做法是ROC或者X-tile等等. ...