2016-E29-team1
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
||#||When||Problem||Lang||Verdict||Time||Memory||
||24285833||2017-01-31 12:19:55||K - Kiwi Trees||GNU C++11||Accepted||78 ms||2100 KB||
||24285585||2017-01-31 12:08:49||D - Driving in Optimistan||GNU C++11||Accepted||46 ms||11000 KB||
||24285387||2017-01-31 12:00:21||D - Driving in Optimistan||GNU C++11||Wrong answer on test 1||15 ms||10200 KB||
||24284005||2017-01-31 10:35:49||J - Jupiter Orbiter||GNU C++11||Accepted||15 ms||2200 KB||
||24283841||2017-01-31 10:24:13||B - British Menu||GNU C++11||Accepted||857 ms||46200 KB||
||24283581||2017-01-31 10:06:09||B - British Menu||GNU C++11||Wrong answer on test 1||15 ms||28600 KB||
||24283284||2017-01-31 09:44:00||J - Jupiter Orbiter||GNU C++11||Wrong answer on test 30||15 ms||25500 KB||
||24283145||2017-01-31 09:32:58||A - Arranging Hat||GNU C++11||Accepted||155 ms||58700 KB||
||24283051||2017-01-31 09:24:45||A - Arranging Hat||GNU C++11||Accepted||140 ms||58700 KB||
||24282725||2017-01-31 08:56:46||I - Iron and Coal||GNU C++11||Accepted||265 ms||30300 KB||
||24282605||2017-01-31 08:44:41||F - Free Weights||GNU C++11||Accepted||1560 ms||49300 KB||
||24282459||2017-01-31 08:32:59||C - Careful Ascent||GNU C++11||Accepted||15 ms||1800 KB||
||24282391||2017-01-31 08:26:57||H - Hamiltonian Hypercube||GNU C++11||Accepted||15 ms||2000 KB||
||24282252||2017-01-31 08:16:46||E - Exam Redistribution||GNU C++11||Accepted||31 ms||17700 KB||
比赛链接: http://codeforces.com/gym/101170
start at 13:01
== 流水账 ==
== 总结 ==
== 题解 ==
CEFH 略去不表。
=== A. Arranging Hat [sfiction] ===
解的最高位要有序,每个连续段对应的m-1位数也要有序。容易想到从最低位向上处理,由于共有10种数字,因此用f[k][i][j][d]表示[i,j]内数的最低k位有序,且j的第k位<=d的最小代价,转移时只需用到状态f[k-1][][][9],复杂度为O(n)。O(10mn^3^)。
=== B. British Menu [Akalm] ===
SCC缩点后按逆拓扑序DP,同一个SCC内暴力枚举,不同的调用DP结果
=== D. Driving in Optimistan [sfiction] ===
首先要根据给出的距离建树。之后的部分只是稍微复杂一些的树形DP。因为链长被所给距离确定,因此从链入手建树。build(u,v,lst)表示当前处理以u为根的子树,子树中元素为u,v,lst。对于lst中的点w,根据所处子树根在链u-v上的位置(通过a[u][v],a[u][w],a[v][w]计算)进行分类,然后递归处理。注意距离和会爆ll,需要用double。O(n^2^logn)。
=== I. Iron and Coal [Akalm] ===
两次BFS,然后枚举中(分叉)点
=== J. Jupiter Orbiter [JTJL] ===
贪心。首先传感器是无效的,直接合并为队列的数据即可。在每次传送窗口,观察每个队列的状态。如果数据溢出,则寻找最早的还没使用完的窗口k和不晚于k收集到的该队列的数据,依次传送,直到队列恰好能装下为止。最后的时候强制再收集Ci的虚数据用来清空队列即可。一旦中间出现不合法的情况即为无解。直接暴力处理的复杂度是O(n^3^q),足够通过,还有充分的优化余地。
另解:网络流(自然的构图即可。sf补充:首先将传感器合并为queue的每轮数据量a[i][j]。用最大流解决。表示阶段i的队列j的点要拆分成a[i][j]和b[i][j]。源点到a[i][j]连容量为a[i][j]的边。d[i]到汇连容量为d[i]的边。a[i][j]到d[i]连容量无穷大的边,表示数据传送。a[i][j]到b[i][j]连容量为c[j]的边,限制队列容量。b[i][j]到a[i+1][j]连容量无穷大的边,表示剩余数据。满流即表示可行。)
=== K. Kiwi Trees [JTJL, Akalm] ===
根据题目给定的角度限制,任何一个小于180度的角以及相邻两条边构成的三角形都能放下一棵树。所以我们枚举所有顶点,找出所有这样卡在角落的圆,并且和所有边判交(~~存在三角形内被异物插入特殊情况~~)。最后对所有的圆两两~~圆交~~一遍看是否存在一对合法解即可。O(n^2^)~~感受出来是对的,不知道如何严格证明~~
| # | When | Problem | Lang | Verdict | Time | Memory |
| 24285833 | 2017-01-31 12:19:55 | K - Kiwi Trees | GNU C++11 | Accepted | 78 ms | 2100 KB |
| 24285585 | 2017-01-31 12:08:49 | D - Driving in Optimistan | GNU C++11 | Accepted | 46 ms | 11000 KB |
| 24285387 | 2017-01-31 12:00:21 | D - Driving in Optimistan | GNU C++11 | Wrong answer on test 1 | 15 ms | 10200 KB |
| 24284005 | 2017-01-31 10:35:49 | J - Jupiter Orbiter | GNU C++11 | Accepted | 15 ms | 2200 KB |
| 24283841 | 2017-01-31 10:24:13 | B - British Menu | GNU C++11 | Accepted | 857 ms | 46200 KB |
| 24283581 | 2017-01-31 10:06:09 | B - British Menu | GNU C++11 | Wrong answer on test 1 | 15 ms | 28600 KB |
| 24283284 | 2017-01-31 09:44:00 | J - Jupiter Orbiter | GNU C++11 | Wrong answer on test 30 | 15 ms | 25500 KB |
| 24283145 | 2017-01-31 09:32:58 | A - Arranging Hat | GNU C++11 | Accepted | 155 ms | 58700 KB |
| 24283051 | 2017-01-31 09:24:45 | A - Arranging Hat | GNU C++11 | Accepted | 140 ms | 58700 KB |
| 24282725 | 2017-01-31 08:56:46 | I - Iron and Coal | GNU C++11 | Accepted | 265 ms | 30300 KB |
| 24282605 | 2017-01-31 08:44:41 | F - Free Weights | GNU C++11 | Accepted | 1560 ms | 49300 KB |
| 24282459 | 2017-01-31 08:32:59 | C - Careful Ascent | GNU C++11 | Accepted | 15 ms | 1800 KB |
| 24282391 | 2017-01-31 08:26:57 | H - Hamiltonian Hypercube | GNU C++11 | Accepted | 15 ms | 2000 KB |
| 24282252 | 2017-01-31 08:16:46 | E - Exam Redistribution | GNU C++11 | Accepted | 31 ms | 17700 KB |
比赛链接: http://codeforces.com/gym/101170
start at 13:01
流水账
总结
题解
CEFH 略去不表。
A. Arranging Hat [sfiction]
解的最高位要有序,每个连续段对应的m-1位数也要有序。容易想到从最低位向上处理,由于共有10种数字,因此用f[k][i][j][d]表示[i,j]内数的最低k位有序,且j的第k位<=d的最小代价,转移时只需用到状态f[k-1][][][9],复杂度为O(n)。O(10mn3)。
B. British Menu [Akalm]
SCC缩点后按逆拓扑序DP,同一个SCC内暴力枚举,不同的调用DP结果
D. Driving in Optimistan [sfiction]
首先要根据给出的距离建树。之后的部分只是稍微复杂一些的树形DP。因为链长被所给距离确定,因此从链入手建树。build(u,v,lst)表示当前处理以u为根的子树,子树中元素为u,v,lst。对于lst中的点w,根据所处子树根在链u-v上的位置(通过a[u][v],a[u][w],a[v][w]计算)进行分类,然后递归处理。注意距离和会爆ll,需要用double。O(n2logn)。
I. Iron and Coal [Akalm]
两次BFS,然后枚举中(分叉)点
J. Jupiter Orbiter [JTJL]
贪心。首先传感器是无效的,直接合并为队列的数据即可。在每次传送窗口,观察每个队列的状态。如果数据溢出,则寻找最早的还没使用完的窗口k和不晚于k收集到的该队列的数据,依次传送,直到队列恰好能装下为止。最后的时候强制再收集Ci的虚数据用来清空队列即可。一旦中间出现不合法的情况即为无解。直接暴力处理的复杂度是O(n3q),足够通过,还有充分的优化余地。
另解:网络流(自然的构图即可。sf补充:首先将传感器合并为queue的每轮数据量a[i][j]。用最大流解决。表示阶段i的队列j的点要拆分成a[i][j]和b[i][j]。源点到a[i][j]连容量为a[i][j]的边。d[i]到汇连容量为d[i]的边。a[i][j]到d[i]连容量无穷大的边,表示数据传送。a[i][j]到b[i][j]连容量为c[j]的边,限制队列容量。b[i][j]到a[i+1][j]连容量无穷大的边,表示剩余数据。满流即表示可行。)
K. Kiwi Trees [JTJL, Akalm]
根据题目给定的角度限制,任何一个小于180度的角以及相邻两条边构成的三角形都能放下一棵树。所以我们枚举所有顶点,找出所有这样卡在角落的圆,并且和所有边判交(存在三角形内被异物插入特殊情况)。最后对所有的圆两两圆交一遍看是否存在一对合法解即可。O(n2)感受出来是对的,不知道如何严格证明