首先,本人能力有限,不一定能够讲得很清楚,但我尽力让读者看懂
先来看一个题目:
题目大意:给你一个长度为n的序列,序列中数字,有m个询问,每个询问区间为[l,r],求每个询问的区间内有多少个不同的数字
首先看到这道题目让你用最暴力的方法做你会怎么做,肯定是O(n*m)的暴力,代码如下
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cstdlib> #include<cmath> #include<algorithm> #define in(i) (i=read()) using namespace std; typedef long long lol; lol read() { lol ans=0,f=1; char i=getchar(); while(i<'0'||i>'9') {if(i=='-') f=-1; i=getchar();} while(i>='0'&&i<='9') {ans=(ans<<3)+(ans<<1)+i-'0';i=getchar();} return ans*f; } int c[500010]; int vis[1000010]; int main() { int n,m; in(n); for(int i=1;i<=n;i++) in(c[i]); in(m); for(int i=1;i<=m;i++) { memset(vis,0,sizeof(vis)); int ans=0; int l,r; in(l);in(r); for(int j=l;j<=r;j++) if(!vis[c[j]]) { ans++; vis[c[j]]=1; } cout<<ans<<endl; } }