这个题我们可以使用树状数组做

啥? 树状数组? 那个不是维护前缀和的东西吗?

各位看官,让我慢慢道来。


首先我们可以想到,对于一个询问$ [l,r] \(,只有\)[1,r]$中的数可能对这个询问有影响。

这就启示我们可以按照询问的右端点进行一波升序排序。

不过这和树状数组有什么关系呢?

对于同一个数\(x\),假设他在\([1,r]\) 出现了若干次。

对于我们的询问\([l,r]\)来说,只有最靠近\(r\)的\(x\)才最有可能影响到右端点为\(r\)的询问。

所以,我们就只用记录最靠近\(r\)的\(x\)的位置就行了。


那么我们怎么查询一个区间中不同的个数呢?

上文说道,我们只用记录最靠近当前右端点的每个数的位置了。

我们用一个树状数组维护一下。

树状数组中每一个位置就是输入中每一个数的位置。

对于一个数\(x\),他靠近我们当前遍历的右端点的最近一个位置,所对应的树状数组中的数值为1。不是最近的统统为0。

这样的话。对于一个询问\([l,r]\),我们计算一下树状数组中\([l,r]\)中的和。如果和是 \((r-l+1)\)的话,就说\([l,r]\)中所有数都是最靠近\(r\)的,如果不是的话.则说明有重复出现的。


真·凭直觉做题(@某月月赛T1)滑稽。我才不会告诉你我是太蒟蒻了导致什么都不会然后来刷黄题的吗?


类似的题目[SDOI2009]HH的项链](https://www.luogu.org/problemnew/show/P1972)

这个题被某姓毒名瘤字cz的人加强过(暗地%一%),普通莫队会被卡

//Lance1ot
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct node//树状数组
{
int data[101000];
int num;
void updata(int pos,int value)
{
while(pos<=num&&pos)
{
data[pos]+=value;
pos+=(pos&(-pos));
}
return ;
}
int sum(int pos)
{
int res=0;
while(pos)
{
res+=data[pos];
pos-=(pos&(-pos));
}
return res;
}
int check(int l,int r)
{
return sum(r)-sum(l-1);
}
};
node bit;
struct Query
{
int l;
int r;
int num;
}q[101000];//询问
bool compare(const Query &a,const Query &b)
{
return a.r<b.r;
}
int data[101000];//原数组
int ans[101000];
int last[101000];//最近一次出现的位置
int main()
{
int n,m;
scanf("%d%d",&n,&m);
bit.num=n;
for(int i=1;i<=n;i++)
scanf("%d",&data[i]);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&q[i].l,&q[i].r);
q[i].num=i;//离线处理,是第几个询问。
}
sort(q+1,q+1+m,compare);//排序
int Q=1;
for(int i=1;i<=n;i++)
{
bit.updata(last[data[i]],-1);//撤销上一个记录
bit.updata(i,1);//更新
last[data[i]]=i;//保存
while(q[Q].r==i&&Q<=m)//判断当前右端点是否和某个重合
{
if(bit.check(q[Q].l,q[Q].r)==(q[Q].r-q[Q].l+1))//因为是离线算法(fa♂),所以要保存答案
ans[q[Q].num]=1;
else
ans[q[Q].num]=0;
Q+=1;//写成while保险
}
}
for(int i=1;i<=m;i++)
{
if(ans[i]==1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}

速度还算可以吧。

P3901 【数列找不同】的更多相关文章

  1. P3901 数列找不同

    P3901 数列找不同 题目描述 现有数列 \(A_1,A_2,\cdots,A_N\) ,Q 个询问 \((L_i,R_i)\) , \(A_{Li} ,A_{Li+1},\cdots,A_{Ri} ...

  2. Luogu P3901 数列找不同

    由于技术原因,题目我贴不上了,大家点下面的链接自己去看吧^_^ P3901 数列找不同 这题第一眼看去,题面真短,有坑(flag) 在往下面看去,woc数据这么大,你要怎样. 现在一起想想想,超级侦探 ...

  3. 【刷题】洛谷 P3901 数列找不同

    题目描述 现有数列 \(A_1,A_2,\cdots,A_N\) ,Q 个询问 \((L_i,R_i)\) , \(A_{Li} ,A_{Li+1},\cdots,A_{Ri}\) 是否互不相同 输入 ...

  4. 洛谷P3901 数列找不同 [莫队]

    题目传送门 题目描述 现有数列 A_1,A_2,\cdots,A_NA1​,A2​,⋯,AN​ ,Q 个询问 (L_i,R_i)(Li​,Ri​) , A_{Li} ,A_{Li+1},\cdots, ...

  5. 洛谷 P3901 数列找不同(莫队)

    题目链接:https://www.luogu.com.cn/problem/P3901 这道题简单莫队模板题,然后$add$和$del$分别处理$vis[]$从$0-->1$和从$1--> ...

  6. 【题解】Luogu P3901 数列找不同

    我博客中对莫队的详细介绍 原题传送门 不错的莫队练手题 块数就直接取sqrt(n) 对所有询问进行排序 排序第一关键词:l所在第几块,第二关键词:r的位置 考虑Ai不大,暴力开数组 add时如果加之后 ...

  7. 【luogu P3901 数列找不同】 题解

    对于区间查询的问题,提供一种思路: 莫队. 莫队是处理区间问题的乱搞神器,尤其是对于离线查询问题,当然也可以做在线查询,比如带修莫队. 对于有的题,莫队是乱搞骗分,而在某些地方,莫队是正解. 这道题来 ...

  8. 洛谷P3901 数列找不同(莫队)

    传送门 我不管我不管我就是要用莫队 直接用莫队裸上 //minamoto #include<iostream> #include<cstdio> #include<alg ...

  9. 洛谷P3901 数列找不同(莫队水题)

    重温下手感,判断区间是否全是不同的数字有两种做法,一个长度为len的区间不同的数字,参见HH的项链,一种是区间众数,参见蒲公英,是水题没错了.明天搞数据库,然后继续自己的gre和训练计划 #inclu ...

  10. 【莫队】【P3901】 数列找不同

    Description 现在有一个长度为\(~n~\)的数列\(~A_1~,~A_2~\dots~A_n~\),\(~Q~\)个询问\(~[l_i~,~r_i]~\),每次询问区间内是否有元素相同 I ...

随机推荐

  1. Select语句完整的执行顺序

    Select语句完整的执行顺序:1.from子句组装来自不同数据源的数据:2.where子句基于指定的条件对记录行进行筛选:3.group by子句将数据划分为多个分组:4.使用聚集函数进行计算:5. ...

  2. python迭代器、生成器、列表推倒式

    创建迭代器: iter( ): 创建迭代器 next( ): 返回迭代器的下一个element(元素) 实例题: >>> list = [1,2,3,4] >>> ...

  3. HDFS读写文件流程

    读取: 写入:https://www.imooc.com/article/70527

  4. Cookie和Session入门(一)

    目录一)背景介绍二)Cookie机制三)Session机制四)两者比较五)参考资料链接一)背景介绍Cookie与Session是常用的会话跟踪技术.1.Cookie通过在客户端记录信息确定用户身份,S ...

  5. 2019.03.21 读书笔记 ==与Equals

    首先得出一个结论:==是比较变量内存的数据,Equals是值比较.但是他们都能被重写,所以object又增加了一个RefrenceEquals不可被重写,只比较数据: [ReliabilityCont ...

  6. Java基础15-数组实例学生管理系统

    import java.util.Scanner; public class Student{ public static void main(String[] args){ Scanner in=n ...

  7. [转]HTML字符实体(Character Entities),转义字符串(Escape Sequence)

    为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希 ...

  8. (转)轻松应对IDC机房带宽突然暴涨问题

    原文:http://blog.51cto.com/oldboy/909696

  9. contiki源码阅读之mmem.c

    上次我们说了list,这次我们就借着mmem.c的代码来用一下这个链表. 代码目录是./core/lib/mmem.c 结构体定义如下 struct mmem { struct mmem *next; ...

  10. Spring boot-(3) Spring Boot特性2

    1. 外部配置 Spring Boot支持外部配置,以便可以在不同的环境中使用相同的应用程序代码.可以使用properties文件,YAML文件,环境变量或命令行参数进行外部配置.可以使用@Value ...