Description

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

Input

第一行有两个整数\(~N,Q~\),

第二行有\(~n~\)个整数,代表这个序列

以下\(~Q~\)行每行两个整数,代表询问区间

Output

对每个询问输出一行\(~Yes~\)或\(~No~\)。

Hint

\(Forall:\)

\(1~\leq~n~,~Q~\leq~10^5~,~1~\leq~A_i~\leq~N~,~1~\leq~l_i~\leq~r_i~\leq~N\)

Solution

看到这题发现可以用莫队做。然鹅统计区间出现次数平方的题写腻了,而开桶和位向量的做法又很麻烦,于是我就YY了一个更加麻烦的做法。

发现我们可以在莫队维护区间信息的时候维护区间中所有元素出现次数之积。因为乘1等价于没有乘,我们对于没有出现的元素也乘1。这个值在指针移动时是支持修改的:只要在去掉该位置贡献的时候除掉当前的出现次数,然后将这个位置的出现次数\(-1\),再乘回去即可。增加一个位置贡献的方法同理。当询问的区间出现次数积为\(1\)时,即为没有出现重复,否则为出现重复。

但是考虑这么做在极端数据,比如前\(\frac{n}{2}\)个数出现了\(2\)次,后\(\frac{n}{2}\)个数没有出现的时候,积是\(2^{\frac{n}{2}}\)次方,显然存不下。这时考虑NOIP2014解方程,我们只需要对多个形如1******7的大质数取模,当所有取模后的答案都为\(1\)是,我们认为积是\(1\),否则积显然不是\(1\)。

于是先\(O(n)\)筛一下逆元再莫队就好了。

Code

这个代码写的好丑啊……其实可以美化美化然而我懒得写了

#include<cmath>
#include<cstdio>
#include<algorithm>
#ifdef ONLINE_JUDGE
#define puts(o) \
puts("I am a cheater!")
#define freopen(a,b,c)
#endif
#define rg register
#define ci const int
#define cl const long long typedef long long int ll; template <typename T>
inline void qr(T &x) {
rg char ch=getchar(),lst=' ';
while((ch > '9') || (ch < '0')) lst=ch,ch=getchar();
while((ch >= '0') && (ch <= '9')) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
if(lst == '-') x=-x;
} namespace IO {
char buf[120];
} template <typename T>
inline void qw(T x,const char aft,const bool pt) {
if(x < 0) {x=-x,putchar('-');}
rg int top=0;
do {IO::buf[++top]=x%10+'0';} while(x/=10);
while(top) putchar(IO::buf[top--]);
if(pt) putchar(aft);
} const int maxn = 100010;
const int ccnt = 6; int n,q;
int MU[maxn],belong[maxn],bk[maxn];
int inv[8][maxn]; struct Ask {
int l,r,num;
bool ans;
inline bool operator<(const Ask &_others) const {
if(belong[this->l] != belong[_others.l]) return this->l < _others.l;
if(belong[this->l] & 1) return this->r < _others.r;
else return this->r > _others.r;
}
};
Ask ask[maxn]; inline bool cmp(const Ask &_a,const Ask &_b) {
return _a.num < _b.num;
} struct C {
int mod;
int ans;
C(int _x=0) {mod=_x,ans=1;}
};
C CU[8]; void GetInv(ci,ci); int main() {
freopen("1.in","r",stdin);
qr(n);qr(q);
for(rg int i=1;i<=n;++i) qr(MU[i]);
for(rg int i=1,sn=sqrt(n);i<=n;++i) belong[i]=i/sn;
for(rg int i=1;i<=q;++i) {
qr(ask[i].l);qr(ask[i].r);ask[i].num=i;
}
CU[1]=C(1000000007);CU[2]=C(1000000009);CU[3]=C(19260817);CU[4]=C(998244353);CU[5]=C(10000007);
for(int i=1;i<ccnt;++i) GetInv(CU[i].mod,i);
std::sort(ask+1,ask+1+q);
int prel=ask[1].l,prer=ask[1].l-1;
#define jd(o) (bk[MU[o]] > 1)
for(rg int i=1;i<=q;++i) {
int l=ask[i].l,r=ask[i].r;
while(prel < l) {
if(jd(prel)) {
for(rg int j=1;j<ccnt;++j) CU[j].ans=1ll*CU[j].ans*inv[j][bk[MU[prel]]]%CU[j].mod;
}
--bk[MU[prel]];
if(jd(prel)) {
for(rg int j=1;j<ccnt;++j) CU[j].ans=1ll*CU[j].ans*bk[MU[prel]]%CU[j].mod;
}
++prel;
}
while(prel > l) {
--prel;
if(jd(prel)) {
for(rg int j=1;j<ccnt;++j) CU[j].ans=1ll*CU[j].ans*inv[j][bk[MU[prel]]]%CU[j].mod;
}
++bk[MU[prel]];
if(jd(prel)) {
for(rg int j=1;j<ccnt;++j) CU[j].ans=1ll*CU[j].ans*bk[MU[prel]]%CU[j].mod;
}
}
while(prer < r) {
++prer;
if(jd(prer)) {
for(rg int j=1;j<ccnt;++j) CU[j].ans=1ll*CU[j].ans*inv[j][bk[MU[prer]]]%CU[j].mod;
}
++bk[MU[prer]];
if((jd(prer))) {
for(rg int j=1;j<ccnt;++j) CU[j].ans=1ll*CU[j].ans*bk[MU[prer]]%CU[j].mod;
}
}
while(prer > r) {
if(jd(prer)) {
for(rg int j=1;j<ccnt;++j) CU[j].ans=1ll*CU[j].ans*inv[j][bk[MU[prer]]]%CU[j].mod;
}
--bk[MU[prer]];
if(jd(prer)) {
for(rg int j=1;j<ccnt;++j) CU[j].ans=1ll*CU[j].ans*bk[MU[prer]]%CU[j].mod;
}
--prer;
}
bool _ans=true;
for(rg int j=1;j<ccnt;++j) if(CU[j].ans != 1) {
_ans=false;break;
}
ask[i].ans=_ans;
}
#undef jd
std::sort(ask+1,ask+1+q,cmp);
for(rg int i=1;i<=q;++i)
if(ask[i].ans) puts("Yes");
else puts("No");
return 0;
} void GetInv(ci mod,ci cur) {
inv[cur][1]=1;
for(rg int i=2;i<=n;++i) inv[cur][i]=1ll*(mod-mod/i)*inv[cur][mod%i]%mod;
}

Summary

貌似这次没啥好summary的

【莫队】【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_NA1​,A2​,⋯,AN​ ,Q 个询问 (L_i,R_i)(Li​,Ri​) , A_{Li} ,A_{Li+1},\cdots, ...

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

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

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

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

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

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

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

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

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

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

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

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

  10. Different Integers(牛客多校第一场+莫队做法)

    题目链接:https://www.nowcoder.com/acm/contest/139/J 题目: 题意:给你n个数,q次查询,对于每次查询得l,r,求1~l和r~n元素得种类. 莫队思路:1.将 ...

随机推荐

  1. 英特尔® 实感™ 摄像头 (F200) 应用如何实现最佳用户体验

    英特尔开发人员专区原文 由于视频不能直接嵌入, 请点击视频标题观看.谢谢. 英特尔® 实感™ 技术支持我们重新定义如何与计算设备交互,包括允许用户通过手势自然交互. 为了帮助大家了解使用英特尔® 实感 ...

  2. mysql 无法启动,错误1067,进程意外终止

    在做项目启动mysql数据库时,经常出现 这个错误,今天总结一下 //查看了网上很多的方法,都不适用,但或许对你适用.ps:网上只提供了怎么解决这个问题,但是没有将怎么去发现问题,对症下药才是王道.而 ...

  3. Matplotlib用法

    一 环境安装 Make sure you have installed numpy. 先安装np pip install matplotlib (Python2.X) pip3 install mat ...

  4. asp.net的forms身份验证 单用户身份验证

    asp.net的forms身份验证  单用户身份验证 首先要配置Web.config文件 <system.web> <authentication mode="Forms& ...

  5. Web安全入门书籍推荐

    <Web应用安全权威指南> 链接:https://pan.baidu.com/s/1wZgv3c9jhWm1bAUHZw3gEg 提取码:teqj <黑客攻防技术宝典__Web实战篇 ...

  6. c# ms chart 控件使用方法

    第一个简单的chart: spline// Create new data series and set it's visualattributes       Series series = new ...

  7. 深度系统(deepin)与win10双系统切换设置

    之前在win10下安装了深度系统,我不知道其他人在双系统切换的时候是否需要更改BIOS参数,我根据我的实际情况给出双系统切换设置的解决方案. 1.开机后进入选项System setup 2.按照下图选 ...

  8. 王者荣耀交流协会 - 第6次Scrum会议(第二周)

    Scrum master :刘耀泽 工作照片: 照片由刘耀泽(本人)拍摄,组内成员刘耀泽,高远博,王磊,王玉玲,王超,任思佳,袁玥全部到齐. 时间跨度: 2017年10月25日 17:00 — 17: ...

  9. 按照Right-BICEP要求设计的测试用例

    测试用例: 测试方法:Right-BICEP 测试要求: Right-结果是否正确? B-是否所有的边界条件都是正确的? P-是否满足性能要求? 题目是否有重复? 数量是否可定制? 数值范围是否可定制 ...

  10. OOP 2.2 构造函数

    1.概念 成员函数的一种 名字与类名相同,可以有参数,没有返回值(void也不行) 作用:对对象进行初始化,如给成员函数赋初始值 如果定义时没有构造函数,则编译器生成一个默认无参数的构造函数 默认构造 ...