首页 > 其他分享 >完美区间(一种新思想)

完美区间(一种新思想)

时间:2024-08-15 19:38:18浏览次数:5  
标签:思想 宝石 完美 合法 int 枚举 区间

第3题     完美区间 查看测评数据信息

有n个五颜六色的宝石挂成一排。小明觉得,对于每个宝石来说,只有它和前一个颜色相同的宝石距离不超过K才是好看的。(当这个宝石之前没有和他颜色相同的宝石时,这个宝石也勉强算好看吧,不然难看的宝石也太多了,小明如是说。)小明需要选取一个区间的宝石来布置他屋子,所以他需要选择一个完美的区间,即将这个区间截取出来之后满足每个宝石都是好看的。现在对于这一排宝石,小明想知道,有多少个完美的区间。

输入格式

 

第一行输入两个数n,k

第二行输入n个整数color[i],color[i]表示第i个宝石的颜色

1<=n,k,color[i]<=1e5

 

输出格式

 

一个正整数,表示完美区间的个数

 

输入/输出例子1

输入:

8 3

1 4 3 2 1 4 1 2

 

输出:

27

 

样例解释

 

比如:区间[1,6],气球颜色分别为[1,4,3,2,1,4],因为第5个气球与第一个1气球颜色相同但是距离大于了3,所以不是完美区间。区间[4,7],气球颜色分别为[2,1,4,1],是完美区间。

 

 

 

 

看到题目,就感觉可以枚举L,R端点,暴力去做(类似dp嘛),但是肯定超时,所以。对于这种数据范围大的区间的题,我们可以很自然的想到一种思想,当然对于我来说我是新思路

区间类题目思路:枚举合法区间的左端点,看看右端点是否合法(例如可以用二分枚举右端点,又或者kmp的跳一跳思想)

 

我们考虑答案会由什么贡献而来。

考虑每一个宝石:

1.单独的一个宝石,也就是第一次出现的宝石,肯定合法

2.在这个宝石的前面有与它颜色相同的宝石,且距离<=k,肯定合法

所以我们的答案贡献肯定来自于这两种情况

对于第二种情况,我们可以记录一下前一个宝石所在位置,不然没办法计算

预处理b[i] ,表示a[i]前面最近的与a[i]颜色相等的下标,这个下标与i的差值>k才记录(因为是不合法的才记录,这样便于我们后续求答案,因为直接求合法的太麻烦了,属于是转化问题了)

前面没有a[i]的这种颜色(第一次出现):b[i]=0

预处理c[i],表示b数组的前缀最大值

为什么开c数组?

如果b数组每个值都是散开的,不方便统计答案,毕竟统计答案的是一个区间啊

对于一个区间(例如3~5),如果它是不合法的,那么比这个区间大的区间(例如2~9,或者3~6)也肯定是不合法的,所以带有一种”继承性“

 

现在可以枚举L,看哪些R合法

如果L~R中每个 c[i]<L,那就合法(因为只要c数组有标记过的都是距离>k的,如果是=L的话也在L的区间,也是不合法的)

举个例,假设现在枚举的区间是2~5,L=2,R=5(红色线),是合法的,满足所有 c[i]<L 

假设现在枚举的区间是2~5,L=2,R=7(蓝色线),是不合法的,因为 c[6]>=L

 

 Code

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;

int n, k, a[N], fst[N], b[N], c[N], ans=0;
int main()
{
	scanf("%d%d", &n, &k);
	for (int i=1; i<=n; i++)
	{
		scanf("%d", &a[i]);
		
		if (i-fst[a[i]]>k) b[i]=fst[a[i]];
		fst[a[i]]=i;
	} 
	c[1]=b[1];
	for (int i=2; i<=n; i++) c[i]=max(b[i], c[i-1]);
	
	for (int i=1; i<=n; i++)
	{
		int L=i, R=n, j=0;
		while (L<=R)
		{
			int mid=(L+R)>>1;
			if (c[mid]<i) j=mid, L=mid+1;
			else R=mid-1;
		}
		ans+=j-i+1;
	}
	
	printf("%d", ans);
	return 0;
}

  

 

 

 

标签:思想,宝石,完美,合法,int,枚举,区间
From: https://www.cnblogs.com/didiao233/p/18361695

相关文章

  • 代码随想录day30 || 452 引爆气球,435 无重叠区间,763 划分字母区间
    452射爆气球funcfindMinArrowShots(points[][]int)int{ //思路,尝试按照startasc,endasc排序一下,取交集射爆 iflen(points)==1{ return1 } sort.Slice(points,func(i,jint)bool{ ifpoints[i][0]==points[j][0]{ returnpoints[i][1]<points......
  • 设计原则与思想:规范与重构 理论一 - 三 什么情况下要重构?到底重构什么?又该如何重构?有
    理论一:什么情况下要重构?到底重构什么?又该如何重构?重构的目的:为什么要重构(why)?对于项目来言,重构可以保持代码质量持续处于一个可控状态,不至于腐化到无可救药的地步。对于个人而言,重构非常锻炼一个人的代码能力,并且是一件非常有成就感的事情。它是我们学习的经典设计思想......
  • 线段树+懒标记 (区间修改,区间查询)
    原作者:董晓P3372【模板】线段树1//结构体版#include<cstring>#include<iostream>#include<algorithm>usingnamespacestd;#defineN100005#defineLLlonglong#definelcu<<1#definercu<<1|1LLw[N];structTree{//线段树LLl,r,......
  • ST表 RMQ问题(区间最大/最小值查询)
    #include<iostream>#include<cstring>#include<algorithm>#include<cmath>usingnamespacestd;intf[100005][22];intmain(){intn,m;scanf("%d%d",&n,&m);for(inti=1;i<=n;i++)scanf("%d"......
  • 3台服务器+StarVCenter搭建 “超融合云平台” --完美体验跑100台虚拟机
    我们通常讲的“超融合(HCI)”是一种云平台基础架构方案,它无需专用的存储设备,每台服务器既承担计算又存储数据,只需增加服务器,即可等效提升计算+存储性能。是性能最强、性价比最高的一种方案。本文将介绍搭建超融合云平台,并且平滑替代Vmware虚拟化的详细方案,以StarVCenter超融合软......
  • 完美解决RTX5源码工程+最新emWin6.40的编译兼容问题,使能C编译器使用C11可解决
    最新的emWin6.40仅提供了.a格式库,这个库兼容MDK,IAR和GCC,但是在MDKAC6下使用需要做如下操作-fno-short-wchar-fshort-enums他这个操作,正好跟RTX5源码工程添加的一个设置冲突了,通过搜索资料,发现使能MDK使用C11版本编译可以完美解决这个问题:最终配置如下,确实解决了:最后就......
  • JavaScript魔法:在线Excel附件上传与下载的完美解决方案
    最新技术资源(建议收藏)https://www.grapecity.com.cn/resources/前言在本地使用Excel时,经常会有需要在Excel中添加一些附件文件的需求,例如在Excel中附带一些Word,CAD图等等。同样的,类比到Web端,现在很多人用的在线Excel是否也可以像本地一样实现附件文件的操作呢?答案是肯定的,不......
  • 『区间最值操作 & 区间历史最值』Day6
    1势能1.1有一类之前就见过的操作。区间取模区间开方。开方是说在\(\log\logB\)次过后就不变了,所以这之前暴力即可。取模则是说如果一个数能取模那么至少会减少一半,所以一个数最多暴力操作\(\logB\)次就没了。对于一个区间你维护最大值看是否需要递归进行操作即可。上......
  • Apache Doris设计思想介绍与应用场景
    ApacheDoris设计思想介绍与应用场景   MPP(MassivelyParallelProcessing),即大规模并行处理,在数据库非共享集群中,每个节点都有独立的磁盘存储系统和内存系统,业务数据根据数据库模型和应用特点划分到各个节点上,每台数据节点通过专用网络或者商业通用网络互相连接,彼此协同......
  • 差一点就完美了!原子侠X7 Ti迷你主机评测:豪华三网卡七USB 灵动屏还能当时钟摆件
    一、前言:迷你主机也用上AI处理器/外围扩展给出十足诚意要说最合适办公的PC是什么,在我看来非迷你主机莫属,小巧的体积、适中的性能、丰富的接口和扩展,可满足办公时的大部分需求了。这也得益于Intel/AMD“神仙打架”,移动端处理器迅速迭代,性能不再羸弱,功耗发热控制得当,才让迷你主机......