【题解】第三届“图灵杯”趣味网络邀请赛 (中级)
前言
没事水的比赛。
Solution:
考场上猜对了结论。
本题的关键在于:对于一个二元组
(
d
,
k
)
(d,k)
(d,k),可以看作平面直角坐标系中的一次移动,即 (x,y)->(x+d,y+k)
。对应到图上,梯形面积 =
1
2
k
∣
2
x
+
d
∣
\frac{1}{2}k|2x+d|
21k∣2x+d∣ =
1
2
∣
2
k
x
+
k
d
∣
\frac{1}{2}|2kx+kd|
21∣2kx+kd∣ ,正好就是题目要我们算的贡献。
由于
k
k
k 是正数,所以总答案就是我们围出来多边形的面积,不难证明凸包是最优的。
如果超过了坐标轴呢?我们同样可以通过调整法使结果更优。因为两次向量的累积效果是一样的。
所以按
d
i
k
i
\frac{d_i}{k_i}
kidi 从小到大排序,正着遍历一遍,反着遍历一遍,取结果的最优值即可。时间复杂度
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn) 。
总结:二次乘积可以往用面积来表示。
Solution:
考场上只想到了 30 p t s 30pts 30pts 的暴力做法。
正解非常巧妙。(反正我基本完全没想出来)。
判断欧拉回路的条件:
- 对于 i n [ i ] ≠ 0 in[i]\neq 0 in[i]=0 的节点,组成一个大的连通块。
- 对于所有 i n [ i ] ≠ 0 in[i]\neq 0 in[i]=0 的节点, i n [ i ] m o d 2 = 0 in[i]\bmod 2=0 in[i]mod2=0 。
我们考虑递推求出所有子区间的连通性。
首先我们固定一个左端点 l l l 。考虑从 r − 1 r-1 r−1 扩展到 r r r,记 [ l , r − 1 ] [l,r-1] [l,r−1] 中最左的权值比 a [ r ] a[r] a[r] 小的点为 i i i , [ i , r − 1 ] [i,r-1] [i,r−1] 中权值最大的点为 j j j。分类讨论:
- 若 x [ j ] < = x [ r ] x[j]<=x[r] x[j]<=x[r] ,那么区间 [ l , i − 1 ] [l,i-1] [l,i−1]没有一条边连向 [ i , r ] [i,r] [i,r] ,此时当且仅当 [ l , i − 1 ] [l,i-1] [l,i−1] 单调递减即不存在一个有效的点才成立;
- 若 x [ j ] > x [ r ] x[j]>x[r] x[j]>x[r] ,那么 此时判断 [ l , r ] [l,r] [l,r] 的连通性相当于判断 [ l , j ] [l,j] [l,j] 的连通性 ,可以递推求出。
首先第一条不难理解。为了证明第二条,我们需要一个引理:
区间 [ i , r ] [i,r] [i,r] 一定联通且点的个数 > = 2 >=2 >=2 。换句话说, [ i , r ] [i,r] [i,r] 中所有点都和 r r r 处于同一连通块。因为假设有一个点 k ∈ [ i , r − 1 ] k\in [i,r-1] k∈[i,r−1] 。此时必然满足条件 a [ k ] ≥ a [ i ] a[k]\geq a[i] a[k]≥a[i] 或者 a [ k ] ≤ a [ r ] a[k]\leq a[r] a[k]≤a[r] ,又因为 i , r i,r i,r 处于同一连通块,所以 k k k 也是联通的。
所以我们可以把一个连通块 用权值最大的点 j j j 代替 ,问题就转化成了 [ l , i − 1 ] [l,i-1] [l,i−1] 中的点是否都和 j j j 处于同一连通块,即 [ l , j ] [l,j] [l,j] 是否连通。
完结撒花!
然后是第二种情况。很容易想到对于 [ l , r − 1 ] [l,r-1] [l,r−1]中所有小于 a [ r ] a[r] a[r] 的数加一,具体可以用权值线段树或平衡树( w g y wgy wgy 用权值线段树骗了 80 p t s 80pts 80pts ),但是要注意用权值线段树时只能统计区间中出现过的点。但是这样做时间复杂度 O ( n 2 l o g n ) O(n^2logn) O(n2logn)。
考虑随机化思想。我们知道异或有一个很好的性质,就是两个相同的数异或为 0 0 0 。所以我们对每一个点赋上权值 w [ i ] w[i] w[i],虽然不能每条边依次加入地算贡献,但是我们只需要知道两个东西:
- [ l , r − 1 ] [l,r-1] [l,r−1] 中比 a [ r ] a[r] a[r] 小的数的个数,记作 c n t cnt cnt ,表示新增边的条数。可以用单调栈维护。
- 栈中所有元素的
w
[
i
]
w[i]
w[i] 的异或和。把这个结果异或上
(cnt&1)w[r]
就是新增的边集的异或和。
因为 w [ i ] w[i] w[i] 各不相同,而 w [ i ] ∈ [ 0 , 2 64 ) w[i]\in[0,2^{64}) w[i]∈[0,264) 的随机数,所以冲突的概率极小,可以忽略不计。
总时间复杂度 O ( n 2 ) O(n^2) O(n2) ,因为没有题库,所以没有代码。总结:从本题中看出自己的知识面还是有欠缺,这是较 w g y wgy wgy 大佬不足的地方。
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17530294.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」