题意 :

题目

给你一个序列 , 查询 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. java枚举(enum)

    1. 创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum (抽象类) 类的子类. enum AccountType { SAVING, FIXED, CURRE ...

  2. Mac Office 2016 破解

    官方最新版本office 是2016.15.38 此版本主要是修复了Excel内存损害漏洞. 官方下载的版本大小是1.67G,因为其他途径下载的版本,不确保是最新版本且为完整的版本.不知道我说的这个大 ...

  3. 打印流PrintStream

    打印流PrintStream PrintStream extends OutputStream 1.打印流的特点 只负责数据的输出,不负责数据的读取 与其他的流不同,打印流永远不会抛出IOExcept ...

  4. C# RestoreDirectory

    OpenFileDialog与SaveFileDialog都有RestoreDirectory属性,这个属性默认是false,打开一 个文件后,那么系统默认目录就会指向刚才打开的文件.如果设为true ...

  5. 比较好用的Copy代码到博客VS扩展工具

    这个工具叫做TrimCopy,可以避免拷贝出来的代码带空格,影响布局.

  6. Lua Doc生成工具

    Luadoc http://keplerproject.github.io/luadoc/ Overview LuaDoc is a documentation generator tool for ...

  7. 字符设备驱动(二)---key的使用:查询方式

    ---恢复内容开始--- 一.硬件电路 1.1 电路原理图 S1-S5共5个按键,其中,S2-S4为中断按键,S1为复位按键.S1直接为硬件复位电路,并不需要我们写进驱动. 单片机接口如下图: 由图中 ...

  8. mysql5.7安装(正确安装)实战

    一.二进制免编译包安装  参考:http://www.apelearn.com/bbs/forum.php?mod=viewthread&tid=10105&highlight=mys ...

  9. 向dnsrecord.txt 中添加 配置

    #!/bin/bash Ip_addr=`cat /etc/dnsrecord.txt |awk '{print $1}' |head -1` Check_dns_url(){ grep $1 /et ...

  10. vue使用tips记录

    用vue已经很久啦,这里记录一下一些我觉得比较实用的小tips: