题意 :

题目

给你一个序列 , 查询 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. vee-validate表单验证组件

    vee-validate是VUE的基于模板的验证框架,允许您验证输入并显示错误 安装 npm i vee-validate --save 引入 import Vue from 'vue'; impor ...

  2. keeping.py

    定时push+告警 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author : 71standby@gmail.com # Description ...

  3. HTTP status constants

    HTTP status constants value = ngx.HTTP_CONTINUE (100) (first added in the v0.9.20 release) value = n ...

  4. java定时器实现总结

    前言:Java定时器目前主要有3种实现方式:JDK组件,Spring Task,Quartz框架. 1. JDK组件(1) java.util.TimerTask MyTimerTask.java: ...

  5. 使用 Quartz.NET 实现作业串行执行

    Ø  前言 前两天,在公司的一个项目中编写 Windows 服务时,需求是当A服务运行完后,B服务才能运行,B服务运行后,C服务才能运行.因为B服务的数据依赖于A服务生成的数据,而C服务的数据又依赖于 ...

  6. Coding语言强弱类型且动静态类型简单解析。附图解

    话不多说,上图: (以下均以Java来说明) 对于语言的强弱类型: 1.强类型语言:通俗的点来讲,就是对于数据类型,如果开发者定义了一个int数据类型的变量,那么虚拟机就会特别坚定该变量为int,坚决 ...

  7. [C++]线性链表之单链表

    [文档整理系列] 线性链表之单链表 /* 问题描述:线性表____链表_____单链表 @date 2017-3-7 */ #include<iostream> using namespa ...

  8. nginx 基于uwsgi部署Django

    1.安装nginx yum install -y nginx(需要epel源) 2.安装环境 可以考虑使用虚拟化环境,本处不再使用 3.安装uwsgi yum groupinstall "D ...

  9. 第25月第26天 dispatch_group_t dispatch_semaphore_t

    1. dispatch_group_enter(group); dispatch_group_leave(group); dispatch_group_notify(group1, queue1,bl ...

  10. python之读写文件

    1. 读取文件数据,文件必须存在才可以读且如要读取的文件不和当前.py在同一个包下,需要特别指定此文件路径才行 f=open('test.txt',encoding='utf-8')#填写文件路径,打 ...