专栏文章

qoj#1166 Designing a PCB

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minjuhi6
此快照首次捕获于
2025/12/02 03:35
3 个月前
此快照最后确认于
2025/12/02 03:35
3 个月前
查看原文

题目大意

平面上有 2n2n 个点,第 ii 个位于 (i1,0)(i-1,0),颜色为 aia_i。保证 a12na_{1\sim 2n}1n1\sim n 各恰好出现两次。
现在要将每种颜色的一对点用首尾相接且与坐标轴平行的折线连起来,并且任何两种颜色的折线不能有交点。
现在给出 n,a1,a2,,a2nn,a_1,a_2,\dots,a_{2n},构造一种连接方案或报告无解。
方案表示方式:对于第 ii 种颜色,输出一行 k[i] c[i][1] d[i][1] c[i][2] d[i][2] ... c[i][k[i]] d[i][k[i]],其中 ci,j{U,D,L,R}c_{i,j}\in \{'U','D','L','R'\}di,jd_{i,j} 为正整数,表示从颜色 ii 左边那个点开始,依次经过 kik_i 条线段,第 ii 条方向为 ci,jc_{i,j}(UDLR 分别对应上下左右),长度为 di,jd_{i,j}
2n10002\leq n\leq 1000

解题过程

设颜色 ii 靠左的点编号为 lil_i,靠右的点编号为 rir_i
考虑如果折线不能和 xx 轴相交(端点除外),即每条折线要么在 xx 轴上面要么在下面的情况,要如何处理。可以发现如果 [li,ri][lj,rj][l_i,r_i]\cap[l_j,r_j]\neq\varnothing,那么折线 i,ji,j 必然处于 xx 轴不同侧。构建一张 nn 个点的图,在所有这样的 (i,j)(i,j) 之间连边,那么这张图必须是二分图。得到一组二分图染色后,令左部点代表的折线在 xx 轴上方,其余在 xx 轴下方,那么在 xx 轴上方的折线对应的那些 [li,ri][l_i,r_i] 之间要么相离,要么一个完整包含另一个,所以只需要给每个 ii 赋一个“高度” hih_i,满足如果 [lj,rj][li,ri][l_j,r_j]\subset [l_i,r_i],那么 hj<hih_j<h_i,然后将折线 ii 构造为 U h[i] R r[i]-l[i] D h[i]xx 轴下方也同理。构造 hh 可以直接将所有颜色按 rilir_i-l_i 从小到大排序,hih_i 依次为 1n1\sim n 即可。
示意图如下:
1
现在折线可能穿过 xx 轴,意味着每条折线不能简单地归类为上下。但这 2n2n 个点可以:定义 c12nc_{1\sim 2n},其中 ci=0c_i=0 表示与点 ii 直接相连的线段在 xx 轴上方,反之 ci=1c_i=1。那么可以发现两条限制:
  1. 如果 li<lj<rj<ril_i<l_j<r_j<r_i(即线段包含),那么 clj=crjc_{l_j}=c_{r_j}
  2. 如果 li<lj<ri<rjl_i<l_j<r_i<r_j(即线段相交但不包含),那么 cljcric_{l_j}\neq c_{r_i}
不难发现这两条限制是必要的。事实上,可以说明这是充分的。
还是缩点后二分图染色得到一组合法的 cc。先像上面的情况一样处理所有 cli=cric_{l_i}=c_{r_i} 的颜色 ii,然后考虑所有 clicric_{l_i}\neq c_{r_i} 的颜色 ii。对于这些颜色,再构造一个“宽度” wiw_i,满足 li<lj\forall l_i<l_j,有 hi<hjh_i<h_jwi<wjw_i < w_j,且所有这些颜色的 hh 比所有 cli=cric_{l_i}=c_{r_i}hih_i 大。对于 cli=0,cri=1c_{l_i}=0,c_{r_i}=1ii,构造折线 U h[i] L l[i]+w[i] D 2*h[i] R r[i]+w[i] U h[i]cli=1,cri=0c_{l_i}=1,c_{r_i}=0 的情况同理。
分类讨论可以发现,这样即可保证所有折线不交。
示意图如下:
2
共有 O(n2)O(n^2) 对限制,总复杂度 O(n2)O(n^2)

评论

0 条评论,欢迎与作者交流。

正在加载评论...