首页 > 其他分享 >HH 的项链

HH 的项链

时间:2024-09-16 19:35:20浏览次数:4  
标签:return int sum 枚举 HH 项链 区间 void

HH的项链 题解

题意

给定一个序列 \(a_N\) ,有 \(m\) 个询问 \([l,r]\) ,问在该区间中不同数的数量有多少。该题目可以和 ABC371E 对比着做。

思路

\(N\in[1,10^6]\) ,暴力枚举是 \(n^2\) 的会超时。

但是我们先假定这 \(n\) 个数字本就两两不同,那么他们各自都会产生 \(1\) 的贡献,如果每个数相应的位置都代表数值 \(1\) ,那么就是在查询 \(sum[r]-sum[l-1]\) 而已。

事实上上述假设并不能一定成立。

那么有一种和莫队和相似的巧妙算法就是先离线,然后再考虑区间之间移动时的增量。

核心

我们先按照右区间升序排序。

言下之意就是如果有 \(114514\) 个 \(3\) ,那你也只能算一种。我们保留刚刚的前缀和算法,钦定所有相同数字 \(x\) 所产生的贡献 \(1\) 都在当前最右边的 \(x\) 身上,其余的 \(x\) 贡献都为 \(0\),并且随着我们枚举区间不断更新这个"最右"的位置,这时候我们发现了按照右区间升序排序的优越性。

那就是下一个枚举到的区间要不就不包含 \(x\) 这个数字 ,要么就一定至少包含最右边的 \(x\) (可能同时包含左边的 \(x\) ),由于 \(r\) 是逐渐增大的,所以我们不可能枚举到一个包含左边 \(x\) 们,但又不包含最右边 \(x\) 的区间。因此我们就成功统计了 \(x\) 对当前区间 (如果有的话)的贡献。

所以对于一个 \([l,r]\) ,我们先做好从上一个 \(r_{las}\) 到这一个 \(r_{now}\) 的更新,再直接统计答案 \(sum[r]-sum[l-1]\) 就好了。

由于是单点修改并且多次查询,就选择树状数组了。

Code

#include<bits/stdc++.h>
using namespace std;
template<typename T>inline void re(T &x)
{
	x=0;int f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	x*=f;
}
template<typename T>inline void wr(T x)
{
	if(x<0)putchar('-'),x=-x;
	if(x>9)wr(x/10);
	putchar(x%10^48);
}
const int N=1e6+5;
int v[N],c[N],n,m;
inline int lowbit(int x){return x&(-x);}
inline void add(int x,int v)
{
	for(;x<=n;x+=lowbit(x))
			c[x]+=v;
}
inline int query(int x){int ans=0;for(;x>=1;x-=lowbit(x))ans+=c[x];return ans;}
struct Q
{
	int l,r,idx;
}a[N];
int ans[N];
bool cmp(Q a,Q b){return a.r==b.r?a.l>b.l:a.r<b.r;}
inline void pre()
{
	re(n);
	for(register int i=1;i<=n;++i)re(v[i]);
	re(m);
	for(register int i=1;i<=m;++i)
	{
		re(a[i].l),re(a[i].r);
		a[i].idx=i;
	}
	sort(a+1,a+m+1,cmp);
}
int las[N];
inline void solve()
{
	int st=1;
	for(int i=1;i<=m;++i)
	{
		for(;st<=a[i].r;++st)
		{
			if(las[v[st]])add(las[v[st]],-1);
			add(st,1);	
			las[v[st]]=st;
		}
		ans[a[i].idx]=query(a[i].r)-query(a[i].l-1);
	}
}
int main()
{
	pre();
	solve();
	for(register int i=1;i<=m;++i)
		wr(ans[i]),putchar('\n');
	return 0;
}

标签:return,int,sum,枚举,HH,项链,区间,void
From: https://www.cnblogs.com/Hanggoash/p/18416533

相关文章

  • 【P1227】琪琪的项链
    1.题目原题题目背景Piet项目的一对开发者laosb(吕世博)与scjyholy(叶嘉琪)最近一直为中国学生站长联盟的童鞋们所津津乐道,不仅仅因为他们天天在某群中秀恩爱,而且他们还经常被用作题目背景。现在我们以他们为背景来引出一道问题。题目描述话说laosb在与scjyholy配对成功1周......
  • jmeter通过beanshell中脚本实现随机获取某天(“yyyy-MM-dd HH:mm:ss“)前1周,一个月,一
    在接口测试中,请求参数中涉及时间的参数可能不是固定死的,因此jmeter想通过beanshell中脚本实现随机获取某天(statusTimeEnd(“yyyy-MM-ddHH:mm:ss”))前1周,一个月,一个季度,半年的时间0点,其中statusTimeEnd的值在用户参数中已配置。参考JMeter性能测试实战的方法:http://lit......
  • P1972 [SDOI2009] HH的项链 题解
    前言这是一篇分块题解,大概的思路洛谷的题解里的巨佬讲的很清楚(我的思路其实和大佬的差不多),可以去看看qaq。因为苯人为了卡常魔改代码,所以在本题解的中间具体步骤展示部分仅展示魔改前的代码(也就是被卡常但是好看一点的代码),魔改后的代码(100pts)在文章最末展示。题意题面传送门......
  • 030、Vue3+TypeScript基础,路由中History和HashHistory的区别
    01、index.ts路由代码如下://创建路由并暴露出去import{createRouter,createWebHistory}from'vue-router'importHomefrom'@/view/Home.vue'importAboutfrom'@/view/About.vue'importNewsfrom'@/view/News.vue'constrouter=cr......
  • P1972 [SDOI2009] HH的项链
    https://www.luogu.com.cn/problem/P1972莫队算法被卡,只能得60points正解有点像基于贪心的fenwicktree策略fenwick的每个位置表示当前位置上是否是某个数的最后一次出现位置,值为0或者1右指针升序排序,然后右指针移动过程中更新每个数最后一次出现的位置而不管左指针如何变,只......
  • Linux服务器配置SHH免密互通
    服务器A172.25.11.11,服务器B172.25.11.12在服务器A上配置假设服务器A的IP地址为172.25.11.11,我们将在这台服务器上生成密钥对并将公钥复制到服务器B上。生成密钥对:打开终端,执行以下命令生成密钥对。在生成过程中,你可以选择保留默认路径和设置空密码以简化使用,也可......
  • GraphHopper路劲规划导航(Android源码调试运行)
    本文主要记录在运行graphhopper安卓版路径规划导航源码的步骤和遇到的问题。成功运行了程序,但是路劲规划一直不成功,问题一开始是服务地址,后来又是key的问题,在这个项目中涉及到了graphhopper、mapbox、mapilion的key,mapbox带导航的key我一直无法获取。目前最大的问题:我无法......
  • [NOI2007] 项链工厂 题解
    前言题目链接:洛谷;Hydro&bzoj。题意简述yzh喜欢写DS题!你要维护一个环:顺时针移动\(k\)位;翻转\(2\simn\);交换\(i\)与\(j\);区间覆盖;查询整个环有几个颜色段;查询\(i\simj\)有几个颜色段。题目分析平衡树板子啊,代码很好写,\(273\)行。但是为什么不使用线......
  • 分类预测|基于HHO-CNN-BiLSTM-Attention的数据分类预测Matlab程序 多特征输入多类别输
    分类预测|基于HHO-CNN-BiLSTM-Attention的数据分类预测Matlab程序多特征输入多类别输出文章目录分类预测|基于HHO-CNN-BiLSTM-Attention的数据分类预测Matlab程序多特征输入多类别输出前言:HHO-CNN-BiLSTM-Attention流程一、哈里斯鹰优化HHO二、数据展示三、核心代码......
  • Google RichHF-18K 文本到图像生成中的丰富人类反馈
      每周跟踪AI热点新闻动向和震撼发展想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行!订阅:https://......