首页 > 其他分享 >静态区间数颜色问题

静态区间数颜色问题

时间:2024-10-24 21:12:17浏览次数:1  
标签:node 颜色 数字 静态 题解 询问 int 区间

P1972 [SDOI2009] HH的项链

我知道这是很典的题,但是看提交记录发现我是今年 1 月做的,居然一点印象也没有。

看题解(洛谷第一篇)居然看懂了,比较开心。之前都是随便看看然后就开始贺题解,感觉思考的比较少,这次是看着推导过程写出来了。

思路:对于询问多个区间 [L,R] 中出现不同数字个数,当 R 相同时,如果区间出现了重复数字,那么我们只需要关心最右端的这个数字就可以了。换言之,重复出现的数字在左端将无任何贡献。例如 1 2 3 1 4,在询问 [1,4] 时,第一个 1 无任何贡献,并且当询问的 R 不断右移的过程中,第一个 1 都无任何意义,被第四位置的替代掉。

于是把询问离线下来,按照询问的右端点排序。

当出现一个数字时,如果这个数字曾经出现,则 insert(lst[pos[i]],-1),把这个数在上一个位置的标记清掉,insert(pos[i],1) 来更新这个数字的新位置。

用树状数组单点修改、区间查询,常数、空间都较小。用前缀和 query(R)-query(L-1) 把这一段的数字数出来。

#include<bits/stdc++.h>
const int N=1e6+10;
using namespace std;
int n,Q;
int a[N],t[N];
int lst[N],ans[N];
struct node{int L,R,id;}q[N];
bool cmp(node x,node y){
	return x.R<y.R;
}
int lowbit(int x){
	return x&(-x);
}
void insert(int x,int v){
	while(x<=n){
		t[x]+=v;
		x+=lowbit(x);
	}
}
int query(int x){
	int res=0;
	while(x){
		res+=t[x];
		x-=lowbit(x);
	}
	return res;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	scanf("%d",&Q);
	for(int i=1;i<=Q;i++){
		scanf("%d%d",&q[i].L,&q[i].R);
		q[i].id=i;
	}
	sort(q+1,q+Q+1,cmp);
	for(int i=1,top=1;i<=n;i++){
		if(lst[a[i]]) insert(lst[a[i]],-1);
		insert(i,1);
		lst[a[i]]=i;
		while(top<=Q&&q[top].R==i){
			ans[q[top].id]=query(q[top].R)-query(q[top].L-1);
			top++;
		}
	}
	for(int i=1;i<=Q;i++) printf("%d\n",ans[i]);
	return 0;
}

标签:node,颜色,数字,静态,题解,询问,int,区间
From: https://www.cnblogs.com/Moyyer-suiy/p/18500948

相关文章

  • 20241024 模拟赛(长方体,三角形,区间,图)
    看题戳这里总结1h看题+骂出题人1h把之前没做完的题单补了1h闲逛+水群+听歌1h疯狂rush暴力!!!结果看完solution才发现我是fw\(qwq\)最终分数:30+60+60+10解析A.长方体难度:绿暴力:直接三维差分+前缀和搞定。正解:先算出前缀交与后缀交。被\(n\)个长方体覆盖的点就是所......
  • VMware安装虚拟机时,全名、用户名、虚拟机名是什么。修改虚拟机为静态ip
    1.打开vmware新建虚拟机,选择iso光盘也就是linux操作系统光盘;否则vmware只是给你新建啦一个有内存+cpu+磁盘的物理机没有操作系统。2.分清楚概念:物理机名称、linux操作系统名称、linux里的用户名、linux里必须存在的root用户左边的“CentOS64位”就是物理机名称、“linux”就......
  • ReactOS系统中平衡二叉树,在一个空间中寻找与给定地址范围重合或部分重合的(已分配)区间
    在一个空间中寻找与给定地址范围重合或部分重合的(已分配)区间PMEMORY_AREANTAPIMmLocateMemoryAreaByRegion(PMADDRESS_SPACEAddressSpace,PVOIDAddress,ULONG_PTRLength);MmLocateMemoryAreaByRegion/******************************************************......
  • 题解 SS241023D【数颜色】/ ZROI3029【静态邻域数颜色】
    静态邻域数颜色-题目-ZhengruiOnlineJudge题目描述静态树上邻域数颜色。给一棵\(n\)个点的无根树,第\(i\)个点颜色为\(a_i\)。有\(q\)次询问,每次询问如下:给定\(x,d\),考虑所有距离\(x\)不超过\(d\)的点,求有多少种不同的颜色。形式化地,给定\(x,d\),求\(|\{a......
  • 封装 构造 静态
    class是类new出的是对象栈内存:在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配栈内存主要存放的是基本类型类型的数据如(int,short,long,byte,float,double,boolean,char)和对象句柄。注意:并没有String基本类型、在栈内存的数......
  • 虚拟机设置静态IP并启用桥接模式
    虚拟机设置静态IP并启用桥接模式一、准备工作在开始之前,请确保你已经安装了VMware或其他虚拟机软件,并且已经创建了一个虚拟机实例。此外,还需要了解宿主机的网络配置,包括IP地址、子网掩码、网关等信息,可通过ipconfig/all查看。记录上述信息:IPv4地址:10.10.97.210子网掩码:25......
  • DevExpress中文教程 - 如何在静态SSR模式下使用Blazor Drawer组件?
    Microsoft的.NET8UI框架引入了静态服务器端呈现模式(静态SSR)——组件在服务器端呈现,然后返回到客户端,没有任何交互,DevExpress BlazorDrawer组件需要交互式呈现模式来动态地改变其IsOpen状态。在本文中,我们将回顾在静态SSR渲染模式下动态显示/隐藏DevExpressBlazorDrawer组......
  • nginx上线一个静态页
    要使用Nginx配合一个静态网页,你需要按照以下步骤进行设置:###1.安装Nginx在大多数Linux发行版上,你可以使用包管理器来安装Nginx。**对于Ubuntu/Debian:**```bashsudoaptupdatesudoaptinstallnginx```**对于CentOS/RHEL:**```bashsudoyuminstallepel-releas......
  • CANoe_数据回放功能功能介绍_时间段(区间)选择
    CANoe的日志回放功能,可以选择时间段回放,这样可以在数据量很大的时候快速定位分析数据问题点 CANoe日志回放功能概述CANoe的日志回放功能允许用户重现和分析已记录的CAN总线或其他网络总线数据。这些日志文件通常以CANoe自己的日志格式(.blf)或其他常见格式(如ASC、MDF等)保存,......
  • OpenCV-Python 颜色空间转换
    一、颜色空间转换importcv2importnumpyasnpimg=cv2.imread('lena.jpg')#转换成灰度图img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)cv2.imshow('img',img)cv2.imshow('gray',img_gray)cv2.waitKey(0)颜色转换其实是数学运算,如灰度化最常用的是:gray......