HDU 4455
题意 :
给你一个序列 , 查询 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的更多相关文章
- hdu 4455 Substrings(计数)
题目链接:hdu 4455 Substrings 题目大意:给出n,然后是n个数a[1] ~ a[n], 然后是q次询问,每次询问给出w, 将数列a[i]分成若干个连续且元素数量为w的集合,计算每个集 ...
- 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 ...
- HDU 4455.Substrings
Substrings Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 4455 Substrings --递推+树状数组优化
题意: 给一串数字,给q个查询,每次查询长度为w的所有子串中不同的数字个数之和为多少. 解法:先预处理出D[i]为: 每个值的左边和它相等的值的位置和它的位置的距离,如果左边没有与他相同的,设为n+8 ...
- hdu 4455 动态规划
思路:用sum[i]表示区间长度为i的不相同数的个数和,假使所有的数都不相同,那么sum[i]=sum[i-1]+n-i+1-later[i-1]; later[i-1]表示的是序列最后面的长度为i- ...
- HDU 4455(dp)
题意:给定一个序列ai,个数为n.再给出一系列w:对于每个w,求序列中,所有长度为w的连续子串中的权值和,子串权值为子串中不同数的个数. 思路:动态规划,用dp[w]表示当前长度为w的时候的权值和.显 ...
- hdu 4455 Substrings(找规律&DP)
Substrings Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- hdu 4455 Substrings (DP 预处理思路)
Substrings Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 4455 Substrings[多重dp]
Substrings Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- MVC Repository模式
近来发现很多ASP.NET MVC的例子中都使用了Repository模式,比如Oxite,ScottGu最近发布的免费的ASP.NET MVC教程都使用了该模式.就简单看了下. 在<企业架构模 ...
- invalid location of tag 解决办法
转自:https://blog.csdn.net/tanzuai/article/details/41896579 在jsp页面使用标签过程中有时候不注意规则的话,eclipse会提示一些错误,下面针 ...
- Spark整合HBase,Hive
背景: 场景需求1:使用spark直接读取HBASE表 场景需求2:使用spark直接读取HIVE表 场景需求3:使用spark读取HBASE在Hive的外表 摘要: 1.背景 2.提交脚本 内容 场 ...
- Python中late-binding-closures
2018-01-03 @望京 示例1 >>> b = [] >>> for i in range(5): ... b.append(lambda :i) ... & ...
- 缓存dom查询
为了提高性能缓存dom查询; 页面效果:
- [C++]基于Curses库的实时系统监测可视化系统-2017-12-09 15-07-42
Congratulations 0.0 技术记录 [1] [C++]Linux之Ubuntu下编译C程序出现错误:“ stray ‘\302'或者'\240' in program”的解决方案 [2 ...
- byte数组和int之间相互转化的方法
Java中byte数组和int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送者接收的数据都是byte数组,但是int类型是4个byte组成的,如何把一个整形in ...
- 小程序view排版
<view class="bc"> <view> <text bc_text>demo</text> </view> & ...
- 基于netty实现单聊、群聊功能
学习资料 https://juejin.im/book/5b4bc28bf265da0f60130116/section/5b6a1a9cf265da0f87595521 收获: 转载 1. Nett ...
- 阿里云IoT物联网平台入门教程
参考链接:https://www.geek-workshop.com/thread-37883-1-1.html