题目链接:点击查看

题目大意:给出一个1~n的序列,然后给出m个操作,每个操作分为下列两种情况:

  1. 1 x:让数字x不可用
  2. 2 x:查询包括x在内的右侧的第一个可用数字

题目分析:因为n给到了1e9,而查询只有1e6,所以我们必须将数据离散化,我最初的思路是先将1e6个查询记录下来,将操作1使用过的数字放到一个有序数列中,离线处理,可以倒着一步步模拟,每次遇到操作1就将其删除(即加入回原数组中),然后二分查找第一个大于等于它本身的数,我让队友模拟的,最后果然这个题目卡了stl的时间,TLE了,然后我就想用vector模拟链表写一下这个题,经过队友的提醒,发现了这就是一个离散化后的并查集,但我不太会写,就先用vector正向模拟的这个题目,最后还是以TLE告终,临比赛结束前半个小时终于有了最终的思路,就是在离散化的时候,将涉及到的x和x+1同时加入到并查集中,这样正向遍历一遍询问,每次遇到删除就将当前节点的父节点改为下个节点的父节点,遇到询问就直接输出该节点的父节点即可

不过还是需要注意一下离散化后的id和并查集的对应关系,写那一部分的时候一定要细心想一下,不能对应错

还有个细节需要注意一下,因为每次push进去的是点x和点x+1,所以最坏情况会有2e6个点,所以数组要开2e6,开1e6会RE

题解是说用map并查集维护一条链表,不过不能用普通的map,会超时,要用unordered_map,据说是O1的查询

补充一下map和unordered_map的区别吧:

map:

map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素,因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行这样的操作,故红黑树的效率决定了map的效率。 
unordered_map:

unordered_map内部实现了一个哈希表,因此其元素的排列顺序是杂乱的,无序的

其他方法都是一样的用法

蒟蒻的代码:(又臭又长但条理还挺清晰的-.-)

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=2e6+100;vector<int>v;int fa[N];int find(int x)
{return x==fa[x]?x:fa[x]=find(fa[x]);
}struct Node
{int op,x;
}q[N];int getid(int x)
{return lower_bound(v.begin(),v.end(),x)-v.begin();
}int main()
{
//  freopen("input.txt","r",stdin);int n,m;while(scanf("%d%d",&n,&m)!=EOF){v.clear();for(int i=1;i<=m;i++){scanf("%d%d",&q[i].op,&q[i].x);v.push_back(q[i].x);v.push_back(q[i].x+1);}v.push_back(n);sort(v.begin(),v.end());//离散化+去重v.erase(unique(v.begin(),v.end()),v.end());for(int i=0;i<v.size();i++)fa[i]=i;for(int i=1;i<=m;i++){int op=q[i].op;int x=q[i].x;int id=getid(x);if(op==1){fa[id]=find(id+1);}else{printf("%d\n",v[find(id)]);}}}return 0;
}

题解的代码:顺便偷学了一波unordered_map

#include <bits/stdc++.h>using namespace std;
const int maxn = 1e5 + 100;
unordered_map<int, int> fa;int findfa(int x) {if (!fa.count(x)) return x;return fa[x] = findfa(fa[x]);
}int main() {
//    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);int n, q;scanf("%d %d", &n, &q);int op, x;while (q--) {scanf("%d %d", &op, &x);if (op == 1) {fa[x] = findfa(x + 1);} else {int ans = findfa(x);if (ans > n) ans = -1;printf("%d\n", ans);}}return 0;
}

2019ICPC(徐州) - so easy(并查集+离散化)相关推荐

  1. LNSYOJ201小胖的奇偶【并查集+离散化】【做题报告】

    这道题是一个带权并查集 题目描述 huyichen和xuzhenyi在玩一个游戏:他写一个由0和1组成的序列. huyichen选其中的一段(比如第3位到第5位),问他这段里面有奇数个1 还是偶数个1 ...

  2. bzoj4195(并查集+离散化)

    题目大意:给出n个变量互相的相等或不等关系,求这些关系是否矛盾 思路:把相等的变量加入并查集,不等的查询是否合法 eg:数据很大,离散化(然而我用的是map) #include<stdio.h& ...

  3. POJ1733,jzoj1779-Parity game(奇偶游戏)【带权并查集,离散化】

    正题 POJ题目链接:http://poj.org/problem?id=1733 jzoj题目链接:https://jzoj.net/senior/#main/show/1779 题目大意 长度为l ...

  4. P1955-[NOI2015]程序自动分析【并查集,离散化】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P1955 题目大意 给出若干个关系,xi≠xj   or   xi=x ...

  5. [POJ1733]Parity game(并查集 + 离散化)

    传送门 题意:有一个长度已知的01串,给出[l,r]这个区间中的1是奇数个还是偶数个,给出一系列语句问前几个是正确的 思路:如果我们知道[1,2][3,4][5,6]区间的信息,我们可以求出[1,6] ...

  6. poj 1733 ParityGame 并查集 离散化

    这道题poj1733 和 hdu 3038类似,闭区间那里的原理相同. 本题的两段代码的区别只有find()函数不同 但是感觉没有区别的呀 AC: int find(int x) {if (par[x ...

  7. 0x41.数据结构进阶 - 并查集

    目录 一.路径压缩与按秩合并 1.AcWing 237. 程序自动分析(NOIP2015) 二.边带权并查集 1.AcWing 238. 银河英雄传说(边带权并查集模板) 2.AcWing 239. ...

  8. 【bzoj4195】[Noi2015]程序自动分析 离散化+并查集

    题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3,-代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量 ...

  9. The Preliminary Contest for ICPC Asia Xuzhou 2019【B. so easy】(set 解法 与正解 unordered_map+并查集)

    so easy 题目大意 给你两个操作,op=1时,将那个数不可用,op=2时进行查询功能 找到从x开始第一个存在的数 非官方题解 set 内置红黑树,有默认从小到大排序功能,所以我们可以暴力一发,不 ...

最新文章

  1. Java中父类方法重写有哪些需要注意的?
  2. 国内IT出版社的四大软肋
  3. 十年磨剑 中国光伏产业强势崛起
  4. java 关于日期的一些常用惯例
  5. ios vue 添加本地音乐_Vue 项目一些常见问题的解决方案
  6. How to find CRM system's integrated ERP system
  7. 02-再探MySQL数据库
  8. 介绍当前流行的一些开源Flash视频播放器
  9. 理解SVG的viewport,viewBox【1】
  10. KubeSphere对于已经部署的服务进行修改后重新进行部署
  11. ab st语言编程手册,PLC编程语言,ST语言秒杀梯形图编程之浮点数计算
  12. 基于SSM的校园二手交易平台系统
  13. PHP回调函数用法及分析
  14. ArcGIS动态表格扩展模块Mapping and Charting Solutions使用教程及下载地址
  15. 必须知道的python专属骚技巧25例
  16. 论文笔记(五)FWENet:基于SAR图像的洪水水体提取深度卷积神经网络(CVPR)
  17. 编程生成一个瓶子(1)
  18. 银行卡卡号格式规范 每隔4为一个空格
  19. HDMI、AV音视频端子介绍
  20. 【路径规划】基于遗传算法求解多中心VRP问题matlab源码

热门文章

  1. RabbitMQ fanout交换机(消费者)
  2. MyBatis常用配置解析-mapper标签
  3. 微服务网关Gateway-PrefixPath讲解
  4. request的简介和运行环境
  5. 改造微服务注册到eureka注册中心
  6. java进程优先级,跨平台方式改变java进程优先级
  7. Linux Capabilities 入门教程--基础实战篇
  8. 冒泡排序 java_冒泡排序Java版本
  9. int型数据占用的内存空间及ASCII码表
  10. 零基础前端入门,真正难在哪里?简说编程思想和逻辑思维