正解:主席树

解题报告:

传送门!

一直在做$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. shell 解析json

    未完待续 ### 解析api json文件为csv文件 cd /api ` do id=$(echo ${i}|sed 's/.html//') echo -n "${id}|" ...

  2. oracle函数 INTERVAL c1 set1

    [功能]:变动日期时间数值 [参数]:c1为数字字符串或日期时间字符串,set1为日期参数 [参数表]:set1具体参照示例 [返回]:日期时间格式的数值,前面多个+号 以天或天更小单位时可用数值表达 ...

  3. celery 计划任务使用

    流程: 用户提交任务 --- > Celery --- > Broker 中间商(可以是数据库,redis) ---> 最后让celery 中的 worker 执行任务 1 单独使用 ...

  4. 正则 ?<= 和 ?= 用法 以及零宽断言等概念

    正则 ?<=  和 ?= 用法   参考网址:http://baike.baidu.com/link?url=2zORJF9GOjU8AkmuHDLz9cyl9yiL68PdW3frayzLwW ...

  5. Top 10 open source projects of 2015

    Top 10 open source projects of 2015 Posted 15 Dec 2015Jen Wike Huger (Red Hat)Feed 188 up 31 comment ...

  6. 提高github下载速度的方法【100%有效】可达到2MB/s

    因为大家都知道的原因,在国内从github上面下载代码的速度峰值通常都是20kB/s.这种速度对于那些小项目还好,而对于大一些的并且带有很多子模块的项目来讲就跟耽误时间.而常见的的方法无非就是修改HO ...

  7. HTML静态网页--图片热点

  8. java什么是跨平台性?原理是什么?

    所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行. 实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运行 ...

  9. Python图表绘制Matplotlib

    引入 import numpy as npimport pandas as pdimport matplotlib.pyplot as plt# 导入相关模块 使用 # 图表窗口1 → plt.sho ...

  10. H3C 环路避免机制六:触发更新