2022.07.15 zrNOI模拟赛总结

1.时间安排

8:00~8:20 看题面

T1:字符串题,求两个01串一个取前缀一个取后缀能拼出来的本质不同串个数,应该是毒瘤数据结构(居然只给0.5s时限),有10分白给,也许存在什么 \(O(n^2|S|)\) 的算法。

T2:998244353题,树的同构计数,只会爆搜和菊花图,鉴定为:不可做。

T3:图上题,最小化从1号点出发的两条不交路径权和,一眼费用流,还有30分只需要判断是否存在两条不交路径可以思考。

8:20~8:40

写完T1的暴力,对其他分档没什么想法。

8:40~9:40

T2的暴力真麻烦……光判不合法都要写一堆东西。

会出现树同构的现象,不过数据小直接懒人暴力hash。

调了很久终于没问题,顺手把菊花的情况写了,答案只可能为0/1判合法即可。

想了想链怎么写,没思路。

9:40~11:30

T3费用流调了很久,才发现是数组调用错了……

想了想只需要判是否存在两条不交路径,似乎可以网络流,但是数据有1e5,而且后面发现这个方法假了。

试着想图上的DP这类的,也没思路、

11:30~13:00

吃完饭,开摆。

result:

T1:10 T2:20 T3:40

2.总结

T1:

计算几何基础题,感谢J神的计算几何基础知识科普Orz。

只要知道点积就可以了。

首先可以发现01可以看做是分解线,设两个串是s和t,考虑枚举s选0的个数,用t的1当分界线,显然每种选0的方案都对应了t中1的个数个方案,并且不重复,s选1和t选0同理,注意空串被统计了两次,所以题目的f函数即为

\[f(s,t)=(s_0+1)*(t_1+1)+(s_1+1)*(t_0+1)-1 \]

忽略减一,这就是个点积的形式 \(dot(\vec{a}, \vec{b})=a_x*b_y+a_y*b_x\)

考虑点积的几何意义是\(\vec{a}\)\(\vec{b}\)上的投影乘\(|\vec{b}|\),如果把\(\vec{b}\)维护成一个凸壳的形式,会发现凸壳内的点一定不会优于凸壳上的点。

所以把\(n\)个串维护成凸壳,每次询问在凸壳上二分即可。

细节很多,需要特别注意。

T2:

没判连通性丢了10分,输麻了。

L神打表发现链的情况因为保证一定有解,所以奇数输出2,偶数输出1,%%%。

正解是树自同构计数,还不懂。

(待upd)

T3:

%%%J神支配树75分

容易发现一个点不合法当且仅当在他到支配树根上存在一个支配边。

把边也看做点,加进去一起跑支配树。

最后直接从树根往下递推即可,注意与1不连通的点也是不合法的。

正解是最短路优化建图,不会(据说这题是tarjan的论文题,寄)

(待upd)

posted @ 2022-07-15 21:24  Displace  阅读(55)  评论(0)    收藏  举报