ABC 362
模拟。
小技巧:用 pair
来处理类似问题很方便
题意: 给定三个不共线的点, 判断这三个点生成的三角形是否是直角三角形.
考虑向量法。把三个点两两相减找到构成三角形的三条边所对应的向量,然后用向量点乘的方法判断是否存在两条邻边垂直。
题意: 给定 \(n\) 个数对 \((L_i,R_i)\), 问是否能构造 \(\{A_n\}\), 使得 $ \forall i \in [1,n] $, $ L_i \le A_i \le R_i $, 有 $ \sum A = 0 $. 并给出构造方式.
性质:
-
首先发现令 \(A_i = L_i\) 时, 所得的和 \(\sum A\) 必然最小.
-
同理令 \(A_i=R_i\) 时, \(\sum A\) 必然最大.
-
以性质 \(1\) 的条件为初始状态, 若干次进行操作“对于某个 \(i\) 满足 \(A_i<R_i\), \(A_i\) 自增 \(1\)”, 可以使得 \(\sum A\) 遍历 \([L_i,R_i]\) 中的所有数.
因此,以下关系成立
能构造 $ { A_i } $, 使得 \(\sum A =0\) $ \Leftrightarrow $ \(L_i \le 0 \le R_i\)
至于构造方式呢,直接模拟遍历过程即可
题意: 既有点权又有边权的单源最短路径. (权值非负)
对于一条完整的路径,我们把每一条边的终点的点权转到这条边上,就可以直接在边权上跑了。
比如说对于一条边 \((u,v,w)\), \(\operatorname{val} [u]\), \(\operatorname{val} [v]\), 我们建边的时候这样建就行了:
add_edge(u,v,w+val[v]);
add_edge(v,u,w+val[u]);
然后直接 dijkstra
跑一遍就行了,注意不要忘了加上 \(\operatorname{val} [1]\) 的贡献。
题意: 给你 \(\{a_n\}\), 对于所有的 \(k\in[1,n]\), 求出 \(\{a_n\}\) 中长度为 \(k\) 的等差数列的数量. (元素组成相同但位置不同算作不相同)
考虑 \(O(n^3)\) 的 dp.
-
设 \(\operatorname{dp_{i,k,gap}}\) 表示以第 \(i\) 个元素作为结尾时可以构造的长度为 \(k\) 公比为 \(gap\) 的等差数列的个数.
-
先 \(O(n^2)\) 枚举 \(k=a_i-a_j (i > j)\), 然后可以从 \(\operatorname{dp_{j,k,gap}}\) 刷表到 \(\operatorname{dp_{i,k+1,gap}}\)
-
边界条件 \(\operatorname{ dp_{i,1,gap}=1 }\), 刷表的同时赋值即可.
注意取模。