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

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

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


首先我们可以想到,对于一个询问$ [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. Head First 设计模式笔记(适配器)

    1.定义: 将一个类的接口转换成客户期望的另外一个接口.适配器让原来不兼容的类可以合作无间. 例子:插座转接头. 2.类图: 3.说明: 埋坑 4.例子 埋坑

  2. stringstream的使用

    stringstream是 C++ 提供的另一个字串型的串流(stream)物件,和之前学过的iostream.fstream有类似的操作方式.要使用stringstream, 必须先加入这一行: # ...

  3. Boxes in a Line UVA - 12657 (双向链表)

    题目链接:https://vjudge.net/problem/UVA-12657 题目大意:输入n,m  代表有n个盒子 每个盒子最开始按1~n排成一行  m个操作, 1 x y  :把盒子x放到y ...

  4. CAD安装失败怎样卸载CAD 2016?错误提示某些产品无法安装

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  5. Kudu的配置(官网推荐的步骤)(Configuring Apache Kudu)

    不多说,直接上干货! http://kudu.apache.org/docs/configuration.html

  6. OpenCV细化算法简单解析

    细化算法它的原理也很简单: 我们对一副二值图像进行骨架提取,就是删除不需要的轮廓点,只保留其骨架点.假设一个像素点,我们定义该点为p1,则它的八邻域点p2->p9位置如下图所示,该算法考虑p1点 ...

  7. MahApps.Metro控件更換微軟視窗主題

    先來看一下微軟默認的視窗主題(左:Window)與MahApps.Metro的視窗主題(右:MetroWindow), Window   MetroWindow   MetroWindow似乎美觀多了 ...

  8. 控制input输入框中提示信息的显示和隐藏的方法

    在运用html+css+javascrpt进行页面制作时,我们往往会遇到一些影响用户体验,而又容易被我们忽视的小细节.比如,input输入框中的提示信息,怎样才能根据对象获得和失去焦点而实现其显示和隐 ...

  9. HDU——Cover——————【技巧】

    Cover Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  10. 【转载】了解CSS/CSS3原生变量var

    文章转载自:鑫空间鑫生活(https://www.zhangxinxu.com/) 原文链接:http://www.zhangxinxu.com/wordpress/?p=5804 内容摘要: 在任何 ...