题意 :

题目

给你一个序列 , 查询 t ,问  序列 连续 长度为 t 的子区间 的不同数 的和

巧妙的动态规划

数据大, Dp可以 O(n)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
const int maxn = 1e6 +131;
typedef long long ll;
ll Dp[maxn]; ///总数
int Num[maxn]; /// 数列
int Suf[maxn]; /// 后 i 个数中不同的个数
int Flag[maxn]; /// 标记 数组
int Cnt[maxn]; /// 统计 两个相同的数 相间 i 有多少个。 int main()
{
int n, q;
int tmp;
while(~scanf("%d",&n) && n)
{
memset(Dp,0,sizeof(Dp));
memset(Suf,0,sizeof(Suf));
memset(Flag,0,sizeof(Flag));
memset(Cnt,0,sizeof(Cnt));
for(int i = 1; i <= n; ++i)
{ ///这里Flag数组标记Num【i】上一次出现的位置
scanf("%d",&Num[i]);
Cnt[i-Flag[Num[i]]]++; ///
Flag[Num[i]] = i; /// 更新位置
}
memset(Flag,0,sizeof(Flag));
Suf[1] = Flag[Num[n]] = 1; /// 这里Flag数组标记 Num【i】 在后 K个中是否出现过
for(int i = 2; i <= n; ++i) /// 方便统计 Suf 数组
{
if(Flag[Num[n-i+1]] == 0)
{
Flag[Num[n-i+1]] = 1;
Suf[i] = Suf[i-1]+ 1;
}else Suf[i] = Suf[i-1];
} int sum = n;
Dp[1] = n;
for(int i = 2; i <= n; ++i)
{
Dp[i] = Dp[i-1] - Suf[i-1]; /// Dp【i】 为 上一个 的总数 - 最后多出来的 Suf【i】
sum -= Cnt[i-1]; /// 然后 sum 减去 相距 i-1 的 重复次数,
Dp[i] += sum; /// Dp【i】 有多个子区间, 再 加上 sum;
}
scanf("%d",&q);
while(q--)
{
scanf("%d",&tmp);
printf("%lld\n",Dp[tmp]);
}
}
return 0;
}

HDU 4455的更多相关文章

  1. hdu 4455 Substrings(计数)

    题目链接:hdu 4455 Substrings 题目大意:给出n,然后是n个数a[1] ~ a[n], 然后是q次询问,每次询问给出w, 将数列a[i]分成若干个连续且元素数量为w的集合,计算每个集 ...

  2. Substrings 第37届ACM/ICPC 杭州赛区现场赛C题(hdu 4455)

    http://acm.hdu.edu.cn/showproblem.php?pid=4455 https://icpcarchive.ecs.baylor.edu/index.php?option=c ...

  3. HDU 4455.Substrings

    Substrings Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. HDU 4455 Substrings --递推+树状数组优化

    题意: 给一串数字,给q个查询,每次查询长度为w的所有子串中不同的数字个数之和为多少. 解法:先预处理出D[i]为: 每个值的左边和它相等的值的位置和它的位置的距离,如果左边没有与他相同的,设为n+8 ...

  5. hdu 4455 动态规划

    思路:用sum[i]表示区间长度为i的不相同数的个数和,假使所有的数都不相同,那么sum[i]=sum[i-1]+n-i+1-later[i-1]; later[i-1]表示的是序列最后面的长度为i- ...

  6. HDU 4455(dp)

    题意:给定一个序列ai,个数为n.再给出一系列w:对于每个w,求序列中,所有长度为w的连续子串中的权值和,子串权值为子串中不同数的个数. 思路:动态规划,用dp[w]表示当前长度为w的时候的权值和.显 ...

  7. hdu 4455 Substrings(找规律&DP)

    Substrings Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  8. hdu 4455 Substrings (DP 预处理思路)

    Substrings Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  9. HDU 4455 Substrings[多重dp]

    Substrings Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

随机推荐

  1. Echarts地图悬浮框显示多组series数据以及修改地图大小

    1.如何让echarts的地图悬浮框出现多组series数据? 2.如何更改地图默认的大小? <!DOCTYPE html> <html lang="en"> ...

  2. 向量空间模型(Vector Space Model)的理解

    1. 问题描述 给你若干篇文档,找出这些文档中最相似的两篇文档? 相似性,可以用距离来衡量.而在数学上,可使用余弦来计算两个向量的距离. \[cos(\vec a, \vec b)=\frac {\v ...

  3. springboot(十八):CORS方式实现跨域

    资料 https://www.cnblogs.com/toutou/p/9843588.html

  4. 基于时间的 SQL注入研究

    SQL注入攻击是业界一种非常流行的攻击方式,是由rfp在1998年<Phrack>杂志第54期上的“NT Web Technology Vulnerabilities”文章中首次提出的.时 ...

  5. tensorflow/core/kernels/conv_ops.cc:659] check failed: stream->parent()->getc

    tensorflow版本与cudnn版本不对应,如tensorflow-gpu==1.1.0,cudnn==6.0 升级tensorflow-gpu到更高版本

  6. mysql 创建事件

    mysql 事件说明: 创建事件CREATE EVENT 的语法如下:CREATE EVENT[IF NOT EXISTS] ------------------------------------- ...

  7. [C++]PAT乙级1009. 说反话 (17/20)

    /* 1009. 说反话 (20) 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式: 测试输入包含一个测试用例, 在一行内给出总长度不超过80的字符串. 字符串由若干单词和若干 ...

  8. ThinkPHP5基础学习

    一.目录与文件结构 二.控制器 三.数据库 四.模型 五.模板

  9. JQuery基本过滤器

  10. [css]将textarea前的文字设置在左上角

    在使用textarea的时候,默认前面的文字是在最下面的,好丑,然后百度了一下,要在textarea加上vertical-align:top的css属性 代码: <div class=" ...