Rank | Solved | A | B | C | D | E | F | G | H | I | J | K |
---|---|---|---|---|---|---|---|---|---|---|---|---|
44/452 | 4/11 | O | O | Ø | O | Ø | Ø | Ø | Ø | O | Ø | Ø |
O
: 当场通过
Ø
: 赛后通过
.
: 尚未通过
A run
solved by chelly
chelly's solution
签到
B discount
solved by chelly
chelly's solution
我们把限制总结一下:
- 花p[i]-d[i]购买一个点
- 花p[i]购买一个点和它的父亲
- "花p[i]购买一个点和它父亲"这个不能连续
就十分类似树上的匹配问题的,可以用dp求解
然后这个图是个基环外向树森林,所以先扣出所有的环,然后做树DP,再做环DP即可
C message
upsolved by chelly
chelly's solution
直线y=ax+b和y=cx+d的交点横坐标是(-frac{b-d}{a-c}),于是我们可以将(a,b)和(c,d)看成两个点
问题就转化成了,平面上有n个点,有m个询问点,你需要对每个询问点回答这个询问点和哪个点形成的斜率最小
这就是个经典问题,容易知道答案一定在n个点形成的凸包上
对于一个询问点(x,y),我们将凸包分块,分成该点左边和该点右边,那么答案在左边和右边就是单峰的,可以二分或者三分
所以我们可以先离线询问点,然后在构下凸包的时候完成左边的操作,在构上凸包的时候完成右边的操作
时间复杂度(O((n+m)log(n+m)))
D money
solved by chelly
chelly's solution
(dp[i])表示前i个商店做完后的最大收益
(dp[i]=dp[i-1] (第i个商店不卖))
(dp[i]=max(dp[j]+a[i]-a[j+1]) (第j+1个商店买,第i个商店卖))
这样复杂度是(O(n^2))的,我们考虑每次维护(dp[j]-a[j+1])的最大值,即可降低复杂度到(O(n))
E tree
upsolved by chelly
chelly's solution
F trade
upsolved by chelly
chelly's solution
首先可以通过暴力判断圆和直线的相交来把干扰器限制去掉
这个问题里一个重要的操作就是在某个订单的时候,从某个仓库i运送了一些货物存到了仓库j里面,然后在后面某个订单的时候从j中取出装入车子上并送给顾客,这个相当于第i个仓库直接把货物卖给了后面的顾客
我们考虑假如能求出一个数组can[i][j]表示第i个仓库能否卖给第j个订单的用户,那么剩下的问题就是左边有n个点表示仓库,右边m个点表示用户,然后跑最大流即可
那我们怎么求出这个can[i][j]呢?
能卖给第j个用户的关键就是在这之前第i个仓库能够通过某条路径到达订单j上的仓库
我们设dp[i][1..n]表示目前为止,第1,2,...n个仓库能否到达第i个仓库
显然对于第j个订单的仓库(x_1,x_2,...,x_p)有(dp[x_{i+1}]|=dp[x_i]),那么最终(dp[x_p])中为1的那些仓库就是能把货物运送给目前的用户的仓库
显然用bitset维护这个数组即可
G transform
upsolved by chelly
chelly's solutiion
考虑直接尺取,不是很好办,于是考虑二分答案num,然后去看一看我能不能取连续的num个货物
我们可以每次尺取一个区间[l,r],使得这个区间里面的货物个数是小于等于num的极大值,然后枚举两种情况,一种是剩余的从l-1拿,一种是剩余的从r+1拿
如何计算答案呢?我们知道中位数一定是在我们尺取的过程中也是单调的,所以维护一些东西计算就行
时间复杂度(O(nlog_2(suma_i)))
H travel
upsolved by chelly
chelly's solution
dp[k][i][j]表示以u为根的子树,已经选了i条封闭的路径,有j个待向上延伸的路径(j=0/1)的情况下,最大的收益
转移的时候稍微思考一下就行,可以先把所有孩子的信息收集起来,再统一向k转移
转移的时候注重一个特殊情况,就是两条向上的链在k处封闭
I car
solved by ch
ch's solution
J farm
upsolved by chelly
chelly's solution
考虑计算每个格子被非同色矩形覆盖了多少次
这个东西等价于计算每个格子被覆盖的总次数-被其同色矩形覆盖的次数
可以用二维数点来解决,时间复杂度(O(nmlogm))
当然也有比较喵的随机做法,就是给不同的颜色rand一个权值,如果一个格子只被同色矩形覆盖过,那么它位置上最终的值一定是该颜色权值的倍数。这样时间复杂度是(O(nm))。
K carpet
upsolved by chelly
chelly's solution
我们希望找到最小的一个循环节p,q,很容易发现行列是独立的,所以不妨分开考虑
这里要注意一点,就是一个字符串s的循环节并不一定是最小循环节的倍数,所以我们只能暴力用Kmp处理出每一行的所有循环节,找出最小的出现了n次的循环节,就是所有行的最小公共循环节p
求列最小公共循环节q同理
好,现在我们得到了p和q,我们还要最小化子矩阵最大值
容易发现这个子矩阵只要是个pq的就可以经过无限次平铺得到原来的矩阵
问题就变成了,给你一个nm矩阵,找一个p*q的子矩阵,并最小化其中最大值
我们可以对每一行扫一遍单调队列,再对列扫一遍单调队列即可
时间复杂度(O(nm))
Replay
本场主要由chelly和ch打的,syf乘上了回家的客车于是无法参加。
开场chelly切A,过了签到,然后认为B题是个签到,于是提交了个假算法。chelly看见B题没人通过,决定换题,去扣扣D,把B题丢给了ch。chelly磕磕绊绊把D过了,ch思考B题未果。然后chelly和ch共同思考I题,经过一番交流确定了解法,chelly想暴力求每一块的独立集,就在这时ch提出了一个简单结论,chelly和ch都觉得很有道理,于是ch写了代码,1A。此后chelly开H,ch继续想B。chelly误认为H是个费用流,开始码,码完发现要解决的是正权无向图的最大费用最大流,因为有正环的缘故,无法跑出来,chelly猜想这题应该是个树DP,但是细节太多,chelly便弃了这个题。此时J题过的人比较多,但ch和chelly都不会做。chelly继续思考B,转化了B的模型之后,发现就是一个基环外向树森林上的DP,然后码码码,在临近结束的时候A了。