「NOIP2017」逛公园
策策同学特别喜欢逛公园。 公园可以看成一张 N N N 个点 M M M 条边构成的有向图,且没有自环和重边。其中 1 1 1 号点是公园的入口, N N N 号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花的时间。
策策每天都会去逛公园,他总是从 1 1 1 号点进去,从 N N N 号点出来。
策策喜欢新鲜的事物,他不希望有两天逛公园的路线完全一样,同时策策还是一个特别热爱学习的好孩子,他不希望每天在逛公园这件事上花费太多的时间。如果 1 1 1 号点到 N N N 号点的最短路长为 d d d,那么策策只会喜欢长度不超过 d + K d + K d+K 的路线。
策策同学想知道总共有多少条满足条件的路线,你能帮帮他吗?
为避免输出过大,答案对 P P P 取模。
如果有无穷多条合法的路线,请输出 − 1 −1 −1。
对于不同测试点,我们约定各种参数的规模不会超过如下
测试点编号 | T T T | N N N | M M M | K K K | 是否有 0 0 0 边 |
---|---|---|---|---|---|
1 1 1 | 5 5 5 | 5 5 5 | 10 10 10 | 0 0 0 | 否 |
2 2 2 | 5 5 5 | 1000 1000 1000 | 2000 2000 2000 | 0 0 0 | 否 |
3 3 3 | 5 5 5 | 1000 1000 1000 | 2000 2000 2000 | 50 50 50 | 否 |
4 4 4 | 5 5 5 | 1000 1000 1000 | 2000 2000 2000 | 50 50 50 | 否 |
5 5 5 | 5 5 5 | 1000 1000 1000 | 2000 2000 2000 | 50 50 50 | 否 |
6 6 6 | 5 5 5 | 1000 1000 1000 | 2000 2000 2000 | 50 50 50 | 是 |
7 7 7 | 5 5 5 | 100000 100000 100000 | 200000 200000 200000 | 0 0 0 | 否 |
8 8 8 | 3 3 3 | 100000 100000 100000 | 200000 200000 200000 | 50 50 50 | 否 |
9 9 9 | 3 3 3 | 100000 100000 100000 | 200000 200000 200000 | 50 50 50 | 是 |
10 10 10 | 3 3 3 | 100000 100000 100000 | 200000 200000 200000 | 50 50 50 | 是 |
对于 100 % 100\% 100% 的数据: 1 ≤ P ≤ 1 0 9 , 1 ≤ a i , b i ≤ N , 0 ≤ c i ≤ 1000 1\le P \le 10^9,1 \le a_i,b_i \le N ,0 \le c_i \le 1000 1≤P≤109,1≤ai,bi≤N,0≤ci≤1000。
数据保证:至少存在一条合法的路线。
直观地有DP式: f [ i ] [ j ] f[i][j] f[i][j]为到i号点,路程比最短路大i的方案数,问题在于转移的顺序。若果没有0边,显然路程递增,就是满足拓扑序的,而加上0边,会产生0环,需要比较复杂的特判。考虑能否直接记忆化搜索,对于一个状态,枚举连向它的边,可以得出它由哪些状态转移过来,于是搜索下去,当发现一个状态调用自己时就判为-1,用标记数组记录哪些状态在调用中即可,这样就减少了思维和代码的难度。
LOJ 2524. 「HAOI2018」反色游戏
小C和小G经常在一起研究搏弈论问题,有一天他们想到了这样一个游戏.
有一个 n n n 个点 m m m 条边的无向图,初始时每个节点有一个颜色,要么是黑色,要么是白色.现在他们对于每条边做出一次抉择:要么将这条边连接的两个节点都反色(黑变白,白变黑),要么不作处理.他们想把所有节点都变为白色,他们想知道在 2 m 2^m 2m 种决策中,有多少种方案能达成这个目标.
小G认为这个问题太水了,于是他还想知道,对于第 i i i 个点,在删去这个点及与它相连的边后,新的答案是多少.
由于答案可能很大,你只需要输出答案对 1 0 9 + 7 10^9 + 7 109+7 取模后的结果.
对于所有数据,有 1 ≤ T ≤ 5 , 1 ≤ n , m ≤ 1 0 5 , 1 ≤ u , v ≤ n 1 \le T \le 5, 1 \le n, m \le 10^5, 1 \le u, v \le n 1≤T≤5,1≤n,m≤105,1≤u,v≤n ,没有重边和自环.
也不知道为什么原本什么思路都没有,其实解法还是比较自然的。
对于图感觉很难做,先考虑比较特殊的情况,比如一棵树(感觉这也是一种套路吧):因为每次反色只会使偶数的黑点变为白点,故若黑点有奇数个一定无解,否则从下往上可把一条条边唯一确定是否取反。
考虑在树上加边,则每次与原树边组成一个环,那么不论这条边取什么,原树边都还是唯一确定一种取颜色的方案,于是一张连通图的总方案为 2 m − n + 1 2^{m-n+1} 2m−n+1,那么设联通块个数为k,则方案数为 2 m − n + k 2^{m-n+k} 2m−n+k。
对于删去一个点,考虑是否会新增连通块,以及是否会使原连通块无解,维护每个点是否属于割点,以及在DFS树上,含奇数个黑点的子树个数即可。
codeforces 1220E
给定一颗 n n n个节点的有根树,要求从根出发,每次不能走上次走来的边,求到达节点权值和的最大值(一个节点经过多次只算一次)。
n ≤ 2 × 1 0 5 , 1 ≤ w i ≤ 1 0 9 n\le 2\times 10^{5},1\le w_i\le 10^{9} n≤2×105,1≤wi≤109
依据题意,一个边双中的点可以互相任意到达,边双之间也可互相到达。对原图的边双缩点,变为中间是一些边双的外向树的形态,于是贪心即可。
给定坐标系上的n个点,将它们黑白染色,要求使得每行、每列的黑白颜色数差不超过1,输出一种方案。
数据范围: n ≤ 200000 , 1 ≤ x i , y i ≤ 200000 n\le 200000,1\le x_i,y_i\le 200000 n≤200000,1≤xi,yi≤200000
orz直接切掉的xjq(而我一点思路都没有)
比较套路地(而我完全没想到),把每行、每列看做一个点,每个点看作对应行、列的一条连边,要求把边染色,使每个点黑、白连边颜色数只差不超过1。
先考虑黑白颜色数相等的情况,联想到用欧拉回路交替地把边染色,如果能染完就没有问题(因为每条边都是行和列之间的边)。而欧拉回路存在的条件是每个点度数都为偶数,考虑对于度数为奇数的点,因为还可以有1的误差,故把它们两两之间连边,这样用欧拉回路染色后依然合法。