正解:主席树

解题报告:

传送门!

一直在做$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. 是时候了解React Native了

    文章首发于简书,欢迎关注 随着科技的发展,手机开发也在向好的方向不停的转变.IOS和Android两大手机操作横空出世,称霸江湖.我们每开发一个手机软件最少都需要开发这两个终端. 两大操作系统都在不断 ...

  2. 10-1 body标签里面相关的标签(列表,表单,表格)

    一 列表标签<ul>,<ol>,<dl> <!DOCTYPE html> <html lang="en"> <he ...

  3. oracle函数 round(d1[,c1])

    [功能]:给出日期d1按期间(参数c1)四舍五入后的期间的第一天日期(与数值四舍五入意思相近) [参数]:d1日期型,c1为字符型(参数),c1默认为j(即最近0点日期) [参数表]:c1对应的参数表 ...

  4. 07Redis入门指南笔记(主从复制、哨兵)

    现实项目中通常需要若干台Redis服务器的支持: 结构上,单个 Redis 服务器会发生单点故障,而且一台服务器需要承受所有的请求负载.这就需要为数据生成多个副本并分配在不同的服务器上: 容量上,单个 ...

  5. uva 11665 Chinese Ink (几何+并查集)

    UVA 11665 随便给12的找了一道我没做过的几何基础题.这题挺简单的,不过uva上通过率挺低,通过人数也不多. 题意是要求给出的若干多边形组成多少个联通块.做的时候要注意这题是不能用double ...

  6. hdu 3805 Triangle Conjecture

    Problem - 3805 题意是给出边的长度的,求出边长相等的三角形,输出任意一种答案.边长是1~n的数,每个只能用一次. 其实比较容易可以看出,无论我们怎么操作,只要保持边长总和都是相邻整数就是 ...

  7. Nginx 日志记录post数据,并使用goaccess进行日志分析

    nginx日志默认不会记录post数据 在nginx配置文件的http节 log_format 日志格式标识 [escape=json] 日志格式 比如:日志格式标识设置为main,添加escape= ...

  8. HDU 1114 完全背包 HDU 2191 多重背包

    HDU 1114 Piggy-Bank 完全背包问题. 想想我们01背包是逆序遍历是为了保证什么? 保证每件物品只有两种状态,取或者不取.那么正序遍历呢? 这不就正好满足完全背包的条件了吗 means ...

  9. 2019-9-2-给博客添加rss订阅

    title author date CreateTime categories 给博客添加rss订阅 lindexi 2019-09-02 12:57:38 +0800 2018-2-13 17:23 ...

  10. laravel post提交数据时显示异常

    post提交数据时候显示如下: The page has expired due to inactivity. Please refresh and try again 这是由于在laravel框架中 ...