首页 > 代码库 > HDU 4455 Substrings(预处理+dp)
HDU 4455 Substrings(预处理+dp)
题目大意:给你n个数字,然后m次查询,每次给你一个x,让你求出来1到x,2到x+1。。。不同数的和。
需要各种预处理,处理出来所有的间隔之间有多少相同的数字,处理出来最后一个被去掉的间隔有多少个不重复的数字。
dp[i] = dp[i-1]-S+T.S代表最后被略去的那个区间的不同的数,T代表新区间扩张之后每个区间增加的不同的数的和。
Substrings
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1983 Accepted Submission(s): 608
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
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
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
7 1 1 2 3 4 4 5 3 1 2 3 0
Sample Output
7 10 12
Source
2012 Asia Hangzhou Regional Contest
#include <algorithm> #include <iostream> #include <stdlib.h> #include <string.h> #include <iomanip> #include <stdio.h> #include <string> #include <queue> #include <cmath> #include <time.h> #include <stack> #include <map> #include <set> #define eps 1e-8 ///#define LL long long #define LL __int64 #define INF 0x3f3f3f #define PI 3.1415926535898 #define mod 1000000007 using namespace std; const int maxn = 1001000; int num[maxn]; int vis[maxn]; int f[maxn]; int p[maxn]; LL dp[maxn]; int main() { int n; while(~scanf("%d", &n) && n) { memset(vis, 0, sizeof(vis)); memset(p, 0, sizeof(p)); for(int i = 1; i <= n; i++) { scanf("%d", &num[i]); p[i-vis[num[i]]]++; vis[num[i]] = i; } memset(vis, 0, sizeof(vis)); f[1] = 1; vis[num[n]] = 1; for(int i = 2; i <= n; i++) { if(vis[num[n-i+1]]) { f[i] = f[i-1]; continue; } vis[num[n-i+1]] = 1; f[i] = f[i-1]+1; } dp[1] = n; int sum = n; for(int i = 2; i <= n; i++) { dp[i] = dp[i-1]-f[i-1]; sum -= p[i-1]; dp[i] += sum; } int m; scanf("%d",&m); for(int i = 1; i <= m; i++) { int x; scanf("%d",&x); printf("%I64d\n",dp[x]); } } return 0; }
HDU 4455 Substrings(预处理+dp)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。