首页 > 其他分享 >【码题集】习题

【码题集】习题

时间:2024-07-14 17:56:24浏览次数:15  
标签:fa int 集合 区间 码题 习题 type find

目录

史莱姆融合

松鼠接松果

 新月轩就餐 


史莱姆融合

根据题意就是一道集合合并的题,所以要用并查集,不过最后我们要输出整个序列,所以要在合并的时候维护一个链表,以便最终合并成一个大集合的时候,输出整个链表就是答案。

不过这里有一点要注意,就是我们在更新链表的时候是把两个集合给连起来,所以必须知道左边集合的最右边元素和右边集合最左元素。所以很容易想到用fa数组作集合左边元素,构造一个新数组作为集合右边元素,这样的话集合更新操作就简单了。

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,fa[N],you[N],nxt[N];
int find(int x){
	return x==fa[x] ? x:(fa[x]=find(fa[x]));
}
void merge(int i,int j){
	int x=find(i),y=find(j);//x是左边集合的最左,y是右边集合的最左
	if(x!=y){//合并
		nxt[you[x]]=y;//更新链表
		fa[y]=x;//更新并查集(对右边集合的)
		you[x]=you[y];//更新最右(对左边集合)
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){	fa[i]=i;you[i]=i;}//初始化
	for(int i=1;i<n;i++){
		int x,y;cin>>x>>y;
		merge(x,y);
	}
	for(int i=find(1);i;i=nxt[i]) cout<<i<<" ";//把整个链表输出即可
	return 0;
}

        

        

松鼠接松果

#include <bits/stdc++.h>//本来是一道单调队列,但是一股双指针味道,很好的一个模版题
using namespace std;//从双指针思路开始,当[l,r]满足题意的时候l左移然后更新区间极值,当[l,r]不满足题意的时候r右移
const int N=1e5+5;//所以只要完成对区间极值的维护即可,可以使用单调队列来实现,入队新元素是i,队头判断是否过期是根据区间左边界l
int q1[N],q2[N],n,D,ans=0x3f3f3f3f;
struct node {
	int x,y;
}a[N];
bool cmp(node p,node q){
	return p.x<q.x;
}
int main(){
	cin>>n>>D;
	for(int i=1;i<=n;i++)cin>>a[i].x>>a[i].y;
	sort(a+1,a+1+n,cmp);
	int L=1,h1=1,h2=1,t1=0,t2=0;//L是左指针开始
	for(int i=1;i<=n;i++){//i相当于右指针进行移动
		while(h1<=t1&&a[i].y>a[q1[t1]].y)t1--;//单减队列,队头是最大值
		q1[++t1]=i;//i入队
		while(h2<=t2&&a[i].y<a[q2[t2]].y)t2--;//单增队列,队头是最小值
		q2[++t2]=i;//i入队
		while(L<i&&a[q1[h1]].y-a[q2[h2]].y>=D){
			ans=min(ans,a[i].x-a[L].x);//更新答案,当前区间是[L,i]
			L++;     //开始寻找下一个r
			while(h1<=t1&&q1[h1]<L)h1++;//更新队头
			while(h2<=t2&&q2[h2]<L)h2++;//更新队头
		}
	}
	if(ans==0x3f3f3f3f)cout<<-1;
	else cout<<ans<<'\n';
	return 0;
}

        

        

 新月轩就餐 

思路:

其实很容易想到是双指针或者双端队列。

我们设置一个type表示当前区间已经有了多少种厨师,同时还需要记录区间中每个元素出现的次数,然后比较棘手的是移动问题了,什么时候移动呢?

我们可以发现当区间当队头元素多余时候肯定就要移动了:

统计答案就是在type等于m的时候,只要统计l和r的位置就行了。

为什么这样的移动方式就一定可以让l和r落在最佳的答案区间上?

你可以反推:因为我们的l指向的元素一定是区间中没有多余的元素,那么如果它再右移,则区间非法;如果它不移动,也就是在l的左边,那么这个区间明显不是最佳区间。

#include <bits/stdc++.h>
using namespace std;
const int N=16+5,inf=0x3f3f3f3f;
deque<int>q;
int ans=inf;
int n,m,a[N],cnt[2001],l,r,type;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(!cnt[a[i]])type++;
		cnt[a[i]]++;
		q.push_back(i);//新元素进入队尾
		while(!q.empty()&&cnt[a[q.front()]]>1){//队头多余时候就移动
			cnt[a[q.front()]]--;q.pop_front();
		}
		if(type==m){//因为种类最多m,达到m时候就一直更新答案就行
			if(q.size()<ans){
				ans=q.size();l=q.front();r=q.back();
			}
		}
	}
	cout<<l<<" "<<r;
}

标签:fa,int,集合,区间,码题,习题,type,find
From: https://blog.csdn.net/m0_69478376/article/details/139728396

相关文章

  • 当代政治制度(练习题)
    当代政治制度(练习题)***Rz整理版仅供参考***以归侨华侨眷中的中上层人士为主组成的民主党派是(D.中国致公党)A.中国民主建国会B.中国民主促进会C.九三学社D.中国致公党中国共产党同各民主党派合作的政治基础是(B.四项基本原则)A.十六字方针B.四项基本......
  • 【操作系统原理】第五章课后习题
    前言课本:操作系统原理(第五版)[费翔林,骆斌编著]习题:主要习题内容是第一章到第六章,具体内容如下表章节内容链接第一章思考题1,3,7、应用题7,12(1)~(4)https://blog.csdn.net/Zchengjisihan/article/details/136493304?spm=1001.2014.3001.5501第二章思考题1,3,10......
  • 【操作系统原理】第四章课后习题
    前言课本:操作系统原理(第五版)[费翔林,骆斌编著]习题:主要习题内容是第一章到第六章,具体内容如下表章节内容链接第一章思考题1,3,7、应用题7,12(1)~(4)https://blog.csdn.net/Zchengjisihan/article/details/136493304?spm=1001.2014.3001.5501第二章思考题1,3,10......
  • 【操作系统原理】第六章课后习题
    前言课本:操作系统原理(第五版)[费翔林,骆斌编著]习题:主要习题内容是第一章到第六章,具体内容如下表章节内容链接第一章思考题1,3,7、应用题7,12(1)~(4)https://blog.csdn.net/Zchengjisihan/article/details/136493304?spm=1001.2014.3001.5501第二章思考题1,3,10......
  • 【操作系统原理】第一章课后习题
    前言课本:操作系统原理(第五版)[费翔林,骆斌编著]习题:主要习题内容是第一章到第六章,具体内容如下表章节内容链接第一章思考题1,3,7、应用题7,12(1)~(4)https://blog.csdn.net/Zchengjisihan/article/details/136493304?spm=1001.2014.3001.5501第二章思考题1,3,10......
  • 【操作系统原理】第二章课后习题
    前言课本:操作系统原理(第五版)[费翔林,骆斌编著]习题:主要习题内容是第一章到第六章,具体内容如下表章节内容链接第一章思考题1,3,7、应用题7,12(1)~(4)https://blog.csdn.net/Zchengjisihan/article/details/136493304?spm=1001.2014.3001.5501第二章思考题1,3,10......
  • 【操作系统原理】第三章课后习题
    前言课本:操作系统原理(第五版)[费翔林,骆斌编著]习题:主要习题内容是第一章到第六章,具体内容如下表章节内容链接第一章思考题1,3,7、应用题7,12(1)~(4)https://blog.csdn.net/Zchengjisihan/article/details/136493304?spm=1001.2014.3001.5501第二章思考题1,3,10......
  • 数据挖掘习题10
    1.题干    客户细分是将市场细分为具有相似特征的离散客户群体。客户细分可以成为识别未满足客户需求的有力手段。利用上述数据,公司可以通过开发具有独特吸引力的产品和服务来超越竞争对手。   现有某超市客户的特征数据集,包括客户编号(ID),性别,婚姻状况(Marital......
  • U7-11课综合练习+12课阶段测评练习——复习练习题目
     [2的n次方] 高精度乘法复习资料:https://www.cnblogs.com/jayxuan/p/18287673 重复做以下操作$n$次:对每一位乘以$2$,然后进位。(当然也可以使用正常的高精度乘法)【参考代码】#include<bits/stdc++.h>usingnamespacestd;intans[59];intmain(){intn......
  • 【期末考试复习】概率论与数理统计(知识点模式 - 复习题2)
    题目:设随机变量XXX的概率密度函数为f(x......