Python枚举类型enum


为什么需要枚举

枚举(Enum)是一种数据类型,也是一种特别的类,是绑定到唯一值的符号表示,可以使用它来创建用于变量和属性的常量集枚举类可以看成是一个下拉菜单,给出特定的选项且这些选项不可修改,更贴近自然语言的方式表达数据,可以让代码更容易阅读、维护,减少转换或者错误值引起的问题,enum定义了四个类 Enum、IntEnum、Flag 和 IntFlag和一个装饰器unique()、辅助类auto

  • enum.Enum:创建枚举常量基类,即便定义int,成员也不是整型的,整型相关可以用Int相关类
  • enum.IntEnum:用于创建同时也是 int的子类的枚举型常数的基类
  • enum.IntFlag:创建可与位运算符搭配使用,成员是int的子类
  • enum.Flag:创建可与位运算符搭配使用,又不会失去 Flag成员资格的枚举常量的基类
  • 装饰器unique:确保一个名称只绑定一个值的 Enum 类装饰器
  • 辅助类auto:以合适的值代替 Enum 成员的实例。 初始值默认从 1 开始

如何使用枚举类型
通过继承enum.Enum定义一个枚举类型
import enum
# 继承Enum创建枚举类型
class Config(enum.Enum):
    # 定义枚举成员常量
    MAX = 1000
    MIN = 10


if __name__ == '__main__':
  	# 获取枚举成员、值、属性
    print(Config.MAX)  # Config.MAX
    print(Config['MAX']) # Config.MAX
    print(repr(Config.MAX))  # <Config.MAX: 1000>
    print(type(Config.MAX))  # <enum 'Config'>
    print(Config.MAX.name)  # MAX
    print(Config.MAX.value)  # 1000
    print(Config(1000)) # Config.MAX



# 通过API定义
Config = enum.Enum('Config',{MAX:1000})
'''
第一个参数是枚举的名称
第二个参数是枚举成员的来源,可以是字符串、元组、字典
'''

我们自定义的枚举类型继承Enum基类,之后还是通过Config.MAX获取得到的是枚举成员,通过.name和.value可以获得枚举成员对应的属性

在枚举类型中定义重复的枚举成员会抛出TypeError: Attempted to reuse key异常

在类的外部通过Config.MAX = 2的方式修改,会抛出AttributeError: Cannot reassign members异常


为枚举成员添加额外属性

我们通过.name和.value访问枚举成员的定义名称和值,也可以为枚举成员添加其他属性

获取枚举成员,可以通过key获取,也可以通过value获取枚举成员

if __name__ == '__main__':
    Config.MAX.msg = '最大值'
    Config.MIN.msg = '最小值'
		# 示例一
    print(Config.MAX.msg)  # 最大值
    print(Config.MIN.msg)  # 最小值
    
    # 示例二
    conf = Config.MAX
    print(conf.msg)  # 最大值
    
		# 示例三
    conf = Config(10)
    print(conf.msg)  # 最小值

枚举成员迭代

枚举支持按照定义顺序进行迭代

class Config(enum.Enum):
    MAX = 1000
    MIN = 10


if __name__ == '__main__':
    for number in Config:
        print(number) 
        '''
        Config.MAX
				Config.MIN
        '''

特殊属性 __members__ 可以迭代从名称到成员的有序映射,包含所有美剧中定义的所有名称,包括别名

# 1.不会给出别名
print(list(Config))  # [<Config.MAX: 1000>, <Config.MIN: 10>]

# 2.可以显示别名
for name,number in Config.__members__.items():
		print(name,number)
unique装饰器

定义枚举时,成员名称不允许重复,但是默认情况下,不同的成员值允许相同。但是两个相同值的成员,第二个成员的名称被视作第一个成员的别名,如果枚举中存在相同值的成员,在通过值获取枚举成员时,只能获取到第一个成员,如果我们想确保一个枚举类中的成员的值也不会重复,可以使用unique装饰器

@enum.unique
class Config(enum.Enum):
    MAX = 1000
    MIN = 10
    
'''
使用该装饰器后,如果有相同的值,会抛出ValueError: duplicate values found
'''
auto()

如果确切的值不重要,可以使用auto()生成值,值将由 _generate_next_value_() 来选择

_generate_next_value_默认是我们定义的最后一个int开始+1,如下示例,TIME的auto值则是11

_generate_next_value_可以重写,必须定义其他成员之前

class Config(enum.Enum):
    MAX = 1000
    MIN = 10
    TIME = enum.auto() # 11
    City = enum.auto() # 12
    

'''
自定义_generate_next_value_
'''
class Config(enum.Enum):
    def _generate_next_value_(name, start, count, last_values):
        return name  # 返回枚举成员的名字

    MAX = 1000
    MIN = 10
    TIME = enum.auto()  # TIME 
    City = enum.auto() # City
比较运算
# 枚举成员按标识号进行比较

Config.MAX is Config.MAX # True
Config.MAX is Config.MIN # False
Config.MAX == Config.MAX #True

#与非枚举值结果总数不相等
Config.MAX == 1000 # False

枚举类型使用事项
  • 枚举类不可实例化
  • 枚举成员是可哈希的,可以在字典和集合中使用
风月都好看,人间也浪漫.
本文转载于网络 如有侵权请联系删除

相关文章

  • React Hooks 源码解析(3):useState

    React源码版本:v16.11.0源码注释笔记:airingursb/react在写本文之前,事先阅读了网上了一些文章,关于Hooks的源码解析要么过于浅显、要么就不细致,所以本文着重讲解源码,由浅入深,争取一行代码也不放过。那本系列讲解第一个Hooks便是useState,我们将从useState的用法开始,再阐述规则、讲解原理,再简单实现,最后源码解析。另外,在本篇开头,再补充一个Hooks的概述,前两篇限于篇幅问题一直没有写一块。注:距离上篇文章已经过去了两个月,这两个月业务繁忙所以没有什么时间更新该系列的文章,但react这两个月却从16.9更新到了16.11,review了一下这几次的更新都未涉及到hooks,所以我也直接把源码笔记这块更新到了16.11。1.ReactHooks概述Hook是React16.8的新增特性,它可以让你在不编写class的情况下使用state以及其他的React特性。其本质上就是一类特殊的函数,它们约定以use开头,可以为FunctionComponent注入一些功能,赋予FunctionComponent一些ClassComponent所具备

  • Swiper轮播插件手动滑动后,无法自动切换的问题解决

    今天在写一个移动端的页面,使用swiper轮播插件写了一个banner轮播,并设置了自动滑动。var mySwiper = new Swiper('.swiper-container', {     direction: 'horizontal',     loop: true, // 循环模式选项     autoplay: true, // 自动切换      // 如果需要分页器     pagination: {         el: '.swiper-pagination',     }, })复制经过测试发现,手动滑动切换之后,自动播放不在起效,就无法自动切换了。查询相关资料发现,swiper有一个disableOnInteraction 属性:disableOnInteraction用户操作swiper之后,是否禁止autoplay。默认为true:停止。 如果设置为false,用户操作swiper之后自动切换不会停止,每次都会重新启动autoplay。 操作包括触碰,拖动,点击pagination等。根据官方

  • 机器学习之朴素贝叶斯算法

    1.朴素贝叶斯简介朴素贝叶斯(NaiveBayesian)算法能够根据数据加先验概率来估计后验概率,在垃圾邮件分类、文本分类、信用等级评定等多分类问题中得到广泛应用。对于多数的分类算法,比如决策树、KNN等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系。但朴素贝叶斯和多数分类算法都不同,朴素贝叶斯是生成算法,也就是先找出特征输出Y和特征X的联合分布P(X,Y),然后用P(Y|X)=P(X,Y)/P(X)得出。朴素贝叶斯算法的优点在于简单易懂、学习效率高,在某些领域的分类问题中能够与决策树相媲美。但朴素贝叶斯算法以自变量之间的独立性和连续变量的正态性假设为前提,会导致算法精度在一定程度上受到影响。2.朴素贝叶斯算法模型2.1统计知识回顾深入算法原理之前,我们先来回顾下统计学的相关知识。条件概率公式条件概率公式全概率公式经过上面统计学知识,我们能够得出贝叶斯公式。2.2朴素贝叶斯模型2.3朴素贝叶斯推断2.4朴素贝叶斯参数估计3.朴素贝叶斯算法流程从上面计算可以看出,朴素贝叶斯没有复杂的求导和矩阵运算,因此效率很高。但朴素贝叶斯假设数据特征之间相互独立,如果数据特征之间关

  • 学术生涯永不言弃!研究发现毅力和天赋同样重要

    【新智元导读】美国西北大学的一项新研究发现,在科学领域,天赋和毅力同样重要,那些在职业生涯早期遇到挫折但坚持不懈的研究人员,未来获得更大成功的可能性更大。1968年,哥伦比亚大学社会学家罗伯特•默顿(ROBERTMERTON)发现了科学界的一个现象,他称之为“马太效应”(Mattheweffect)。他观察到,相对于那些不知名的研究者,声名显赫的科学家往往能获得更多的资源和更好的机会,并因他们的工作获得不成比例的荣誉,从而产生累积优势,进一步获得更高的声誉和地位。与此同时,那些不知名的研究者往往只能为金钱和认可而苦苦挣扎。“马太效应”的名称来自圣经《马太福音》第13章第12节:“凡有的,还要加给他,叫他有余;凡没有的,连他所有的也要夺去。”马太效应无疑是真实存在的。但是,美国西北大学的YangWang、BenjaminJones和DashunWang等人最近的一项研究发现,在科学领域,成功并不总是孕育更多的成功,那些在职业生涯早期失败的科学家可能会从失败的经历中受益。作者们通过收集1990年至2005年间初级科学家向美国国立卫生研究院(NIH)提交的资助申请数据发现了这一点。他们特

  • 一个五年 Android 开发者百度、阿里、聚美、映客的面试心经

    花絮 也许会有人感叹某些人的运气比较好,但是他们不曾知道对方吃过多少苦,受过多少委屈。某些时候就是需要我们用心去发现突破点,然后顺势而上,抓住机遇,那么你将会走向另外一条大道,成就另外一个全新的自我。 先简单说说我最近的面试经历吧。面试的公司很多,其中有让我心血沸腾的经历,也有让我感到失望到无助的经历,我将这些体会都记录下来,细想之后很值得,面了这么多公司,要是最后什么也没有留下来,那就太浪费了。至少对于我来说有些东西在整理总结之后才能得到一个肯定的答案。希望这些能对即将换工作或者打算看看机会的你有一些帮助。文末有面试和必备的技能点总结哦。 下文真的很长,你可以把这篇文章当做看小说一样,快速浏览一下,但是希望你能将文中提到的那些技能掌握。那也就不枉费我花了一两天时间专门整理这些。我的这些经验仅供参考,希望你能做的比我好,同时希望你在以后的面试中能轻松应对。 为何离职? 先从我的换工作的动机开始说吧。 公司裁员的时候老大说:『你就留下好好干吧,以后不管公司怎么分股票、期权,肯定少不了你。』我非常信任我的老大,跟着老大一起工作,感觉是一种享受。 但是没想到裁员后,公司内部大动荡,主业务线从

  • 002.css常用基础知识点

    CSS初识CSS(CascadingStyleSheets)美化样式CSS通常称为CSS样式表或层叠样式表(级联样式表),主要用于设置HTML页面中的文本内容(字体、大小、对齐方式等)、图片的外形(宽高、边框样式、边距等)以及版面的布局等外观显示样式。CSS以HTML为基础,提供了丰富的功能,如字体、颜色、背景的控制及整体排版等,而且还可以针对不同的浏览器设置不同的样式。引入CSS样式表(书写位置)CSS可以写到那个位置?是不是一定写到html文件里面呢?内部样式表内嵌式是将CSS代码集中写在HTML文档的head头部标签中,并且用style标签定义,其基本语法格式如下:<head> <styletype="text/CSS"> 选择器{属性1:属性值1;属性2:属性值2;属性3:属性值3;} </style> </head>复制语法中,style标签一般位于head标签中title标签之后,也可以把他放在HTML文档的任何地方。type=”text/CSS”在html5中可以省略,写上也比较符合规范,所以这个地方可以

  • 教你从零基础开始做一名前端开发工程师

    软件开发工程师在行业外大众的眼里,或许是一个出众的职业,收入不低,技术含量还挺高,就连我自己刚入行时也是这么认为的,但事实上并不确切。任何行业中,只要是在金字塔顶端的那部分,都是令人羡慕的,然而,那是需要天赋、机缘、心血、实力的。但如果仅仅只是想入行,就没那么苛刻了,尤其是软件开发行业,更容易。做一件事情轻松还是坚难,使用什么样的方法不可忽视,我以一个过来人的身份分析能如何正确快速的踏入软件开发这个行业。许多人认为开发软件是一件只有聪明人才能做的事情,这只是一个刻板印象,跟IT行业发展的速度太快有关系。二十年前,在中国绝大部份人可能连电脑是长什么样的都还不知道,仅仅几年后,电脑飞速普及,每家必备。然而,要使用这部机器,必须经过专业的培训,连开关机时先按显示器开关还是先按主机开关都有很深的学问,这不仅难度高,而且还很神秘。更别说里面装的软件了,不经过长期专业的指导,根本玩不来。从正常的逻辑上的看「使用软件都这么难了,那制造软件门槛不是要高到天上去了」事实上,开发软件和使用软件之间并没有什么必然的关联,更不是老子和儿子的关系。有时候使用某个软件会很困难,而开发某类软件却很容易,还有的时候却

  • 8pt栅格系统 - 1. 设计入门

    介绍 此文意在帮助设计师快速而统一地完成界面布局。尤其对尺寸固定的移动界面有帮助,但对响应式web设计也有帮助。与一般的设计指南相比,此文更适合一边设计一边阅读。 代码>原型设计软件和原型工具让你创造界面看起来最好的样子。但是对于数码产品,原型的目的是向老板和开发者进行清晰的方案沟通。最后,只有开发者的代码,能够让这个方案成为产品。现在,几乎你在设计工具上做的所有东西都可以用代码创造出来,但是总有些因素让设计方案很难实施(可能是可用性、加载时间、展示效果等)。不论如何,最重要的是你的设计能通过代码在用户的设备商运行。所以应该优先考虑在使用Sketch和Photoshop时,尽可能缩短在思考方案与编程之间的时间。Box模型Box模型是一种描述物体尺寸和空间的形式,其包含四种信息:边框、外边距、内边距和元素本身的尺寸。边框元素边边缘轮廓线的粗细。大部分的设计工具不允许其影响整体的空间和尺寸。内边距元素与其包含的子元素之间的空间。外边距元素边界与其相邻物体之间的空间。什么是ptpt(point的缩写)是一种与屏幕分辨率相关的空间度量单位。最简单的解释就是在“1×(1倍)”分辨率下,1p

  • 谨记四点选择适合云存储

    云存储已经成为我们现代生活中手机的一个重要的组成部分。如谷歌Drive,Dropbox,OneDrive,iCloud等,都在争先恐后的抢夺用户将重要信息存储在自己的服务器上。但是哪一个最适合你呢?这篇文章将告诉你如何选择最好的云存储服务。随着越来越多的人开始拥有多台计算设备——笔记本,平板电脑和智能手机,您的数据仅放在台式PC上的方式已经过时,云存储已经可以帮你摆脱这种限制,确保你可以在需要的时候能够在任何时间任何地点访问文件。今天,采用免费的云存储服务,能够通过手机的智能终端访问你的位置,能够同步跨越多个设备浏览。让用户网上协同办公的以实现。利用云存储,你可以很容易的通过在线存储共享大文件给朋友,而不会出现因为附件太大而被电子邮箱退回等事情。如何选择合适的云存储服务现在云存储提供商有很多,而且这些厂商大多提供了免费存储空间,但是还是有一些因为我们需要注意的,下面就来让我们看一下选择云存储的时候需要注意哪些事件。1.可靠性可靠性关系到你的服务的好坏,比如,如果云存储出现访问中断的时候,那么你又急需要访问里面的数据,那么可能就会让你抓耳挠腮,着急是小事,耽误了公司的业务的损失则是大事。

  • 我的写作工具链

    工欲善其事,必先利其器v4:201801更新内容:数据可视化(五)基于网络爬虫制作可视化图表基于Node.js实现程序化文本编辑基于Graphviz实现程序化绘图图片处理(Photoshop):批处理与动作Bloggenerator(hexo):优化内容页脚模版、修复google/baidusitexml问题、修复https兼容问题扩展Markdown源文件编辑工具集(nodejs-based)前期需求:1)源文件持续修改中出现的回归编辑工作,互相引用的链接较多2)兼容现有的BlogGenerator(Hexo)便于融合使用3)支持command-line模式便于调用后续目标:1)专题模板一次编辑,多处插入2)主体自动聚合,类似维基(Templatetalk)varfs=require('fs-extra'); varpath=require('path'); //Allpathsarerelativetopackage.json. varpagesPath='./source/_posts'; varcopyFolders

  • Nginx服务配置篇·第四课:NextCloud优化整合

    前景概要上一篇文章我们安装完Nextcloud,打造了你的第一个私人网盘,但是会发现在“设置”-“概览”页面,依然会有一些设置上的警告。这篇文章会一个一个进行处理,达到所有检查都通过并针对性地优化服务器。安全与警告界面一、缓存推荐Redisaptinstallredis复制修改config配置文件:vim/var/www/nextcloud/config/config.php复制在最后)前加入: #开启缓存,分类型同时使用APCU和REDIS。 'memcache.local'=>'\\OC\\Memcache\\APCu', 'filelocking.enabled'=>true, 'memcache.locking'=>'\OC\Memcache\Redis', 'memcache.distributed'=>'\OC\Memcache\Redis', 'redis'=>[ &#x

  • 关于mariadb远程连接授权的设置

    1.首先配置允许访问的用户,采用授权的方式给用户权限 1 GRANTALLPRIVILEGESON*.*TO'root'@'%'IDENTIFIEDBY'123456'WITHGRANTOPTION;  说明:root是登陆数据库的用户,123456是登陆数据库的密码,*就是意味着任何来源任何主机反正就是权限很大的样子。 2.最后配置好权限之后不应该忘记刷新使之生效 1 flushprivileges;  再次访问就可以了吧。 3、可以不需要密码直接登陆数据库。登陆更新密码即可。 MariaDB[mysql]>UPDATEuserSETpassword=password('newpassword')WHEREuser='root'; MariaDB[mysql]>flushprivileges; 更新密码后,在跳过授权启动时也不能空密码直接登陆了。复制

  • &ldquo;享受&rdquo;英语的快乐&mdash;我是如何学英语的

    一:扬长避短重新认识英语课本复制目前市场上的课本都有弊端,《新概念》《走遍美国》《疯狂英语》等等,不怪你学不下去,不是你的问题,课本本身就有漏洞的,但我怎么学的呢,我来简要介绍下我的方式,大家互相切磋!先说课本《新概念》本身从第二套,和第三套之间就跨度很大,你说要提高阅读和口语能力,新概念本身就是书面语言的标准范本,不是生活中的口语,句子结构形式复杂,叠级组合比较多,是书写语言地道的用法,词汇讲究,值得学习,怎么说呢,我没太背过新概念,原因很多,但是我看过的,好教材,值得下工夫去学的,根据你的具体情况,你不必太花精力在第一册上纠缠,好好把第二册学会,但方式必须改革下,我介绍下,我如何处理第二册的。生活中的口语是灵活的,短小的为主,而新概念强调的是句子的组合变化,所以呢,学的时候,可以按课本来学,但是呢,实际说话的时候,要将长的句子变化分解开,比如说,定语从句,将从句部分分解开,成两个句子,这样短小些,书面表达时候,再将短句子组合起来,用从句去表达,这样呢,新概念如何在口语和书面语的转化就一目了然了,我的建议!复制《走遍美国》是套经典,但是需要有扎实的基础才可以,新概念第二册学完,再学学

  • selenium常用的API(五)获取title、刷新、前进和后退

    获取网页title的属性值 #encoding=utf-8 fromseleniumimportwebdriver importunittest importtime classVisitUrl(unittest.TestCase): defsetUp(self): self.driver=webdriver.Ie(executable_path="e:\\IEDriverServer") deftest_getTitle(self): url="http://www.baidu.com" self.driver.get(url) #调用driver的title属性获取页面的title属性值 title=self.driver.title #断言页面的title属性值是否是“百度一下,你就知道” self.assertEqual(title,u"百度一下,你就知道","页面title属性值错误!") deftearDown(self): self.driver.quit() if__name__=='__main__': unittest.main()复制 刷新页面 d

  • 终于理解了函数式技术

    今天在随便看一些文章及思考的时候,突然就悟到了,这种感觉就象当年某一天领悟了面向对象。哈哈,我终于打通了任督二脉. 顺便看下,园龄刚好10年了。 当年理解面向对象后随手写了这篇: http://www.cnblogs.com/DSharp/archive/2005/01/28/98632.html 面向对象编程的两顶帽子  其实就是理解了面向对象的根本,定义和实现的两个面,通过接口关联了起来。世界都是通过这种方式来分类呈现的。所谓易经的阴和阳,阴阳转化不过如此。   今天领悟到的,就是易经里的那个不易,不变,就是函数式,函数的不变性,一致性,函数作为描述抽象及原理的,作为第一类的函数firstfunction,就是终极。 所有的变化,最后都通过函数串了起来。而变化的后面,就是不变,以不变应万变。函数就是相当于太极,无级就图灵机,Lambda,太极就是函数。 易有太极,始生两仪,两仪生四象,四象生八卦。 函数产生了定义及调用。又产生了参数和返回值。最后组成了对象的定义和实现,然后派生了整个计算机世界。 可见,函数式编程的firstfunction,改为allfunct

  • MySQL——基本安装与使用

    基本安装 下载地址:https://dev.mysql.com/downloads/mysql/ 选择解压版本:mysql-5.7.21-winx64.zip 以管理员身份打开cmd(除了安装服务不要以此身份打开)切换到解压目录下的bin目录下 初始化数据所需文件以及获取一个临时的访问密码: mysqld‐‐initialize‐‐user=mysql‐‐console;此时会出现一个临时密码,复制粘贴到别处后面会用到,解压目录下会出现一个data文件夹 将MySQL安装为服务可以指定服务名称:mysqld ‐‐install MySQL,服务安装成功,在计算机服务面板看到 启动服务:netstartMySQL,开发时可以设为手动启动,自动启动的话每次重启计算机都会打开 通过用户名密码进入MySQL操作环境:mysql‐uroot‐p,会提示Enterpassword,将刚才保存的密码复制进来,之后进入了,mysql操作环境 设置数据库访问密码,一定要加分号:mysql> set password for r

  • 豆瓣电影爬虫

    importrequests classDoubanSpider(object): def__init__(self): self.url='https://movie.douban.com/j/chart/top_list?' self.headers={ "Accept":'*/*', "Accept-Encoding":'gzip,deflate,br', "Accept-Language":'zh-CN,zh;q=0.9', "Connection":'keep-alive', "Cookie":'bid=8-nCfhrghnU;__yadk_uid=YRJL4YjOgUBe7yEo3opPsDvJqnarI2oM;trc_cookie_storage=taboola%2520global%253Auser-id%3D8fc3589f-2abb-45b3-b21f-dabdd8ad9733-tuct3e78214;ll="108309";ap_v=0,6.0;__utma=30149280.2076664567.1559562682.1559562682.1563870087

  • 你的博客被搜索引擎收录了吗?

    持续原创输出,点击上方蓝字关注我 目录 前言如何判断自己的博客被百度收录了?如何操作? 准备一个百度站长账号验证网站所有权HTML验证生成站点地图如何自动推送?总结 前言 大部分人写博客都希望让别人访问到,但是GitHub和Coding都做了防爬虫的处理,因此我们托管在其上的博客就无法被搜索引擎收录,需要我们手动提交。 今天作者就来介绍下如何才能让度娘收录你的博客。作者的博客是HEXO+GitHub搭建的,主题是NEXT,虽说各种主题不一样,但是大致步骤相同,要学会举一反三。 如果觉得NEXT主题不错的朋友,可以切换主题,之前出过一篇NEXT主题优化的教程:女朋友看了我的博客,说太LOW了,于是我折腾了一天~ 如何判断自己的博客被百度收录了? 判断自己的博客有没被百度收录很简单,搜索site:域名,比如site:www.baidu.com。 如果搜索出结果,则表明被百度收录了,如下我的博客: 如何操作? 操作步骤还是挺复杂的,但是跟着一步一步总能成功,下面将会逐一介绍。 准备一个百度站长账号 已经有的不用申请了,没有的注册一个,注册地址:https://ziyuan.baid

  • Powershell 脚本错误日志

    try{Get-AD*>&1}catch{Get-Date|Add-ContentC:\ScriptErrors.txt$_|Add-ContentC:\ScriptErrors.txt"----------------------------------------------------------------------------------------"|Add-ContentC:\ScriptErrors.txt}

  • Luogu P4114 Qtree1

    树剖一好题。我心水了ww 题目描述 给定一棵n个节点的树,有两个操作: CHANGEiti把第i条边的边权变成ti QUERYab输出从a到b的路径中最大的边权,当a=b的时候,输出0 输入输出格式 输入格式: 第一行输入一个n,表示节点个数 第二行到第n行每行输入三个数,ui,vi,wi,分别表示ui,vi有一条边,边权是wi 第n+1行开始,一共有不定数量行,每一行分别有以下三种可能 CHANGE,QUERY同题意所述 DONE表示输入结束 输出格式: 对于每个QUERY操作,输出一个数,表示ab之间边权最大值 复制 树链剖分维护。若对应的一组父亲节点\(x\)与子节点\(y\)之间有一条边,则将边权存为\(y\)点的点权。在dfs2内特殊处理即可。 对于修改,线段树动态维护一下最大值。 查询路径最大值按照常规树剖的跳链写法就可以了。由于是边权存为点权,不能计算最近公共祖先。\(LCA\)所代表的那条边并不在路径上qwq #include<algorithm> #include<iostream> #include<cstring>

  • margin缩写

    CSS样式上下、左右、上下左右缩写简写优化 一、记忆要领: 上(top) 左(left)右(right) 下(bottom) 按照上面图形:顺时针排序 即为margin:toprightbottomleft 二、举例说明 toprightbottomleft(值都不同) margin-top:10px; margin-right:20px; margin-bottom:30px; margin-left:40px; 缩写:margin:10px20px30px40px; toprightbottomleft(值相同) margin-top:10px; margin-right:10px; margin-bottom:10px; margin-left:10px; 缩写:margin:10px; toprightbottomleft(rightleft值相同) margin-top:10px; margin-right:20px; margin-bottom:30px; margin-left:20px; 缩写:margin:10px20px30px; 附加: 原始:ma

相关推荐

推荐阅读