$SP$3267 $DQUERY - D-query$ 主席树
正解:主席树
解题报告:
一直在做$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$
随机推荐
- shell 解析json
未完待续 ### 解析api json文件为csv文件 cd /api ` do id=$(echo ${i}|sed 's/.html//') echo -n "${id}|" ...
- oracle函数 INTERVAL c1 set1
[功能]:变动日期时间数值 [参数]:c1为数字字符串或日期时间字符串,set1为日期参数 [参数表]:set1具体参照示例 [返回]:日期时间格式的数值,前面多个+号 以天或天更小单位时可用数值表达 ...
- celery 计划任务使用
流程: 用户提交任务 --- > Celery --- > Broker 中间商(可以是数据库,redis) ---> 最后让celery 中的 worker 执行任务 1 单独使用 ...
- 正则 ?<= 和 ?= 用法 以及零宽断言等概念
正则 ?<= 和 ?= 用法 参考网址:http://baike.baidu.com/link?url=2zORJF9GOjU8AkmuHDLz9cyl9yiL68PdW3frayzLwW ...
- 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 ...
- 提高github下载速度的方法【100%有效】可达到2MB/s
因为大家都知道的原因,在国内从github上面下载代码的速度峰值通常都是20kB/s.这种速度对于那些小项目还好,而对于大一些的并且带有很多子模块的项目来讲就跟耽误时间.而常见的的方法无非就是修改HO ...
- HTML静态网页--图片热点
- java什么是跨平台性?原理是什么?
所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行. 实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运行 ...
- Python图表绘制Matplotlib
引入 import numpy as npimport pandas as pdimport matplotlib.pyplot as plt# 导入相关模块 使用 # 图表窗口1 → plt.sho ...
- H3C 环路避免机制六:触发更新