首页 > 其他分享 >U423621 [HDK - NRC] Sqen Paradox 题解

U423621 [HDK - NRC] Sqen Paradox 题解

时间:2024-05-11 14:52:56浏览次数:23  
标签:std ch Paradox U423621 题解 zc int 端点 st

题目描述及 \(O(n^2)\) 做法见 这个

设 \(a_i\) 表示以 \(i\) 为左端点,无重复元素的最长区间的左端点,这个直接拿双指针做就行。

处理出来后,分类讨论,找 \(\max(i-l+1,i-a_i+1)\),找 \(i-l+1\) 拿个桶维护一下左端点为 \(i\) 的右端点有那些就行,剩下的位置找最值即可,这个是 RMQ。时间复杂度为 \(O(n\log n)\) 瓶颈在 st 表,拿这个维护就 O(n) 了

AC record

#include<bits/stdc++.h>
inline int read(){
	char ch=getchar();int x=0,f=1;
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
const int N=1e6+10;
int a[N],temp[N],mp[N],n,m,tot,L[N],l=1,st[N][25],c[N];
std::vector<int> t[N];
std::unordered_map<int,int> map;
inline int ask(int l,int r){if(l>r)return 0;int k=std::__lg(r-l+1);return std::max(st[l][k],st[r-(1<<k)+1][k]);}
int main(){
	// freopen("in.in","r",stdin),freopen("out.out","w",stdout);
	std::ios::sync_with_stdio(false);std::cin.tie(0),std::cout.tie(0);
	n=read();m=read();
	for(int i=1;i<=n;++i){
		a[i]=read();
		if(!map[a[i]])map[a[i]]=++tot;
		a[i]=map[a[i]];
		mp[a[i]]++;
		while(mp[a[i]]>1)mp[a[l++]]--;
		L[i]=l;
		t[L[i]].push_back(i);
	}
	for(int i=1;i<=n;++i)a[i]=i-L[i]+1,st[i][0]=a[i];
	for(int k=1;k<=std::__lg(n);++k)
		for(int i=1;i+(1<<k)-1<=n;++i)
			st[i][k]=std::max(st[i][k-1],st[i+(1<<k-1)][k-1]);
	for(int i=1;i<=n;++i){if(!t[i].size())c[i]=c[i-1];else c[i]=i;}
	for(int i=1;i<=m;++i){
		int l=read(),r=read(),res=0;
		if(l>r)std::swap(l,r);
		int zc=c[l];
		int mid=std::min(t[zc][t[zc].size()-1],r);
		std::cout<<std::max(mid-l+1,ask(mid+1,r))<<'\n';
	}
}

特别鸣谢:int_R

标签:std,ch,Paradox,U423621,题解,zc,int,端点,st
From: https://www.cnblogs.com/Ishar-zdl/p/18186490

相关文章

  • 工作疑难问题解决4例
      记录一下工作上疑难问题解决:  一,方便的页面监控     前几天早上,负责的kettle抽取数据表的任务又报错了,早上看手机有4个未接报警电话,一看是人员表,原来昨天报表系统有个大的查询一直未查询完成,导致truncate这个人员表,无法活动meta的锁,后续执行抽取和计算的都报错......
  • 第六届·2024 MindSpore 量子计算黑客松热身赛赛题解读
    第六届·2024MindSpore量子计算黑客松火热进行中。本次大赛由量子信息网络产业联盟主办,昇思MindSporeQuantum社区承办,多所高校和单位联合举办。开发者将全面体验全新一代通用量子计算框架MindSporeQuantum。热身赛为量子计算基础学习和编程演练。完成热身赛的前100名选手将有......
  • 题解
    #include<iostream>#include<vector>#include<algorithm>usingnamespacestd;intmain(){ intN,m;//N奖金m物品个数cin>>N>>m;N/=10;//由于所有的价格都是10的整倍数,所以可以均除10以简化运算复杂度intprice,priority,hasAttachme......
  • 题解:CF1956A Nene's Game
    这道题其实挺有意思,多测里面还套了个多测。思路就是用向量模拟删除过程,具体请看代码里的注释。#include<bits/stdc++.h>usingnamespacestd;intk,q,a[105];voidsolve(){ intn; cin>>n; vector<int>ve; for(inti=1;i<=n;i++)ve.push_back(i);//把每个人放到向量......
  • CF1385F Removing Leaves 题解
    看到题,感觉像树形DP,遂设计DP式子。\(dp_u\)表示以\(u\)为根的子树内最多能删多少次(不删\(u\))。那么每次子节点到父节点增加的贡献就是\(\lfloor\frac{子树大小为1的子节点个数}{k}\rfloor\)。得出式子\(dp_u=\sum_{v\inson_u}dp_v+(\sum_{v\inson_u}[dp_v\times......
  • 洛谷 P1031 [NOIP2002 提高组] 均分纸牌 题解
    题目简述有$N$堆纸牌,编号分别为$1,2,\ldots,N$。每堆上有若干张,但纸牌总数必为$N$的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为$1$堆上取的纸牌,只能移到编号为$2$的堆上;在编号为$N$的堆上取的纸牌,只能移到编号为$N-1$的堆上;其他堆上取的纸牌,可......
  • 洛谷 P1012 [NOIP1998 提高组] 拼数 题解
    题目简述设有$n$个正整数$a_1\dotsa_n$,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。题目分析定义设$X$为数字$x$的字符串形式。$A+B$表示字符串$A$和字符串$B$相连组成的字符串。思路既然要构造最优解,显然如果有不优的情况的话,就需要对序列进行......
  • 一本通蓝皮题解
    最小生成树1486:【例题1】黑暗城堡求最短路径生成树的个数先求出根节点到各点的最短路径然后统计每个点的答案个数如果一个节点到1号节点的最短路=另一个和它有连边的节点到根节点的最短路+它们两个节点之间的直接距离这个点的个数++最后用乘法原理统计答案将每个点的......
  • LLaMA-Factory 训练 Llama3-Chinese-8B-Instruct 相关报错问题解决
    模型路径up主为llama中文社区模型地址https://www.modelscope.cn/models/FlagAlpha/Llama3-Chinese-8B-Instruct/summarysysinfov10032gnvcc--versioncuda11.8pythonimporttorchprint(torch.version)13.11pipinstallflash_attntimeout2下载whl报这个错......
  • text-generation-webui 推理模型Qwen1.5-7B-Chat相关报错问题解决
    推理代码text-generation-webui推理模型Qwen1.5-7B-Chatsysinfo nvcc--versioncuda11.8importtorch>>>print(torch.__version__)1路径错误2依赖没安装ImportError:Thismodelingfilerequiresthefollowingpackagesthatwerenotfoundinyourenvironme......