传送门:https://atcoder.jp/contests/arc065/tasks
前言:虽然这次只做出一道题,但是我喜欢。把很多问题暴露出来了。而且题目也很有意思.
C.水题
从前往后不好做,就从后往前取。暴力string模拟一下即可。其实如果可替换的字符串很多了,可以考虑使用hash + dp.
D.并查集 + map
题目大意:给你一张图,有两种边。现在问你对于每个点,求既能够 [只通过第一种边到达的] 又能够 [只通过第二种边到达] 的点的个数.
题目思路:
其实我最开始的思路与正解已经接近了。维护两个并查集,一个只通过第一种边的, 一个 只通过第二种边的。 然后对于一个点,我们只关注它所在的两个集合的点集的交。这里我就想用bitset去存,然后就n^2的时空了,就无了。这里的思路还挺巧妙的。
我们转而算 点的贡献 ,即:对于每个点,我们用它所在的两个集合的父节点这个二元组来表征它
然后将每个点的二元组放入MAP.再对每个点进行查表即可。
E.切比雪夫距离与曼哈顿距离的互相转化
本题其实转不转都可以。不转麻烦些。
转切比雪夫距离。然后将坐标离散化,对每行每列存vector.然后跑BFS将所有可以达到的点都标记一下(就是四个方向的正方形,vector里二分一下)。之后再对所有可达点,vector里二分找点对。最后每个点对都会被计算两次。所以除以二。不补了,太恶心了这题.
F.有趣的“区间”dp
题目大意:给你n个01序列。然后给你m个区间。对于每个区间里的值,你可以对他们进行重排列。问你能够得到多少个本质不同的序列。(区间可能相交) (n <= 3000 , m <= 3000).
题目思路:
方法一.刷表法dp,巧妙的状态定义(摘自大佬博客)
其实如果区间不相交,这就是一个简单的组合数求解。先考虑区间不相交的情况下,如何使用dp求解。
定义状态:
答案是:
那对于非区间的地方来讲,我们不妨把他们转化成[x,x]的区间.这样就统一了。
所以我们求出对于每个点,它右端点最远能够衍生多远right[i]。
现在讨论区间对状态的影响:在我们从左至右填放数字的时候。每进入一个区间,我们可任意放置的1的个数就会相应增加为【该区间的1的个数】.
决策:对于每个点,我们有两种决策:放1或者放0.但是能放0/1是有条件限制的:
1.当j = 0 时,这一位无法填1.只能填0.
2.当 当前区间所剩位置 == j, 即这一位只能填1,不能填0.不然就无法在该区间用完j了,自然状态不合法.
现在面临第二个问题:如果区间相交怎么办?
首先,区间包含,可以直接忽视小区间。
区间相交时,在交界处,无非就是多了一段 [R1 , R2]这一新区间。一样的处理即可。
这道题真是船新版本dp。。。难理解阿
AC代码:https://atcoder.jp/contests/arc065/submissions/17109761