HDU4455

来源:互联网 发布:同步推mac 编辑:程序博客网 时间:2024/06/15 17:12

Substrings

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2581    Accepted Submission(s): 798


Problem Description
XXX has an array of length n. XXX wants to know that, for a given w, what is the sum of the distinct elements’ number in all substrings of length w. For example, the array is { 1 1 2 3 4 4 5 } When w = 3, there are five substrings of length 3. They are (1,1,2),(1,2,3),(2,3,4),(3,4,4),(4,4,5)
The distinct elements’ number of those five substrings are 2,3,3,2,2.
So the sum of the distinct elements’ number should be 2+3+3+2+2 = 12
 

Input
There are several test cases.
Each test case starts with a positive integer n, the array length. The next line consists of n integers a1,a2…an, representing the elements of the array.
Then there is a line with an integer Q, the number of queries. At last Q lines follow, each contains one integer w, the substring length of query. The input data ends with n = 0 For all cases, 0<w<=n<=106, 0<=Q<=104, 0<= a1,a2…an <=106
 

Output
For each test case, your program should output exactly Q lines, the sum of the distinct number in all substrings of length w for each query.
 

Sample Input
71 1 2 3 4 4 531230
 

Sample Output
71012
 

Source
2012 Asia Hangzhou Regional Contest
 

Recommend
We have carefully selected several similar problems for you:  5539 5538 5537 5536 5535 
 

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define LL long long#define N 1000000 + 10int n, a[N], pre[N];LL dp[N], cnt[N];int main(){    while(~scanf("%d", &n) && n)    {        memset(pre, 0, (n + 2) * sizeof(int));        memset(cnt, 0, (n + 2) * sizeof(int));        for(int i = 1; i <= n; i++)        {            scanf("%d", &a[i]);            cnt[i - pre[a[i]]]++;            pre[a[i]] = i;        }        for(int i = n - 1; i >= 1; i--) cnt[i] += cnt[i + 1];        memset(pre, 0, (n + 2) * sizeof(int));        dp[1] = n;        LL num = 1;        pre[a[n]] = 1;        for(int i = 2; i <= n; i++)            {                dp[i] = dp[i - 1] + cnt[i] - num;                if(pre[a[n - i + 1]] == 0)                {                    num++;                     pre[a[n - i + 1]]++;                }            }        int q, w;        scanf("%d", &q);        while(q--)        {            scanf("%d", &w);            printf("%I64d\n", dp[w]);        }    }    return 0;}


0 0