P1955【绿】
这道题是标准的“离散化+并查集”模版题,通过这道题彻底理解了并查集,同时还意识到了我之前一直用map来实现离散化的方法其实是最简单但是最慢的方法,以这道题为例,map导致时间消耗有点大,不吸氧只有70分,吸氧后才能AC。
大体总结了一下,离散化有三种方式
1.直接用map来实现,最简单但是最慢
2.用自己写的HASH函数来实现,最麻烦但是最快
3.去重后排序,并用手写二分查找或lower_bound来获取索引。这个方法不快不慢不简单不复杂,适中。
以后要学习一下后两个方案
后续
我在做另一道橙色离散化模版题时无意间知道了unordered_map的存在,这是c++11标准引入的一个基于hash的新map,直接把查找的时间复杂度从O(logn)降低到了O(1),我在源代码的map前加了一个unordered_就直接能在不吸氧的情况下AC了!!!太妙了,这意味着我无需学习hash表就可以使用hash表!!!不过需要注意必须是c++11标准才可以使用,以及还需要注意头文件是unordered_map而不是map!
需要吸氧的Code
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <map>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
struct DSUs//这不是一个并查集,这是一个元素离散化的不相交集合的集合,即DSUs
{
private:
map<int,int> f;
map<int,int> d;
inline void insert(int a){if(f.find(a)==f.end())f[a]=a,d[a]=1;}//私有动态初始化函数,不应该被外部访问
public:
DSUs(){}
void merge(int a,int b)
{
insert(a);insert(b);
int A=find(a),B=find(b);
if(A!=B)
{
if(d[A]>=d[B])f[B]=A;
else f[A]=B;
if(d[A]==d[B])d[A]++;
}
}
inline int find(int a)
{
insert(a);
if(f[a]==a)return a;
else
{
f[a]=find(f[a]);
return f[a];
}
}
inline void clear()
{
f.clear();
d.clear();
}
};
DSUs uf;
int n,a[1000000+5],b[1000000+5],c[1000000+5];
int main()
{
int t;
std::ios::sync_with_stdio(false); std::cin.tie(0);
cin>>t;
for(int i=1;i<=t;i++)
{
cin>>n;
for(int j=1;j<=n;j++)
{
cin>>a[j]>>b[j]>>c[j];
}
for(int j=1;j<=n;j++)
if(c[j]==1)
uf.merge(a[j],b[j]);
int flag=1;
for(int j=1;j<=n;j++)
{
if(c[j]==0)
{
if(uf.find(a[j])==uf.find(b[j]))
{
flag=0;
break;
}
}
}
if(flag==1)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
uf.clear();
}
return 0;
}
无需吸氧的AC-Code
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <unordered_map>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
struct DSUs//这不是一个并查集,这是一个元素离散化的不相交集合的集合,即DSUs
{
private:
unordered_map<int,int> f;
unordered_map<int,int> d;
inline void insert(int a){if(f.find(a)==f.end())f[a]=a,d[a]=1;}//私有动态初始化函数,不应该被外部访问
public:
DSUs(){}
void merge(int a,int b)
{
insert(a);insert(b);
int A=find(a),B=find(b);
if(A!=B)
{
if(d[A]>=d[B])f[B]=A;
else f[A]=B;
if(d[A]==d[B])d[A]++;
}
}
inline int find(int a)
{
insert(a);
if(f[a]==a)return a;
else
{
f[a]=find(f[a]);
return f[a];
}
}
inline void clear()
{
f.clear();
d.clear();
}
};
DSUs uf;
int n,a[1000000+5],b[1000000+5],c[1000000+5];
int main()
{
int t;
std::ios::sync_with_stdio(false); std::cin.tie(0);
cin>>t;
for(int i=1;i<=t;i++)
{
cin>>n;
for(int j=1;j<=n;j++)
cin>>a[j]>>b[j]>>c[j];
for(int j=1;j<=n;j++)
if(c[j]==1)
uf.merge(a[j],b[j]);
int flag=1;
for(int j=1;j<=n;j++)
{
if(c[j]==0)
{
if(uf.find(a[j])==uf.find(b[j]))
{
flag=0;
break;
}
}
}
if(flag==1)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
uf.clear();
}
return 0;
}
P1955【绿】的更多相关文章
- 如何优雅使用Sublime Text3(Sublime设置豆沙绿背景色和自定义主题)
♣Sublime Text3软件的下载 ♣设置字体的大小 ♣设置背景色和关键字颜色(Color Scheme 生成器) ♣快速生成html头文件 1.Sublime Text3软件的下载地址和包含的文 ...
- Adobe Reader/Acrobat修改页面底色为豆沙绿
Adobe Acrobat_Pro_8修改PDF页面底色为豆沙绿保护视力(同样适用于Adobe Reader) http://jingyan.baidu.com/article/9989c746189 ...
- 通过sougou输入法,解决卡在Setup Wizard(小绿人)界面
本人使用海信EG900手机(安卓2.3.5,已root),为了使用google的服务,先后手动复制和CWM recovery刷入google服务包(gapps-gb-20110828-signed.z ...
- 紫橙绿蓝的jQuery幻灯片切换
效果展示 http://hovertree.com/texiao/jquery/77/ 看惯了左右切换的幻灯片,何问起向您推荐一个新颖的,旋转切换,通过点击按钮的相应区域可以使幻灯片以旋转的方式来 ...
- Win7下如何设置护眼的电脑豆沙绿界面?保护眼睛的颜色设置教程
关爱心灵的窗户——眼睛! 随着科技发展,使用电脑的人越来越多,由于使用电脑时间过长,我们的眼睛也越发容易疲劳,干燥.如何才能使电脑对人眼的伤害减小到最 小. 小编建议大家可以把窗口背景色设置成护眼色. ...
- 傻瓜式十分钟免费开启 HTTPS,是时候为你的站点加上小绿锁了
http://gold.xitu.io/entry/57df65690bd1d00057f9455b?from=singlemessage&isappinstalled=0 原文链接:http ...
- WPF:定制Checkbox样式,让“正确”绿得好看,让“错误”红的显眼
WPF提供了样式.模板.触发器.状态管理.矢量形状等方式,让我们不需要背景图片,也可以轻松定制控件的风格样式.下面是笔者针对Checkbox进行的样式定制,让“正确”绿得好看,让“错误”红的显眼. ...
- QQMusic绿钻兄,你可安好?我需要晴天。
不好意思,年纪这样大了,还依靠吐槽来保持呆毛的正能量,实在对不住,先说对不起. QQMusic是我最喜欢的腾讯增值服务,正版内容,海量歌手,高清下载.实在是音乐软件中高大上的典范,除了歌手排名中前十中 ...
- [汇编语言]-第九章 在屏幕中间分别显示绿底红色,白底蓝色字符串"welcome to masm!"
;在屏幕中间分别显示绿色,绿底红色,白底蓝色字符串"welcome to masm!" assume cs:codesg,ds:datasg,ss:stacksg datasg s ...
- 刷爆github小绿点
转载请注明出处:https://ahangchen.gitbooks.io/windy-afternoon/content/kit/git/green_blush.html 工程地址,欢迎star!! ...
随机推荐
- Vue源码学习(十八):实现组件注册(一)Vue.component()和Vue.extend()
好家伙, 0.完整代码已开源 https://github.com/Fattiger4399/analytic-vue.git 1.思路 1.1.什么是组件化? Vue 组件化是指将复杂的应用程序拆分 ...
- MySQL笔记01: MySQL入门_1.3 MySQL启动停止与登录
1.3 MySQL启动停止与登录 1.3.1 MySQL启动与停止 MySQL数据库分为客户端和服务器端,只有服务器端服务开启以后,才可以通过客户端登录MySQL服务端. 首先,以管理员身份运行&qu ...
- VO、DTO、Entity的区别
只能说从实际用法的一般习惯上进行区分: 1.entity 里的每一个字段,与数据库相对应,注意:entity与对应的实际数据库表的字段 没有强制要求但是一般建议保持一致(包括字段数据类型),当然,从实 ...
- VMware安装虚拟机详细步骤
在VMware中安装CentOS7 01.目录 CentOS7的下载 CentOS7的配置 CentOS7的安装 CentOS7的网络配置 自动获取IP 固定获取IP 02.安装前提 准备工作: 提前 ...
- Selenium查找元素、元素的属性和方法
查找元素 官方文档:https://www.selenium.dev/documentation/webdriver/elements/locators/ 一般通过find_element或者find ...
- 学一点关于JVM类加载的知识
要研究类加载过程,我们先要知道关于 Java 处理代码的流程是怎么样的. 第一步:编写源代码 这一步是我们最熟悉的,就是我们在 idea 上写的业务代码,生成 Example.java 文件. pub ...
- 【笔记】负载均衡Robbin之不同服务使用不同的策略
裂开裂开,搞这么久忘记导入依赖 妈卖批 又不报错 还能让我玩 我以为全部导入了. 话不多说,开始演示. 介绍 给不同的服务 配置 不同的 负载均衡策略 这里使用 用户模块 进行访问其它两个模块的con ...
- Java 新技术:虚拟线程使用指南(二)
虚拟线程是在 Java 21 版本中实现的一种轻量级线程.它由 JVM 进行创建以及管理.虚拟线程和传统线程(我们称之为平台线程)之间的主要区别在于,我们可以轻松地在一个 Java 程序中运行大量.甚 ...
- 【OpenVINO 】在 MacOS 上编译 OpenVINO C++ 项目
前言 英特尔公司发行的模型部署工具OpenVINO模型部署套件,可以实现在不同系统环境下运行,且发布的OpenVINO 2023最新版目前已经支持MacOS系统并同时支持在苹果M系列芯片上部署模型.在 ...
- 基于 Docker 打造前端持续集成开发环境
基于 Docker 打造前端持续集成开发环境 写在前面: 这不是一篇有新意的文章,因为这篇文章半年前我就发布在其他平台上过,为什么在知乎上旧文新发? 除了想要把发布在其他地方的文章统一放到知乎上之外, ...