题目 | 题意 | 思路 | 代码 |
---|---|---|---|
奇数码问题 | 给定两个奇数码局面,判断是否可达。 | 将两个数码写成序列,求逆序对看奇偶性是否相同。 | 120 |
天才ACM | 给定一个序列,定义 [ l , r ] [l,r] [l,r] 的校验值为从中取出 2 m 2m 2m 个数(不够则取到不能取为止),使得“每对数的差的平方”之和最大。求至少将序列分成多少段,使得每段的校验值不超过 T T T。 | 这题真正把二分和倍增拉开差距了。如果用二分,每次需要 O ( n log n ) O(n\log n) O(nlogn) 的时间,那么如果段很小,那么需要 O ( n 2 log n ) O(n^2 \log n) O(n2logn),如果用倍增,只需要将其拆解成 log \log log 段,每段是 O ( n log n ) O(n\log n) O(nlogn),那么则只需 O ( n log 2 n ) O(n\log^2 n) O(nlog2n),效率远超二分。如果再用二路归并优化,只对新增部分排序,那么可以进一步优化成 O ( n log n ) O(n\log n) O(nlogn)。 | 121 |
题目 | 题意 | 思路 | 代码 |
---|---|---|---|
起床困难综合症 | 给定若干次与、或、异或运算,在 1 ∼ m 1\sim m 1∼m 中选择一个整数,使得依次进行这些运算结果最大。 | 考虑到每一位是独立的,而二进制中高位一定比低位重要。所以考虑从高往低。预处理出每一位初始是 1 , 0 1,0 1,0 时最终的结果,如果填零时答案为 0 0 0 或填什么都是 0 0 0,那么没必要填 1 1 1,这样后面可以填更大;否则还需保证剩余的 m m m 范围足够,就填 1 1 1,同时 m m m 减去位权。 | 119 |
题目 | 题意 | 思路 | 代码 |
---|---|---|---|
进位 | 规定 popcount ( x ) \text{popcount}(x) popcount(x) 表示 x x x 在二进制表示下所含 1 1 1 的个数。有一个二进制数 B B B(以一个长为 n n n 的 01 01 01 字符串形式给出)和长为 m m m 的序列 a a a。还需要对 B B B 进行 m m m 次操作。其中,第 i i i 个操作为 B ← B + 2 a i B \gets B + 2^{a_i} B←B+2ai,其价值 v i v_i vi 为 B B B 在操作前后变化的位置数量,即 v i = popcount ( B x o r ( B + 2 a i ) ) v_i = \operatorname{popcount}(B \mathbin{\mathrm{xor}} (B + 2^{a_i})) vi=popcount(Bxor(B+2ai))。解决两个问题:任意安排操作顺序,问在执行所有操作后, ∑ i = 1 m v i \displaystyle \sum_{i=1}^mv_i i=1∑mvi 最大为多少?任意安排操作顺序,问在执行所有操作后, max i = 1 m v i \displaystyle \max_{i=1}^mv_i i=1maxmvi 最大为多少? | 第一个操作的影响是任意的,顺序不会决定结果。而第二个需要根据连续进位次数取最大值。 | 29 |
[NOI Online 2021 入门组] 吃豆人 | 给定 n 2 n^2 n2 的点阵,求使用两个吃豆人能吃到的数字之和的最大值。每个吃豆人可以选择初始位置和初始方向(左上左下右上右下),然后碰到边界镜像反弹,一个数字最多被吃一次。 2 ≤ n ≤ 1000 , 0 ≤ a i , j ≤ 1000 2\le n\le 1000,0\le a_i,j\le 1000 2≤n≤1000,0≤ai,j≤1000 | 首先我们画一画图:容易发现,每个吃豆人吃豆的路线都是矩形框(除了最上面和最下面退化为线段)。于是,我们便可以把
n
n
n 种吃豆路线就算出来,然后任选两个路线,枚举怎样吃豆最多。不难发现,相交的点都是可以计算出来的,首先,两点之和
m
o
d
=
1
\mod =1
mod=1 则没有交点,其次两个矩形框出现四个交点,我们可以计算他们的坐标,在
O
(
1
)
O(1)
O(1) 时间内计算: x1=(i+j)/2 y1=(x1-i)+1 x2=x1+1-i y2=y1+i-1 x3=x1+n-j y3=y1+n-j x4=x3+1-i y4=y3+i-1 至此,四个点都计算出来了,就减掉,还有如果是一条直线一个矩形框的,把结果
÷
2
\div 2
÷2。 | 50 |
题目 | 题意 | 思路 | 代码 |
---|---|---|---|
Bassline | 给定 n n n 个区间,第 i i i 个区间是 [ l i , r i ] [l_i,r_i] [li,ri]。你需要选择两个整数 x ≤ y x\le y x≤y,满足:对于所有区间 [ l i , r i ] [l_i,r_i] [li,ri]( 1 ≤ i ≤ n 1\le i \le n 1≤i≤n),以下两个条件之一满足:1. [ x , y ] [x,y] [x,y] 被 [ l i , r i ] [l_i,r_i] [li,ri] 包含,换言之, [ x , y ] ∩ [ l i , r i ] = [ x , y ] [x,y]\cap[l_i,r_i]=[x,y] [x,y]∩[li,ri]=[x,y]。2. [ x , y ] [x,y] [x,y] 与 [ l i , r i ] [l_i,r_i] [li,ri] 无交集,换言之, [ x , y ] ∩ [ l i , r i ] = ∅ [x,y]\cap[l_i,r_i]=\varnothing [x,y]∩[li,ri]=∅。若有 k k k 个区间满足条件 1,则你的得分是 k ( y − x ) k(y-x) k(y−x)。输出你最大的可能的得分。 1 ≤ n ≤ 3 × 10 5 , 1 ≤ l i ≤ r i ≤ 3 × 10 5 1 \le n \le 3 \times {10}^5,1 \le l_i \le r_i \le 3 \times {10}^5 1≤n≤3×105,1≤li≤ri≤3×105 | 用样例举例子:可以发现如果我们选择的区间如果跨越了至少一个端点,那么这个区间必定不合法。但是还有一些边界情况,如 [ 3 , 4 ] [3,4] [3,4] 区间,它没有跨越任何一个端点,但它却是不合法的区间。这时可以发现还有一个充要条件是,如果 [ x , y ] [x,y] [x,y] 区间合法,那么 [ x + 1 , y ] [x+1,y] [x+1,y] 不含任意一个左端点, [ x , y − 1 ] [x,y-1] [x,y−1] 不含任意一个右端点。像 [ 4 , 5 ] [4,5] [4,5] 区间,因为 [ 5 , 5 ] [5,5] [5,5] 区间包含了一个左端点 5 5 5 ,所以它不合法,而 [ 7 , 8 ] [7,8] [7,8] 区间,因为 [ 7 , 7 ] [7,7] [7,7] 区间包含了 7 7 7 这个右端点,所以它也不合法。而要算一个点被几个点覆盖,只需要差分和前缀和即可计算。 | 28 |
最大的差 | 给定 3 N 3N 3N 个数,现在要从中删去 N N N 个,使得删除之后这个长度为 2 N 2N 2N 的序列的前 N N N 项的和减去后 N N N 项的和尽可能大。求这个差最大是多少。 n ≤ 1 0 6 , a i ≤ 1 0 9 n\le 10^6,a_i\le10^9 n≤106,ai≤109 | 可以考虑枚举一个点 k k k,对于它前面的数中的前 N N N 大,后面的数中的前 N N N 小作差即可。考虑扫两遍,用堆维护,外加前缀和。时间复杂度 O ( N log N ) O(N\log N) O(NlogN) | 73 |
题目 | 题意 | 思路 | 代码 |
---|---|---|---|
书的复制 | 把长度为 m m m 的数列分为 k k k 段,求各段的和中的最大值对应的方案,如果有多组解,输出字典序最小的方案。 1 ≤ k ≤ m ≤ 500 1\le k \le m \le 500 1≤k≤m≤500 | 这题与数列分段问题基本相似,求的是最大的一段最小。不过需要注意的一点是,这里要让前面的人少抄写,所以应该在判断时倒着分配书稿。 | 30 |
切绳子 | 有
N
N
N 条绳子,它们的长度分别为
L
i
L_i
Li。如果从它们中切割出
K
K
K 条长度相同的绳子,这
K
K
K 条绳子每条最长能有多长?答案保留到小数点后
2
2
2 位(直接舍掉
2
2
2 位后的小数)。
0
<
L
i
≤
100000.00
,
0
<
n
≤
10000
,
0
<
k
≤
10000
0 | 二分绳子的每段长,然后计算有多少段,如果多了,移动左指针(还可以大),少了反之,不过此题有精度问题,故结果 + 1 0 − 4 +10^{-4} +10−4 才好。 | 31 |
包裹快递 | 要将
n
n
n 个包裹分别送到
n
n
n 个地方,并分配给邮递员一个事先设定好的路线,需要按照路线给的地点顺序相继送达,且不能遗漏一个地点。得到每个地方可以签收的时间段,并且也知道路线中一个地方到下一个地方的距离。若到达某一个地方的时间早于可以签收的时间段,则必须在这个地方停留至可以签收,但不能晚于签收的时间段,可以认为签收的过程是瞬间完成的。求出车的最大速度最小是多少。
0
<
n
≤
2
×
1
0
5
0 | 二分它的速度,每次累加它已经用的时间,如果发现时间已经超过了最晚签收时间,那么直接返回,否则继续累加,如果出现比最早的签收时间还小,那么需要等到最早的签收时间,然后因为实数二分是永远分不完的,所以我们在它们的差相差很小是就可以停下了。 | 32 |
聪明的质监员 | 有 n n n 个 w i w_i wi 和 v i v_i vi 。给定 m m m 个区间 [ l i , r i ] [l_i,r_i] [li,ri],选出一个参数 W W W,对于一个区间 [ l i , r i ] [l_i,r_i] [li,ri], y i = ∑ j = l i r i [ w j ≥ W ] × ∑ j = l i r i [ w j ≥ W ] v j y_i=\sum\limits_{j=l_i}^{r_i}[w_j \ge W] \times \sum\limits_{j=l_i}^{r_i}[w_j \ge W]v_j yi=j=li∑ri[wj≥W]×j=li∑ri[wj≥W]vj,其中 j j j 为矿石编号。调整 W W W 的值,使得绝对值 s − ∑ i = 1 m y i s-\sum_{i=1}^m y_i s−∑i=1myi 最小。求出这个最小值。 1 ≤ n , m ≤ 200 , 000 1 ≤n ,m≤200,000 1≤n,m≤200,000, 0 < w i , v i ≤ 1 0 6 0 < w_i,v_i≤10^6 0<wi,vi≤106, 0 < s ≤ 1 0 12 0 < s≤10^{12} 0<s≤1012, 1 ≤ l i ≤ r i ≤ n 1 ≤l_i ≤r_i ≤n 1≤li≤ri≤n 。 | 首先此题直观为二分题,要二分的对象是 W W W,然后根据题目中的步骤算出检验值,判断是否比标准大,移动 l l l,否则移动 r r r,最后check一下两个值,相差值最小的选出,不过这样的复杂度是一个 log n × n × m \log n\times n\times m logn×n×m个区间,会超时。这里 m m m 次区间询问,我们可以在二分函数内 O ( n ) O(n) O(n) 前缀和,对于 m m m 个询问 O ( 1 ) O(1) O(1) 出解,这样复杂度可降为一个 log n × ( n + m ) \log n\times(n+m) logn×(n+m),可以通过本题。 | 33 |
关押罪犯 | 有两座监狱,一共关押着 N N N 名罪犯。怨气值表示某两名罪犯之间的仇恨程度。如果两名怨气值为 c c c 的罪犯被关押在同一监狱,他们俩之间会发生摩擦,并造成影响力为 c c c 的冲突事件。求重新分配罪犯后的影响力最大的冲突事件影响力的最小值。 N ≤ 20000 , M ≤ 100000 N\leq 20000,M\leq 100000 N≤20000,M≤100000。 | 二分最大怨气值,然后把比这个怨气值大的怨气关系进行二分图判定。 | 34 |
CF732D Exams | 一个人有 m m m 门科目需要考试,每一门科目需要 a [ i ] a[i] a[i] 的复习时间(复习时间可以不用连续),并且有一份 n n n 天的考试安排表,其中 d i d_i di 表示第 i i i 天能考第 i i i 门科目,假如 d i d_i di 为 0 0 0,就代表这一天没有任何科目的考试。试求这个人最少在第几天顺利通过所有考试?(注:这个人一天要么只能考试,要么就只能复习) ( 1 ≤ n , m ≤ 1 0 5 ) (1\le n,m\le 10^5) (1≤n,m≤105) | 二分完成天数,然后把不超过完成天数的每门课可以考的最后天数存下来,如果当天没有上课或者不是当门课最后天数,那么复习时间 + 1 +1 +1,否则查看当前复习时间是否够,如果发现有 1 1 1 次考试没时间准备,那么就不可行,挪动左端点,否则挪动右端点。 | 35 |
CF626C | 一群人在搭建积木塔。 有 N N N 个人 2 2 2 块 2 2 2 块往上搭,有 M M M 个人 3 3 3 块 3 3 3 块往上搭,每个人塔的高度都要大于 0 0 0,且高度各不相同,问最高的塔高度的最小值。 ( 0 ≤ n , m ≤ 1 0 6 ) (0\le n,m\le10^6) (0≤n,m≤106) | 二分最高的塔高度 h h h,判断是否可行先判断 h ≥ 2 n h\ge 2n h≥2n(保证 n n n 个人 2 2 2 块 2 2 2 块往上搭可行), h ≥ 3 m h\ge 3m h≥3m(保证 m m m 个人 2 2 2 块 2 2 2 块往上搭可行), h ÷ 2 + h ÷ 3 − h ÷ 6 ≥ n + m h\div2+h\div3-h\div6\ge n+m h÷2+h÷3−h÷6≥n+m(保证互相重合的情况下总数要可行)。 | 36 |
apart | 有 n n n 个 a i a_i ai 和 b i b_i bi,你可以任意选择若干个 a i a_i ai 和 b i b_i bi,求 max ( min ( ∑ a i ( c h o o s e d ) , ∑ b i ( c h o o s e d ) ) ) − 10 c h o o s e d c n t \max(\min(\sum a_i(choosed),\sum b_i(choosed)))-10choosed_{cnt} max(min(∑ai(choosed),∑bi(choosed)))−10choosedcnt。 1 ≤ n ≤ 1 0 5 , 10 ≤ a i ≤ b i ≤ 1 0 4 1\le n\le 10^5,10\le a_i\le b_i\le 10^4 1≤n≤105,10≤ai≤bi≤104。 | 先考虑贪心。设选 a a a 个 a i a_i ai b b b 个 b i b_i bi,因为价格相同,优先选择价值高的 a i , b i a_i,b_i ai,bi,先排序,于是时间复杂度为 O ( n 2 ) O(n^2) O(n2), 70 70 70 分。考虑优化。因为结果是在两者之间取最小值再减成本,所以可以枚举 a a a ,如果要让 s u m a ≤ s u m b sum_a\le sum_b suma≤sumb ( s u m sum sum 表示前缀和),则可以用二分找到最小的 b b b,如果 s u m a > s u m b sum_a>sum_b suma>sumb,则把刚才求得的 b b b 即可。时间复杂度 O ( n log n ) O(n\log n) O(nlogn)。 | 37 |
题目 | 题意 | 思路 | 代码 |
---|---|---|---|
雷达探测 | 撤离路线可以看作一个长为
n
n
n 的序列,而敌方已将其
m
m
m 支奇袭小队部署在了撤离路线上!序列中的第
i
i
i 个数
a
i
a_i
ai 代表第
i
i
i 个位置存在一个敌方奇袭小队成员,他所属的奇袭小队编号为
a
i
a_i
ai。现在,你所在的车将从序列的第
1
1
1 个位置开到第
n
n
n 个位置,每到达一个新的位置
i
i
i,你都会使用雷达探测位置
i
−
b
i
i-b_i
i−bi 到位置
i
i
i 间的所有敌人(若
i
−
b
i
<
1
i-b_i<1
i−bi<1 则探测位置
1
1
1 到位置
i
i
i 间),由于连续使用雷达会导致雷达性能下降,序列
b
b
b 是单调不增的。对于每一次探测,你需要输出探测范围内,人数最多的奇袭小队内有多少人。
1
⩽
n
⩽
1
0
6
1\leqslant n\leqslant10^6
1⩽n⩽106,
1
⩽
m
⩽
1
0
5
1\leqslant m\leqslant10^5
1⩽m⩽105,
1
⩽
a
i
⩽
m
1\leqslant a_i\leqslant m
1⩽ai⩽m,
0
⩽
b
i
<
n
0\leqslant b_i | 因为序列 b b b 单调不降,考虑从后往前算。每个数字只会被插入或删除一次,肯定是线性的。不过要考虑的是如何快速算出最多的小队。 c n t i cnt_i cnti 表示数 i i i 出现了多少次, c c n t i ccnt_i ccnti 表示次数为 i i i 的数有多少个。 | 38 |
Rabbit | 给定一棵树,共
n
n
n 个点,分别编号为
1
∼
n
1\sim n
1∼n。每次操作,你需要选出三个点
a
,
b
,
c
a,b,c
a,b,c 将他们标记,满足:
c
c
c 是
a
a
a 到
b
b
b 简单路径上编号最大的点;
a
,
b
,
c
a,b,c
a,b,c 两两不同;
a
,
b
,
c
a,b,c
a,b,c 先前都没有被标记过。问至多能进行多少次操作。树上
p
p
p 到
q
q
q 的简单路径是指一个数列
a
1
,
…
,
a
k
a_1,\dots,a_k
a1,…,ak,满足:1.
a
1
=
p
a_1=p
a1=p,
a
k
=
q
a_k=q
ak=q;2. 其中没有重复元素;3. 对于所有
1
≤
i
<
k
1\le i | 考虑编号最大的点一定会成为一个 c c c,所以先考虑编号最大的点 x x x,但要怎么选 a , b a,b a,b 呢?可以考虑先删除这个点,裂成很多棵子树,先处理出它的子树,再看子树中有剩下节点的子树个数是否 ≥ 2 \ge 2 ≥2(注意这里不是剩余节点个数,因为这个三元组必须包含 x x x)。而这样做的时间复杂度为 O ( n 2 ) O(n^2) O(n2),可以考虑倒过来做,先把编号小的点处理好,再用并查集慢慢往上连边。而若可以拆除下面的匹配来完成和 x x x 的匹配是没必要的,因为我们只关心最大匹配数,这样做对答案没有影响。时间复杂度可以做到 O ( n α ( n ) ) O(n\alpha(n)) O(nα(n)),其中 α ( n ) \alpha(n) α(n) 是并查集的时间复杂度。 | 39 |
CF1385C Make It Good | 给定你一个长为 n n n 的序列 A A A ,请问要在这个序列中擦除长度为多少的前缀,才能使这个序列是一个好的序列。对好的序列的定义:假定有一个序列 B B B,你可以每次从序列的首项或末项取出一个数字放在序列 C C C 的末尾。假如存在一种方案使得 C C C 不降,那么 B B B 就是好的序列。 本题有 T T T 组数据。 1 ≤ T ≤ 2 × 1 0 4 , 1 ≤ ∑ n ≤ 2 × 1 0 5 1\leq T\leq 2\times 10^4,1\leq \sum n\leq 2\times 10^5 1≤T≤2×104,1≤∑n≤2×105 | 此题我们可以先从样例入手,观察样例中的好的序列,找到好的序列的规律,绘制成如下的图:从样例中的以上5幅分析图中,可以看出,好的序列分为几类:1.数列是有序的(升序降序均可)。2.呈一个先上升后下降的趋势(类似山峰的形状,或者说也可以有相邻元素出现相等,样例中告诉我们了)。于是我们可以从后往前扫,打标记,如果当前是降序就打上标记,代表已经不可能再出现升序了,如果出现打上标记并且出现升序了,就退出,然后我们把当前退出的位置-1就是我们要删除的数字前缀了(当然如果序列本身满足也没触碰到退出条件,自然退出,也不用担心出现负数)。 | 40 |
「TOCO Round 1」自适应 PVZ | 有 n n n 只僵尸,第 i i i 只僵尸在 l i l_i li 时刻出现,会在 r i r_i ri 时刻走进房子。有 m m m 个豌豆射手。若一个豌豆射手在 l i l_i li 至 r i r_i ri 时刻(不包括两个端点)持续攻击 i i i 僵尸则可以杀死 i i i 僵尸,但在攻击过程中不能攻击其他僵尸。求最少有几只僵尸会进入房子。 | 按照僵尸进入房子时间从小到大排序。可以假定 m m m 个豌豆射手的上次攻击时间 x x x 初始是 0 0 0,对于 1 1 1 只僵尸,若几个豌豆射手都能打,一定 max ( x ) \max(x) max(x) 来打,因为如果后面出现了一个出现时间较早的僵尸, x x x 小的豌豆射手就能打。 | 41 |
AT195D Shipping Center | 我们有 N N N个包裹和 M M M 个盒子,第 i i i 个包裹的大小和价值分别是 W i W_i Wi 和 V i V_i Vi。第 i i i 个盒子最多只能装一个大小为 X i X_i Xi 的包裹。给你 Q Q Q 组询问,每组包含两个整数 L L L和 R R R,请回答下列问题:在这 M M M 个盒子中,盒子 L , L + 1 , … , R L,L+1,\dots,R L,L+1,…,R 暂时不可用。请把包裹放进剩余的盒子(不一定要全放)并输出最大可能的总价值。 1 ≤ N , M , Q ≤ 50 , 1 ≤ W i , V i , X i ≤ 1 0 6 , 1 ≤ L ≤ R ≤ M 1\le N,M,Q\le 50,1\le W_i,V_i,X_i\le 10^6,1\le L\le R\le M 1≤N,M,Q≤50,1≤Wi,Vi,Xi≤106,1≤L≤R≤M | 先把物品按价值从大到小排序,再把箱子按照容量排序,然后枚举每一个物品,尽量把它放在容量小的箱子里并且满足箱子不在不可用范围内,如果能放就打标记,把价值加到结果里。 | 42 |
牛奶供应(二) | 有一家牧场,每天都会产出牛奶,在第 i i i 天,牛奶的产量为 p i p_i pi 。商人每天都会发来一张订单,在第 i i i 天,商人的订单收购量为 c i c_i ci,每天多余的牛奶会被保存下来加入库存中。订单具有两个特性,第一个是时效性,时效性是指,如果小爱不能在当天交货,则当天的订单就失效了。第二个是完整性,完整性是指,如果小爱的库存少于订单的需求量,则订单也是不能完成的。牧场收到订单时,可以忽略该订单,以满足其他订单需求。现给定 n n n 天,每天的牛奶的产量与订单的需求量,问牧场主最多满足多少张订单。 1 ≤ n ≤ 1 0 5 , 1 ≤ p i , c i ≤ 1 0 4 1\le n\le 10^5,1 \le p_i,c_i \leq 10^4 1≤n≤105,1≤pi,ci≤104 | 此题为反悔贪心,首先如果当前可以满足这个订单就满足,同时用 multiset 或 priority_queue 来存订单的需求量的最大值,如果后面有需求更低的订单,我们就把这个订单毁掉,拿回牛奶,用于这个需求更低的订单(我们肯定希望剩余牛奶越多越好)。 | 44 |
CF902B Coloring a Tree | 一棵树根顶点编号为 1 1 1 的树,每次可以选择一个子树染成同一个颜色,求染成目标状态的最小操作次数。 2 ≤ n ≤ 1 0 4 2\le n\le 10^4 2≤n≤104。 | 由于根节点终究是要改变的,如果它最后改变,会影响到它下面的点,故我们只要把父亲节点的颜色传给儿子节点,如果发现颜色不同,答案增加。 | 45 |
「一本通 1.1 练习 4」家庭作业 | 给定 n n n 个作业的完成期限和学分,求可以获得的最大学分。 n ≤ 1 0 6 n\le 10^6 n≤106,期限 < 7 × 1 0 5 <7\times 10^5 <7×105 | 用优先队列来维护学分最多的作业,对所有作业先按时间从小到大,再按价值从大到小。每次压入一个作业的学分,发现队列长度 > > > 当前时间,删除队首元素,最后把队内所有元素相加。 | 46 |
AT155E Payment | 给定正整数 N N N,设 f ( x ) f(x) f(x) 表示 x x x 在十进制下各个数位上的数的和,求一个正整数 x x x 满足 x ≥ N x\ge N x≥N 且最小化 f ( x ) + f ( x − N ) f(x)+f(x-N) f(x)+f(x−N)。 1 ≤ N ≤ 1 0 1000000 1\le N\le10^{1000000} 1≤N≤101000000。 | 考虑直接贪心,每一位分别讨论,如果 > 5 >5 >5,进 1 1 1 再减去;如果 < 5 <5 <5,扣掉。否则判断后一位 ≤ 5 \le 5 ≤5,进 1 1 1 位再减去,否则扣掉。 | 47 |
对答案 | 有 m m m 道判断题和 n n n 个人的答案( N \text{N} N 表示错, Y \text{Y} Y 表示对),有 x x x 个人得了满分, y y y 个人得了 0 0 0 分,还原出字典序最小的正确答案,无解输出 − 1 -1 −1。其中 1 ≤ n ≤ 3 × 1 0 4 , 1 ≤ m ≤ 500 , 0 ≤ x , y , x + y ≤ n 1\le n\le 3\times 10^4,1\le m\le500,0\le x,y,x+y\le n 1≤n≤3×104,1≤m≤500,0≤x,y,x+y≤n。 | 先用 hash \text{hash} hash 表预处理出每种字符串的出现次数,定义某个字符串的反串为每一位都与其不同的字符串,然后分类讨论。1. x > 0 x>0 x>0,遍历已有的所有种类字符串,判断这种字符串的出现次数是否 = x =x =x 和其反串的出现次数是否 = y =y =y,取最小的字符串。2. x = 0 , y > 0 x=0,y>0 x=0,y>0,同上,不过这里找的是全错的串,应该找最大的,取反。3. x = y = 0 x=y=0 x=y=0,按照字典序遍历所有字符串(注意不管有没有人作答出这种答案),然后判断字符串和其反串是否均为出现。时间复杂度: O ( n m ) O(nm) O(nm) | 49 |
珍珠帝王蟹 | 给定 n n n 个操作,每个操作可以令 x + a x+a x+a 或 x × a x\times a x×a, x x x 初始为 0 0 0,任意切换顺序,求 x x x 的最大值。 1 ≤ n ≤ 1 0 5 , 1 ≤ a b s ( a ) ≤ 1 0 6 1\le n\le 10^5,1\le abs(a)\le 10^6 1≤n≤105,1≤abs(a)≤106 | 出正数与负数和。然后分两种情况:乘数无负数和有负数。 无则把正数和与所有乘数相乘,加负数和。否则再分两种情况:负乘数有奇数个和偶数个。1.奇数个则把最大的负数乘负数和,加正数和,乘剩下的所有乘数。2.否则把最大的负数乘正数和,加负数和,乘剩下的所有乘数。证明:奇数个要利用负数和,可以乘负数,为了使正数和能乘最大的数,而且负数先乘哪个数对负数的和没有影响,所以要使正数和能乘最大的数,让负数乘绝对值最小的负数,即乘最大的负数。偶数个则同理,只是把正变负,最后还是使总和成为正。 | 51 |
AT203E | 一个 ( 2 n + 1 ) × ( 2 n + 1 ) (2n+1)\times(2n+1) (2n+1)×(2n+1) 的棋盘上有 m m m 个黑棋,你有一个白棋在 ( 0 , n ) (0,n) (0,n)。白棋在 ( i , j ) (i,j) (i,j),每次可以对白棋进行一下操作:1. 如果 ( i + 1 , j ) (i+1,j) (i+1,j) 没有黑棋,可以走到那。2. 如果 ( i + 1 , j − 1 ) (i+1,j-1) (i+1,j−1) 有黑棋,可以走到那。3. 如果 ( i + 1 , j + 1 ) (i+1,j+1) (i+1,j+1) 有黑棋,可以走到那。不能走出棋盘。问到 2 n + 1 2n+1 2n+1 行时能到多少个点。 1 ≤ n ≤ 1 0 9 , 1 ≤ n ≤ 2 × 1 0 5 1\le n\le 10^9,1\le n\le 2\times 10^5 1≤n≤109,1≤n≤2×105。 | 没有黑棋子的一行直接跳过,然后用 map 套 vector 来代替原来的数组格式,再用 set 来统计一下,每次如果发现到达点有
y
+
1
,
y
−
1
y+1,y-1
y+1,y−1 的情况的话,答案是可行,先存起来(不能和原来存在一起,待会还要考虑黑子挡在前方)。再一次遍历,如果发现
y
y
y被找到了,就要删除(黑子挡在前方),最后结果就是 set 的长度。 | 52 |
AT218D | 给定 n n n 个点,求有多少个由这些点组成的矩形平行于 x x x 轴和 y y y 轴。 4 ≤ n ≤ 2000 4\le n\le 2000 4≤n≤2000。 | 考虑枚举矩阵左上角和右下角,让后开一个Map标记另外两个位置是否存在,最后个数要除 2 2 2(重复计数)。因为没想到得到矩阵的左上角和右下角坐标可以推出另外两角这条结论,所以没做出来。 | 53 |
糖果峡谷 | 给定 k k k 种区间,每种区间有起点、终点、个数,问最多能选择多少个区间,使得它们的交集不超过 c c c,起点、终点 ≤ n \le n ≤n。 k ≤ 2 × 1 0 6 , n ≤ 2 × 1 0 6 , c ≤ 2.1 × 1 0 5 k\le 2\times 10^6,n\le 2\times 10^6, c\le 2.1\times 10^5 k≤2×106,n≤2×106,c≤2.1×105。 | 先对区间按右端点排序,然后查询这段区间的最小值(即糖果格数),然后和区间数取最小,选取,然后把这段都减去最小值,考虑用线段树维护。 | 66 |
天才ACM | 给定一个序列,定义 [ l , r ] [l,r] [l,r] 的校验值为从中取出 2 m 2m 2m 个数(不够则取到不能取为止),使得“每对数的差的平方”之和最大。求至少将序列分成多少段,使得每段的校验值不超过 T T T。 | 这题真正把二分和倍增拉开差距了。如果用二分,每次需要 O ( n log n ) O(n\log n) O(nlogn) 的时间,那么如果段很小,那么需要 O ( n 2 log n ) O(n^2 \log n) O(n2logn),如果用倍增,只需要将其拆解成 log \log log 段,每段是 O ( n log n ) O(n\log n) O(nlogn),那么则只需 O ( n log 2 n ) O(n\log^2 n) O(nlog2n),效率远超二分。如果再用二路归并优化,只对新增部分排序,那么可以进一步优化成 O ( n log n ) O(n\log n) O(nlogn)。 | 120 |
题目 | 题意 | 思路 | 代码 |
---|---|---|---|
区间分段 | 给你一个长为
n
n
n 的序列
a
a
a 和一个常数
k
k
k 。有
m
m
m 次询问,查询区间
[
l
,
r
]
[l,r]
[l,r] 内所有数最少分成多少个段使得每段的和都
≤
k
≤k
≤k。无解报告 Chtholly 。 | 考虑进行预处理每个数如果只能有一段到达的位置,再进行倍增,最后倍增跳跃即可。 | 101 |
最优贸易简化版 | 给定一个长度为 n n n 的序列 a a a, m m m 次询问,每次询问区间 [ l , r ] [l,r] [l,r],求 max { a i − a j } , l ≤ j < i ≤ r \max\{a_i-a_j\},l\le jmax{ai−aj},l≤j<i≤r | 预处理每个点向后走 2 j 2^j 2j 不的最小买入价格、最大卖出价格、最大收益。 | -1 |
天才ACM | 给定一个序列,定义 [ l , r ] [l,r] [l,r] 的校验值为从中取出 2 m 2m 2m 个数(不够则取到不能取为止),使得“每对数的差的平方”之和最大。求至少将序列分成多少段,使得每段的校验值不超过 T T T。 | 这题真正把二分和倍增拉开差距了。如果用二分,每次需要 O ( n log n ) O(n\log n) O(nlogn) 的时间,那么如果段很小,那么需要 O ( n 2 log n ) O(n^2 \log n) O(n2logn),如果用倍增,只需要将其拆解成 log \log log 段,每段是 O ( n log n ) O(n\log n) O(nlogn),那么则只需 O ( n log 2 n ) O(n\log^2 n) O(nlog2n),效率远超二分。如果再用二路归并优化,只对新增部分排序,那么可以进一步优化成 O ( n log n ) O(n\log n) O(nlogn)。 | 120 |