题意 :

题目

给你一个序列 , 查询 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基础之反射---重要

    java反射: 反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)):   1:获取Class字节码文件对象的三种方式: /** ...

  2. 细说shiro之二:组件架构

    官网:https://shiro.apache.org/ Shiro主要组件包括:Subject,SecurityManager,Authenticator,Authorizer,SessionMan ...

  3. 【八】虚拟机工具 01 jps命令详解

    JPS 名称: jps - Java Virtual Machine Process Status Tool 命令用法: jps [options] [hostid] options:命令选项,用来对 ...

  4. memset赋值

    比较神奇的事情 可能和二进制有关系吧 #include<bits/stdc++.h> using namespace std; ]; int main(){ memset(f,,sizeo ...

  5. Linux/Windows双系统引导修复

    安装双系统建议先安装windows,然后在安装Linux,使用Linux(grub2)引导双系统 如果重新安装了windows,则无法引导进入linux,需要修复引导 在windows下安装easyB ...

  6. 第20月第17天 mvvm 多次点击push -ObjC

    1. 响应式库EasyReact建成后,为了能使其得到更好的利用,更好地降低使用的理解和学习成本,臧成威老师又带领团队开发了基于响应式的MVVM框架:EasyMVVM. https://www.jia ...

  7. vue组件导航栏动态添加class

  8. RocketMQ RPC

    (1)NameServer:在MQ集群中做的是做命名服务,更新和路由发现 broker服务: (2)Broker-Master:broker 消息主机服务器: (3)Broker-Slave:brok ...

  9. 如何在 JS 中嵌入大量 HTML 代码 --更新2017-10-10 16:37:09

    一.一般方式 方式1:\ 要写在标签后面,看例子 var longString = "\ ------------------------\ ------------------------ ...

  10. 7.4mybatis整合ehcache(mybatis无法实现分布式缓存必须和其他缓存框架整合)

    <\mybatis\day02\14查询缓存-二级缓存-整合ehcache.av> mybatis的缓存机制(一级缓存二级缓存和刷新缓存)和mybatis整合ehcache-- 这里有做本 ...