【题解】P7293 [USACO21JAN] Sum of Distances P

题面

需要解释一下:有 K K K 张图,每一张图 N i N_i Ni 个节点,构成新图,有 ∏ i ∈ [ 1 , K ] N i \prod_{i\in[1,K]}{N_i} i[1,K]Ni 个节点,节点用 ( i 1 , i 2 , … , i K ) (i_1,i_2,\dots,i_K) (i1,i2,,iK) 表示,对于边 ∃    ( i 1 , i 2 , … , i K ) → ( j 1 , j 2 , … , j K )    ⟺    ∀ k ∈ [ 1 , K ] , ∃    i k → j k ( i k , j k ∈ [ 1 , N k ] ) \exist\;(i_1,i_2,\dots,i_K)\to(j_1,j_2,\dots,j_K)\iff \forall k\in[1,K],\exist\;i_k\to j_k(i_k,j_k\in[1,N_k]) (i1,i2,,iK)(j1,j2,,jK)k[1,K],ikjk(ik,jk[1,Nk])。求在新图中,从 ( 1 , 1 , … , 1 ) (1,1,\dots,1) (1,1,,1) 能走到的节点的距离和。

分析

特别抽象,甚至让我写暴力我都不一定能很优雅地搞出来。不妨先简化问题为 K = 2 K=2 K=2。此时考虑 ( 1 , 1 ) → ( a , b ) (1,1)\to(a,b) (1,1)(a,b),为方便区分,用 ( a s , b s ) → ( a t , b t ) (a_s,b_s)\to(a_t,b_t) (as,bs)(at,bt) 表示。此时 a , b a,b a,b 分别表示一个原图,我们可以求出 d 1 = d i s ( a s , a t ) d1=dis(a_s,a_t) d1=dis(as,at) d 2 = d i s ( b s , b t ) d2=dis(b_s,b_t) d2=dis(bs,bt)。在新图中两边需要同时走,因此只有 d 1 d1 d1 d 2 d2 d2 奇偶性相同时才可走到,即(记 o d k = d i s _ o d d ( k s , k t ) , e d k = d i s _ e v e n ( k s , k t ) od_k=dis\_odd(k_s,k_t),ed_k=dis\_even(k_s,k_t) odk=dis_odd(ks,kt),edk=dis_even(ks,kt) d i s ( ( a s , b s ) , ( a t , b t ) ) = m i n ( m a x ( o d a , o d b ) , m a x ( e d a , e d b ) ) dis((a_s,b_s),(a_t,b_t))=min(max(od_a,od_b),max(ed_a,ed_b)) dis((as,bs),(at,bt))=min(max(oda,odb),max(eda,edb)) 假如以正无穷表示无法走到的情况,等式依然成立。
考虑去化简式子(让它便于运算),首先我们知道 m i n ( x , y ) = x + y − m a x ( x , y ) min(x,y)=x+y-max(x,y) min(x,y)=x+ymax(x,y),那么可以使用在这里,即 d i s ( ( a s , b s ) , ( a t , b t ) ) = m a x ( o d a , o d b ) + m a x ( e v a , e v b ) − m a x ( o d a , e d a , o d b , e d b ) dis((a_s,b_s),(a_t,b_t))=\\max(od_a,od_b)+max(ev_a,ev_b)-max(od_a,ed_a,od_b,ed_b) dis((as,bs),(at,bt))=max(oda,odb)+max(eva,evb)max(oda,eda,odb,edb) 继而便可以求答案了,这里直接拓展到 K K K 为任意值的情况,读者也可以自己推一下,道理是相同的。 a n s = ∑ m a x i ∈ [ 1 , K ] o d i , t = k i + ∑ m a x i ∈ [ 1 , K ] e d i , t = k i − ∑ m a x i ∈ [ 1 , K ] ( o d i , t = k i , e d i , t = k i ) ans=\\\sum{max_{i\in[1,K]}od_{i,t=k_i}}\\+\sum{max_{i\in[1,K]}ed_{i,t=k_i}}\\-\sum{max_{i\in[1,K]}(od_{i,t=k_i},ed_{i,t=k_i})} ans=maxi[1,K]odi,t=ki+maxi[1,K]edi,t=kimaxi[1,K](odi,t=ki,edi,t=ki) 感觉比较难规范地表示出来, k x k_x kx 表示的是第 x x x 张图中任意一点, ∀ x ∈ [ 1 , K ] , k x ∈ [ 1 , N x ] {\forall x\in[1,K],k_x\in[1,N_x]} x[1,K],kx[1,Nx]。即 m a x max max 是对于每一张图的任意一个点的组合 ∀ ( r 1 , r 2 , … , r K ) , r i ∈ [ 1 , N i ] \forall(r_1,r_2,\dots,r_K),r_i\in[1,N_i] (r1,r2,,rK),ri[1,Ni] 而言的。

涉及算法

组合计数,bfs,逆元

实现

单个图求最短奇偶路径使用简单的 bfs。难点在于求 ∑ m a x    a i , j , … \sum{max{\;a_{i,j,\dots}}} maxai,j, 这样的东西。考虑将 a a a 降序排序,枚举到一个数时计算包含这个数,且此数最大的组合方案数,即除去这个数所在图外,其他图中比它小的数的个数的乘积。排序并且线性维护, O ( n log ⁡ n + n ) \mathcal{O(n\log n+n)} O(nlogn+n)。桶排可以 O ( n ) \mathcal{O(n)} O(n) 实现,但是我不会写。
特别地,要注意不要计算那些距离正无穷的情况。

答案

Code

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 题目P1518 \[USACO2.4\] 两只塔姆沃斯牛是一道模拟题,题目要求判断Farmer John和两头牛是否会相遇。解题思路可以分为两种方法。一种方法是记录二者的状态,如果出现了与前面相同的状态则说明陷入了死循环。具体实现步骤可以使用数组来记录Farmer John和两头牛的坐标、方向等状态信息,然后判断是否出现了重复的状态。另一种方法是利用博弈的思想,如果二者会同时回到一种状态,那么说明他们不会再相遇了,因为这时候他们已经陷入了一种对称性的状态。通过判断是否存在一种线性关系,可以确定二者是否会相遇。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two](https://blog.csdn.net/TD123456q/article/details/125688037)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [洛谷P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two 题解 (C/C++)](https://blog.csdn.net/Jason__Jie/article/details/115027619)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [(移动方向状态标志)P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two题解](https://blog.csdn.net/m0_57221330/article/details/119980758)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值