首先,本人能力有限,不一定能够讲得很清楚,但我尽力让读者看懂

先来看一个题目:

HH的项链(洛谷1972)

题目大意:给你一个长度为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;
    }
}
View Code

相关文章:

  • 2022-01-08
猜你喜欢
  • 2022-12-23
  • 2021-07-24
  • 2022-01-04
  • 2022-12-23
  • 2021-08-07
  • 2021-09-01
相关资源
相似解决方案