水题做的快了。。
A:复杂贪心,题解都是dp
C:水题
E:模拟
H:贪心,扫描线
I:贪心
K,L:水题
M:思维题
N:背包混合模板题
J:Poklon
给定一个包含 N 个自然数的数组。
接着需要回答 Q 次询问,每次询问输出区间 [L,R] 内恰好出现两次的自然数的数量。
Input
第一行,两个整数 N,Q,分别表示数组元素数量和询问次数。
第二行,N 个整数,表示数组中的元素。
接下来的 Q 行,每行两个整数 L,R,表示询问的区间。
新知识:离散化(不会的老知识也算新的bushi),离线,莫队。
离散化模板
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+1+n);
int len=unique(b+1,b+n+1)-(b+1);
rep(i,1,n){
a[i]=lower_bound(b+1,b+len+1,a[i])-b;
}
莫队模板
struct shu{
int l,r,id;
}q[500010];
int n,m,block,ans;
int a[N],sum[N],fans[N];
bool cmp(shu a,shu b){
if ((a.r/block)==(b.r/block)){
return a.l<b.l;
}
return a.r<b.r;
}
void add(int x)
void del(int x)
void work(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++){
cin>>q[i].l>>q[i].r;
q[i].id=i;
}
//block=n/(sqrt(m*2/3));
block=sqrt(n);
sort(q+1,q+m+1,cmp);
int l=0,r=0;
for(int i=1;i<=m;i++){
int ql=q[i].l,qr=q[i].r;
while(l<ql) del(l++);
while(r>qr) del(r--);
while(l>ql) add(--l);
while(r<qr) add(++r);
fans[q[i].id]=ans;
}
for(int i=1;i<=m;i++) cout<<fans[i]<<endl;
}
题解(被卡时间复杂度了)
#include <bits/stdc++.h>
#define int long long
#define CIO std::ios::sync_with_stdio(false)
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define nep(i, r, l) for (int i = r; i >= l; i--)
#define pii pair<int,int>
using namespace std;
const int N=5e5+5;
struct shu{
int l,r,id;
}q[500010];
int n,m,block,ans;
int a[N],sum[N],fans[N];
bool cmp(shu a,shu b){
if ((a.r/block)==(b.r/block)){
return a.l<b.l;
}
return a.r<b.r;
}
void add(int x){
if (sum[a[x]]==1) ans++;
if (sum[a[x]]==2) ans--;
sum[a[x]]++;
}
void del(int x){
if (sum[a[x]]==3) ans++;
if (sum[a[x]]==2) ans--;
sum[a[x]]--;
}
int b[N];
void work(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(b+1,b+1+n);
int len=unique(b+1,b+n+1)-(b+1);
rep(i,1,n){
a[i]=lower_bound(b+1,b+len+1,a[i])-b;
}
for(int i=1;i<=m;i++){
cin>>q[i].l>>q[i].r;
q[i].id=i;
}
//block=n/(sqrt(m*2/3));
block=sqrt(n);
sort(q+1,q+m+1,cmp);
int l=0,r=0;
for(int i=1;i<=m;i++){
int ql=q[i].l,qr=q[i].r;
while(l<ql) del(l++);
while(r>qr) del(r--);
while(l>ql) add(--l);
while(r<qr) add(++r);
fans[q[i].id]=ans;
}
for(int i=1;i<=m;i++) cout<<fans[i]<<endl;
}
signed main(){
CIO;
work();
return 0;
}