题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4455
题目大意:
给定一个长为n(n<=10^6)的数组,数组中的数大于0小于10^6
询问q次,询问长度为w的子数组(连续的)的权值和,子数组的权值为其数组中的不同元素的个数.
题目思路:
拿样例写一下
1: {1} , {1} , {2} , {3} , {4} , {4} , {5}
2: {1,1} , {1,2} , {2,3} , {3,4} , {4,4} , {4,5}
3: {1,1,2} , {1,2,3} , {2,3,4} , {3,4,4} , {4,4,5}
4: {1,1,2,3} , {1,2,3,4} , {2,3,4,4} , {3,4,4,5}
...
容易发现可以得出一个发现:
长度为w的值肯定包含长度为w-1的值减去最后一个字数组的权值和
例:
2: {1,1} , {1,2} , {2,3} , {3,4} , {4,4} , {4,5}
3: {1,1,2} , {1,2,3} , {2,3,4} , {3,4,4} , {4,4,5}
dp[3
] = dp[2] - 权值[{4,5}] + ?
而'?'就表示添加上那些标蓝色的数之后要添加的值.
设某个标蓝色的数为a[i],另外一个和它相等的且和它最近的数为a[j],且i>j
如果i-j>w的话那么添上这个标蓝的数就可以使得dp[w]+1
所以我们只要求出cnt[dis]即可,dis既某数离在它之前且相等的且和它最近的数的距离.
代码:
#include
#include
#include
#include
#include
#include
#include
#include