暑假OI做题笔记

Luogu

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]),累加即得答案

P1972 HH的项链

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

P4054 计数问题

题意翻译:给个二维数组,修改 $ (i,j) $ 的权值,求 $ (x1,y1)$ 到 $ (x2,y2)$ 权值为 c 的数的个数
知识点:树状数组
做法:注意到权值范围很小,所以可以建若干个二维树状数组来做

P6225 异或橙子

题意翻译:给定一序列,单点修改,求 $ [l,r]$ 子区间异或和的异或和
知识点:树状数组
做法:发现区间长度是偶数时,答案为 0;区间长度是奇数时,答案为 $ \bigoplus_{i=l+2k,k\in \mathbb{Z} }^r a_i $;故建两个奇偶的树状数组即可

P9473 西施江南

题意翻译:多测,给定一序列,记 \(g\)\(\text{GCD}_{i=1}^n a_i\)\(l\)\(\text{LCM}_{i=1}^n a_i\),问 \(l \times g\) 是否等于 \(\prod\limits_{i=1}^n a_i\)
知识点:数论
做法:发现必须满足 \(a_1 \dots a_n\) 两两互质才可以,所以用一个桶来装某个质数可被整除的次数,若大于一则不行,提前筛 \(10^8\) 以内质数即可

P1438 无聊的数列

题意翻译:给定一序列,区间加等差数列,单点查询
知识点:线段树
做法:对修改数列差分,转化为区间加和一个单点加,用线段树维护区间和得到单点修改值,加原序列值即可

P9498 equals

题意翻译:给定一棵以 \(1\) 为根的树,大小为 \(n\),要给每个结点赋一个 \(c_i\in \{0,1\}\) 使其满足 \(\sum\limits_{c_i=0}d_i = \sum\limits_{c_i=1}d_i\),问是否有解
知识点:树,构造
做法:先 DFS 求深度,令 \(sum=\sum\limits d_i\)。显然如果深度和为奇数时是没法做的,判掉。剩下的,把结点按深度从大到小排,从前往后扫,边扫边从 \(sum\) 中减去 \(d_i\)。显然这是可行的,因为深度是连续的,无论如何都能补上去

P3605 Promotion Counting P

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

Atcoder

ABC313C Approximate Equalization 2

题意翻译:给定一序列,每次操作为给序列中某数 \(+1\),另一数 \(-1\)。求使序列变成极差为 \(1\) 的序列的最小操作数。
知识点:贪心,构造
做法:显然这些数的和 \(sum\) 不变,所以最终序列最小值和最大值一定为 \(\left\lfloor\dfrac{sum}{n}\right\rfloor\)\(\left\lceil\dfrac{sum}{n}\right\rceil\)。贪心地,把小的变成目标最小值,大的同理。逐个作差,求最大值即可

Codeforces

CF1855B Longest Divisors Interval

题意翻译:多测,每次给一个数 $n \ (1 \le n\le 10^{18}) $,对于区间 \([l,r]\) 满足 \(\forall i \in [l,r]\),有 \(i | n\) 。求区间长度最大值。
知识点:数论,构造
做法:考虑合法区间 \([l,r]\),对于数 \(r-l+1\) 构成完全剩余系,故区间 \([1,r-l+1]\) 也一定合法,且一定是最优的。设第一个不是 \(n\) 的因子的数为 \(x\),则答案即为 \(x-1\)

CF1856B Good Arrays

题意翻译:给定一正整数序列 \(a\),问是否存在一个正整数序列 \(b\) 满足 \(\sum\limits a_i = \sum\limits b_i\) 且诸 \(a_i \not = b_i\)
知识点:贪心,构造
做法:贪心地想,考虑特殊数 \(1\),最小花费是 \(+1\),其他数的最优花费是 \(-a_i+1\)(节省出来给 \(+1\) 用),比较两个花费即可。若前者大于后者,则显然不存在

CF1858C Yet Another Permutation Problem & P9345 夕阳西下几时回

题意翻译:\(a_1,a_2, \dots ,a_n\)\(1\)\(n\) 的一个排列,记 \(d_i=\gcd(a_i,a_{i\bmod n+1})\),构造一个 \(\{a\}\),使 \(\{d\}\) 中不同元素的个数最大。
知识点:数论,贪心,构造
做法:首先显然有 \(\max(d_i)=\frac{n}{2}\),那么我们尝试构造出一个 \(\{d\}\) 使其中不同元素个数为 \(\frac{n}{2}\)。贪心地想,对于每一个未插入的数 \(x\)\(x \le \frac{n}{2}\),我们直接把 \(2x\) 插入 \(x\) 的后面,直到 \(2x\) 超过了 \(n\)。接着继续枚举。时间复杂度 \(O(n)=\sum n\)
吐槽:这也能重题?这不 unr?傻逼题目!
upd on the next day: 真的没有 unr……

CF1542B Plus and Multiply

题意翻译:若 \(x\) 在集合 \(S\) 中,则 \(x \times a\)\(x+b\) 也在 \(S\)中。多测,给定 \(a,b,n\),问 \(n\) 是否在集合 \(S\) 中。
知识点:数论
做法:显然 \(S\) 中的任意数 \(p\) 可以写成 \(p=a^x+qb\),故只需枚举 \(x\) 考察是否有 \((n-a^x) \bmod b =0\) 即可。注意特判 \(a=1\) 的情况

CF1542C Strange Function

题意翻译:记 \(f(i)\) 为最小的 \(x\) 满足 \(x\) 不是 \(i\) 的因子。多测,给定 \(n\),求 \(\sum\limits_{i=1}^nf(i)\)
知识点:数论
做法:显然有 \(f(i)=k\) 满足 \(\operatorname{lcm}(1,2,\dots ,k-1)\mid i\)\(k \nmid i\)。考虑容斥,易得对于 \(f(i)=k,i=1,2,\dots ,n\)\(i\) 的个数便有 \(\left\lfloor\dfrac{n}{\operatorname{lcm}(1,2,\dots ,k-1)}\right\rfloor-\left\lfloor\dfrac{n}{\operatorname{lcm}(1,2,\dots ,k)}\right\rfloor\),计算不同 \(k\) 对于答案的贡献即可。时间复杂度 \(O(T\log n)\)

CF1304C Air Conditioner

题意翻译:多测。给定一个数 \(m\),每过 \(1\) 秒你可以选择 \(+1\)\(-1\)。给定共 \(n\) 个时间点,你要在第 \(i\) 个时间点 \(t_i\) 使 \(m\) 满足 \(l_i \le m \le r_i\)。问每个时间点是否能成功。
知识点:模拟
做法:一个时刻时, \(m\) 的取值范围为 \([L,R]\),那么过了 \(d\) 时间取值范围则变成 \([L-d,R+d]\)。维护这个区间,按顺序处理客人即可。取交集判断 \(L\)\(R\) 大小即可

posted @ 2023-07-23 10:49  流浪者海斯t  阅读(40)  评论(0)    收藏  举报