暑假OI做题笔记

发布时间 2023-07-23 10:53:25作者: 流浪者海斯t

P1525 关押罪犯

题意翻译:给定一张图,将图中结点分为两个互补的集合,求集合间边权最小值
知识点:并查集
做法:对权值排序,尽量分成两个不同的集合(如果一方无敌人,则另一方成为其敌人;否则将另一方丢到另一监狱里面),出现矛盾时的权值即为答案

P2024 食物链

知识点:并查集
做法:
把每个动物分成 self,eat 和 enemy 三个域;
当 x 和 y 同类时,合并两者的对应域;
当 x 吃 y 时,有 \(x_{eat}=y_{self}\)\(x_{self}=y_{eat}\),$x_{self}=y_{enemy} $
再判断矛盾情况即可

P1955 程序自动分析

题意翻译:给定若干个未知量及它们之间的等量/不等关系,问能否满足所有关系
知识点:并查集
做法:离散化,将关系按等量在前,不等在后的原则排序,判断是否出现矛盾

P1908 逆序对

题意翻译:求一个序列中逆序对的个数
知识点:树状数组
做法:权值树状数组,离散化,倒叙扫一遍序列,每次 get(a[i]-1),再 add(i,a[i]),累加即得答案

P3605 Promotion Counting P

题意翻译:求树上所有结点子树权值小于于子树根节点权值的数量(树上逆序对)
知识点:树状数组
做法:离散化,对树上结点 DFS,先求该结点权值目前排名,再求加入子节点权值到树状数组后排名,后者减前者即为答案

P1972 HH的项链

题意翻译:给定一序列,询问区间 $ [l,r]$ 内数的种类
知识点:树状数组
做法:离散化,对询问区间右端点从小到大排序,从上一个区间转到下一个区间时,删去转的过程中重复的数字的之前的位置上的数字,把新的数字加进权值树状数组中,查询时 get(r)-get(l-1) 即可