UESTCoj 1256 昊昊喜欢运动 (打表&map

来源:互联网 发布:电脑网络专家在线咨询 编辑:程序博客网 时间:2024/05/07 11:44

昊昊喜欢运动

他N天内会参加M种运动(每种运动用一个[1,m]的整数表示)舍友有Q个问题,问昊昊第l天到第r天参加了多少种不同的运动。

输入:
输入两个数N, M (1≤N≤2000, 1≤M≤100);
输入N个数ai表示在第i天昊昊做了第ai类型的运动;
输入一个数Q(1≤Q≤10^6)
输入Q行 每行两个数 l, r(1≤l≤r≤n)

输出:
一共Q行
每一行输出一个数 表示昊昊在第l天到第r天一共做了多少种活动

样例输入:

5 31 2 3 2 231 42 41 5

样例输出:

323

直接打表

#include <cstdio>#include <queue>#include <cstring>#include <map>#include <algorithm>using namespace std;#define N 2000+100int arr[N];int dp[N][N];int vis[N];map<int,int> mp;int main(){    int n, m;    scanf("%d%d",&n,&m);    int ans = 0;    for(int i = 1;i <= n; i++) scanf("%d",&arr[i]);    for(int i = 1;i <= n; i++) {        memset(vis,0,sizeof(vis));        ans = 0;        for(int j = i;j <= n; j++) {            if(vis[arr[j]]==0) {                ans++;                vis[arr[j]]++;            }            dp[i][j] = ans;        }    }    int l, r, q;    scanf("%d",&q);    while(q--) {        scanf("%d%d",&l,&r);        printf("%d\n",dp[l][r]);    }return 0;}

用map插入

#include <cstdio>#include <queue>#include <cstring>#include <map>#include <algorithm>using namespace std;#define N 2000+100int arr[N];int dp[N][N];map<int,int> mp;int main(){    int n, m;    scanf("%d%d",&n,&m);    for(int i = 1;i <= n; i++) scanf("%d",&arr[i]);    for(int i = 1;i <= n; i++) {        mp.clear();        for(int j = i;j <= n; j++) {            mp[arr[j]]++;            dp[i][j] = mp.size();        }    }    int l, r, q;    scanf("%d",&q);    while(q--) {        scanf("%d%d",&l,&r);        printf("%d\n",dp[l][r]);    }return 0;}
0 0