【题解】第三届“图灵杯”趣味网络邀请赛 (中级)

前言

没事水的比赛。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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| 21k2x+d = 1 2 ∣ 2 k x + k d ∣ \frac{1}{2}|2kx+kd| 212kx+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 的暴力做法。

正解非常巧妙。(反正我基本完全没想出来)。

判断欧拉回路的条件:

  1. 对于 i n [ i ] ≠ 0 in[i]\neq 0 in[i]=0 的节点,组成一个大的连通块。
  2. 对于所有 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 r1 扩展到 r r r,记 [ l , r − 1 ] [l,r-1] [l,r1] 中最左的权值比 a [ r ] a[r] a[r] 小的点为 i i i [ i , r − 1 ] [i,r-1] [i,r1] 中权值最大的点为 j j j。分类讨论:

  1. x [ j ] < = x [ r ] x[j]<=x[r] x[j]<=x[r] ,那么区间 [ l , i − 1 ] [l,i-1] [l,i1]没有一条边连向 [ i , r ] [i,r] [i,r] ,此时当且仅当 [ l , i − 1 ] [l,i-1] [l,i1] 单调递减即不存在一个有效的点才成立;
  2. 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,r1] 。此时必然满足条件 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,i1] 中的点是否都和 j j j 处于同一连通块,即 [ l , j ] [l,j] [l,j] 是否连通。

完结撒花!

然后是第二种情况。很容易想到对于 [ l , r − 1 ] [l,r-1] [l,r1]中所有小于 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],虽然不能每条边依次加入地算贡献,但是我们只需要知道两个东西:

  1. [ l , r − 1 ] [l,r-1] [l,r1] 中比 a [ r ] a[r] a[r] 小的数的个数,记作 c n t cnt cnt ,表示新增边的条数。可以用单调栈维护。
  2. 栈中所有元素的 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 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   仰望星空的蚂蚁  阅读(7)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示