Notice :1.T4算法7的 f ( t ) f(t) f(t)函数写错了…已更正。
2. 之后(可能)会发git链接。
3. 欢迎评论。
4. T4是有 O ( n 2 log n ) O(n^2 \log n) O(n2logn)做法的,在题解中的暗示可能不够明显,欢迎指出。
Q:为什么叫入门提高级?
A:因为前两题手滑出的偏难,于是打算通过题面给大家一点安慰。后面两道难度还好吧…
出题人:Panda_hu
这是一道简单的大模拟题。
首先很抱歉这道题完全不符合T1的难度,原来打算放在T2的…
大概看了题面也知道我为什么要出这道题了…
主要考察参赛者的模拟能力。
其实我写完标程也挺惊讶的…居然会有50多行…
大多数同学在90分以上,少数同学可能会失误。
将输入数据去掉日期原样输出即可。
将输入数据去掉日期后按照年份排序输出即可。
你需要处理字符串 d a t e i date_i datei,然后再进行判断,最简单的输入方法是:
scanf("%d.%d.%d",&y,&m,&d);
你需要根据提示模拟年月日的进位,然后再判断即可。
将算法3的输出按年份排序即可。
将算法4的输出按年份排序即可。
[数据有彩蛋…]
出题人还是基本上卡了每个月份的进位的…除了3,6,9月份…
有一个点是无解。
出题人:LSK
首先 11 , 12 , 13 , 14 11,12,13,14 11,12,13,14 直接输出时要小心…
对于 N ≤ 2000 N\le 2000 N≤2000 我们可以枚举最后一击,那么如果打其他头造成的攻击力为 a t k i − d i atk_i-d_i atki−di 因为其他攻击都打不死它,于是我们可以找到一种贪心策略,首先将所有头按照 a t k i − d i atk_i-d_i atki−di 从大到小排序,然后每次固定一个头 i i i 后找出至少需要前面多少个头 a t k i − d i atk_i-d_i atki−di 之和相加大于 h − a t k x h-atk_x h−atkx x x x 是你选中的最后一击,时间复杂度 O ( n 2 ) O(n^2) O(n2)
然后我们发现每次确定一个头后暴力枚举时间复杂度过高,于是我们考虑优化,我们可以排序后统计出 a t k i − d i atk_i-d_i atki−di 的前缀和 s i s_i si,那么我们只需要针对 h − a t k x h-atk_x h−atkx 和 s x − 1 s_{x-1} sx−1 大小关系分类讨论二分即可,时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)
出题人:LSK
对于 11 , 12 11,12 11,12 特判一下即可。
对于 1 − 10 1- 10 1−10 其实比正解还难打…
我们发现由于我们对于某一层的气候区 i i i 而言,我们发现的是一个 x = i x=i x=i 和 y = i y=i y=i 的直线在第一象限的整数坐标 和 ( 0 , i ) , ( i , 0 ) (0,i),(i,0) (0,i),(i,0) 构成,如果将气候区 i i i 的点按照从左至右,从上至下的顺序抽出来作为一个二元数组 a a a (下标从一开始,设长度为 L L L),我们气候区 i i i 最终结束时我们必定会在 a 1 a_1 a1 或者 a L a_L aL 那么当我们进入气候区 i + 1 i+1 i+1 时我们会落到哪个点呢? 那我们考虑如果点在 y = i + 1 y=i+1 y=i+1 上可以向上走一格, x = i + 1 x=i+1 x=i+1 上可以向右走一格,于是接下来我们只能以 n o w − > a 1 − > a L now->a_1->a_L now−>a1−>aL 或者 n o w − > a L − > a 1 now->a_L->a_1 now−>aL−>a1 的顺序访问,于是可以理解为我们对于某一层的气候区 i i i 而言开始和结束位置都在端点。于是就可以进行 D p Dp Dp 了。
定义 f [ i ] [ 0 ∣ 1 ] f[i][0|1] f[i][0∣1] 表示到了第 i i i 层气候区该层以左端点 ( 0 0 0) 或 右端点 ( 1 1 1) 结束的最小步数。
然后我们发现最后要回到起点,其巧妙之处在于以左右端点结束时必定也是距离原点最短的两个点 于是 A n s = m i n ( f [ n ] [ 0 ] + d i s ( p , ( 0 , 0 ) ) , f [ n ] [ 1 ] + d i s ( q , ( 0 , 0 ) ) ) Ans=min(f[n][0]+dis(p,(0,0)),f[n][1]+dis(q,(0,0))) Ans=min(f[n][0]+dis(p,(0,0)),f[n][1]+dis(q,(0,0))) p , q p,q p,q 是对应端点。
还要离散化。
出题人:Panda_hu
这是一道根据OI中经典的洪水填充问题改造而成的题目,难度并不高,适合放在PJ-T4的位置。
题目主要的区分度主要在于参赛者对题面所给出的问题分析出问题的实质,和选手对最小生成树算法,二分/三分的掌握程度。
然后接下来的话就并不是很正式了
出这道题真的相当的难受。最开始这道题只有4个方向,然后标算被LSK
dalao吊打,他口胡了一个4个方向 n ≤ 1 0 5 n≤10^5 n≤105(的大部分)做法,然而要用线段树+扫描线…显然是不可能放在PJ组的…为了hack掉 n ≤ 1 0 5 n≤10^5 n≤105的方法,于是我把题目改成了8个方向…
8个方向的做法要用三分,比较复杂…于是在这道题里只给了20分。中间出了相当多的情况(比如标算差点被hack之类的…),这里不展开。
预计部分参赛者得分在4-16分不等,一些参赛者能够得到16分以上的成绩,可能存在80分以上的高分。(希望不会打脸)
人口普查,输出0
。
由于两机器人朝着同一个方向,因此我们可以把它们直接看做静止的,开一个二维数组直接模拟即可。
或者,你可以直接输出 ⌈ ∣ x 2 − x 1 ∣ + ∣ y 2 − y 1 ∣ 2 ⌉ \lceil \frac{|x_2-x_1|+|y_2-y_1|}{2} \rceil ⌈2∣x2−x1∣+∣y2−y1∣⌉。
这也是帮助你通过接下来的几个测试点的重要结论。
我们需要重新观察题面,其实,第 i i i次新增加的信号范围就是满足点 ( x , y ) (x,y) (x,y), ∣ x − x 0 ∣ + ∣ y − y 0 ∣ = i |x-x_0|+|y-y_0|=i ∣x−x0∣+∣y−y0∣=i的点。换句话说,这里的信号范围就是机器人走 i i i步以内能到达的所有点(每次可以走相邻的点)。这样就能直接推出上面的公式了。
我们注意到只有四个方向时,机器人一旦覆盖了一个位置,之后就会一直覆盖着这一位置,因此它有单调性。
我们二分时间 t t t,然后将机器人移到这一时刻相应的位置上去,然后根据公式计算值是不是小于等于 t t t就行了。
[Ps:第5个测试点是No solutions
]
这几个测试点是留给各种乱搞的。
题目保证了数据完全随机,再观察一下给的样例,可以发现答案相当的小(测试点7-10大概只有40左右,实际上我们要计算期望),所以我们直接从 1 1 1开始枚举 t t t,按题意模拟即可。
你可以用并查集,或者直接DFS也行。
基于你暴力的复杂度,可能无法通过13-15号测试点。
其实题目就是求完全图中生成一棵树,使得边权最大值最小。
其实这就是最小生成树。
根据算法2的公式计算出两两机器人的接收到信号的时间。
做一遍最小生成树即可。
复杂度: O ( n 2 log n ) O(n^2 \log n) O(n2logn)
当然,这个测试点也有 O ( n 2 ) O(n^2) O(n2)的做法。
将算法5的公式换为算法3的二分即可。
或者,你可以直接二分时间 t t t,然后将每个点挪到相应的位置,如果两机器人的信号在 t t t时刻重合就用并查集并起来,最后检验是否连通即可。
然而,当机器人有8个方向时,就失去了单调性了。
例如下面的一组数据
2
0 0 5
1 1 8
如果用二分来做,多半会得到一个No solutions
。
但是这个函数一定是单峰的,这里仅简略证明:
我们横纵坐标分别考虑,如果两个机器人在这一维上方向相反,那么它就是一个分段函数,起始时为 k x + b kx+b kx+b(不一定有),过了零点斜率为 − k x + b -kx+b −kx+b,这里的斜率 k k k是一个常数,若机器人规定方向时相邻点时 k = 1 k=1 k=1,否则 k = 2 k=2 k=2,我们将两维的两个函数加起来,由于信号范围影响我们还要再加上一个 − 2 x -2x −2x,显然这个函数斜率一定是递减的,因此它一定是个单峰函数·
其实这就是初中学过的绝对值函数斜率整体减了个2…而且函数最多只有3段…
所以这题肯定有其他做法,欢迎大家来爆踩…
这里的函数可以描述为 f ( t ) = ⌈ ∣ x 2 − x 1 ∣ + ∣ y 2 − y 1 ∣ 2 ⌉ − t f(t)=\lceil \frac{|x_2-x_1|+|y_2-y_1|}{2} \rceil-t f(t)=⌈2∣x2−x1∣+∣y2−y1∣⌉−t。显然 f ( t ) ≤ 0 f(t)≤0 f(t)≤0时解合法。
然后我们将小于零的 f ( t ) f(t) f(t)值全部设为 0 0 0,这样就能直接三分了,具体请见标程。
将算法6的二分换为算法7的三分即可。
复杂度: O ( n 2 log 1.5 n ) O(n^2\log_{1.5} n) O(n2log1.5n)
对于只存在四个方向的情况,我们有 O ( n log 2 n ) O(n\log^2 n) O(nlog2n)的做法。
我们可以改造算法6的第二个做法。
我们可以将曼哈顿距离转化为切比雪夫距离,这样信号范围就变成了一个正方形。
原问题就变成了在求矩形是否互相连通。
这是一个经典的扫描线问题,我们在维护线段树的时候同时维护并查集,依然判断是否连通即可。
然而直接做是要超时的,我们只要将连边数减少到 O ( n log n ) O(n\log n) O(nlogn)级别即可。
时间复杂度 O ( n log 2 n ) O(n\log^2 n) O(nlog2n)。