机房里整一道题改了一下莫队竟然没过!
我不理解
题意大概就是给定l,r问l,r区间内有没有重复的数字
谢谢大佬qwp
一年一度的摄影大赛又开始报名了,作为摄影爱好者的FJ怎能错过这样的好机会,自然报名参加了。FJ最擅长的就是给奶牛拍照了。他来到农场观看他的 N 头奶牛,选择最完美的场景来进行拍照。奶牛们看到FJ拿着相机来为她们拍照,欣喜若狂。 FJ的 N 头奶牛有着不同的品种,同一品种的奶牛流淌着相同的血液,有着独立的性格,每头奶牛都想在FJ的照片中代表自己所属的品种展现完美的自我。同一品种的多头奶牛在一起拍照,由于难以凸显出该品种到底哪头奶牛最帅气(漂亮),所以同一品种的奶牛在一张照片里面出现多个(>1头),那么该品种的几头奶牛就会发生"冲突"。 聪明的FJ就想看看给定区间里面的奶牛是否可以拍照,如果有冲突,就木有办法拍照了,如果没有冲突的话就可以给这个区间里面的奶牛们拍一张照片,满足奶牛的愿望。
第 1 行输入2个整数N Q;N表示奶牛数量,Q表示询问的次数; 第 2 行给出N个整数,第 i 个整数 Ai代表第 i 头奶牛所属的品种; 接下来是Q行,每行输入2个整数L R;表示FJ询问从A[L],A[L+1],...,A[R]这些奶牛是否可以拍照;
输出共Q行,对每个询问输出一行,如果可以拍照输出"Yes";否则输出"No",不包含引号。
4 2
1 2 3 2
1 3
2 4
Yes
No
#include<bits/stdc++.h>
#define int long long
namespace IO {
#define int long long
#define gh getchar
inline int read(){char ch=gh();int x=0;bool t=0;while(ch<'0'||ch>'9') t|=ch=='-',ch=gh();while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=gh();return t?-x:x;}
inline char getc(){char ch=gh();while(ch<'a'||ch>'z') ch=gh();return ch;}
inline void write(int x){if(x < 0){putchar('-');x = -x;}if(x > 9){write(x / 10);}putchar((x % 10 + '0'));}
}
using namespace IO;
using namespace std;
int n, m, k;
int a[100001];
int cnt[100001];
int st[100001], ed[100010];
int belong[100001];
int ans[100001];
int eq;
int l = 1, r = 0, now = 0;
struct Node {
int l, r, id;
}q[100001];
void init(){
for(int i = 1; i <= eq; i++){
st[i] = n / eq * (i-1) + 1;
ed[i] = n / eq * i + 1;
}
for(int i = 1; i <= eq; i++){
for(int j = st[i]; j <= ed[i]; j++){
belong[j] = i;
}
}
}
bool cmp(Node a, Node b)
{
return (belong[a.l] ^ belong[b.l]) ? belong[a.l] < belong[b.l] : ((belong[a.l] & 1) ? a.r < b.r : a.r > b.r);
}
inline void del(int n){
cnt[a[n]]--;
if(cnt[a[n]] == 1)now--;
}
inline void add(int n){
cnt[a[n]]++;
if(cnt[a[n]] == 2) now++;
}
signed main(){
int n, m, k;
cin >> n >> m;
eq = sqrt(n);
for(int i = 1; i <= n; i++){
a[i] = read();
}
init();
for(int i = 1; i <= m; i++){
cin >> q[i].l >> q[i].r;
q[i].id = i;
}sort(q+1,q+1+m,cmp);
for(int i = 1; i <= n; i++){
while (l > q[i].l)
add(--l);
while (l < q[i].l)
del(l++);
while (r < q[i].r)
add(++r);
while (r > q[i].r)
del(r--);
ans[q[i].id] = now;
}
for(int i = 1; i <= m; i++){
if(ans[i] > 0)printf("No\n");
else printf("Yes\n");
}
}
为啥啊