B. so easy The Preliminary Contest for ICPC Asia Xuzhou 2019

探讨了在一系列操作中,如何高效地删除指定范围内的元素,并查询最近未被删除的元素。介绍了两种解决策略,一种是使用set进行暴力搜索,另一种是利用unordered_map模拟并查集,实现更快速的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题地址
题意:给从1到n个数,然后q次操作,每次操作有两个变量z,x:
当z=1时:要把后面的x从1到n中去掉
当z=2时:查找从x开始,1到n中距离x最近的没被删掉的数
思路一:暴力做,把所有z=1的数用set(或者map等STL)存下来,接着在z=2时for循环从x到n的遍历找到set中没有的数,就输出该数并跳出来,这种做法十分极限且只能在c++11且输入输出为scanf和printf的情况下,才能通过,属于侥幸过题(虽然比赛的时候没做出。。)
思路二:当使用map写超时了,后来才想到用unordered_map这个数据结构。其实就是用这个模拟并查集。
(大佬思路)
思路一代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	set<int> a;
	int n , q;
	scanf("%d %d",&n,&q);
	for(int i=1;i<=q;i++){
		int z, x;
		scanf("%d %d",&z,&x);
		if(z==1)
			a.insert(x);
		else if(z==2){
			for(int i=x;i<=n;i++){
				if(a.count(i)==0){
					printf("%d\n",i);break;
				}
						
			}
			
		}
	}
	return 0;
}

思路二代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 100;
unordered_map<int, int> m;
int find(int x)
{
	if(!m.count(x))
		return x;
	else
		return m[x]=find(m[x]);
} 
int main() {
    int n, q;
    scanf("%d%d",&n,&q);
    int op, x;
    while (q--)
	{
        scanf("%d%d",&op,&x);
        if (op==1){
            m[x]=find(x+1);
        }else{
            int ans=find(x);
            if(ans>n) ans=-1;
            printf("%d\n",ans);
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值