【刷(shui)题记录】201802中旬~201802下旬

不知不觉水了十几天的题目了,到开新文章的时候了。
回老家的时候可能做题也会少一点(也许不会),还要写作业+学习Linux+学习Vim。
不过也只能这样了233.

2.11

今天去打球看电影了,只水了四题,还有另外一题只有1个人AC的,我刚了3h+,写了一个正确的程序(也许吧),但是因为常数太大会TLE,以后慢慢改一下试试(现在因为不想掉正确率懒得改)。

BZOJ3705——String——Hash
其实本来想写马拉车的,不过好像没有必要。
把这个矩阵从四个角各哈希一遍对于每个点二分答案 验证时将四个哈希值全都取出来对比即可
然后只枚举 i+j i + j 为偶数的点 得到的边长除以2就是以这个点为中心的正方形回文子矩阵数量

BZOJ3706——Map——Euler_Path
首先如果有某个点连出的黑边度为奇数,则无解,否则必然有解。
然后如果有解的话,ans=图中含有黑边的联通块数。
因为如果一个联通块内用两个反向刷变成全白,那么一定可以将这两个反向刷的路径合并。

BZOJ3707——Calc_Geometry——Area
那么枚举两个点,把它们作为y轴旋转坐标系,那么最小面积一定是x坐标绝对值最小的那个点。
考虑按枚举两个点的斜率排序,每次旋转后只有这两个点的横坐标相对位置会改变,然后统计答案。

看黄学长的博客如是说:
按照x坐标排序,将相邻的点分为一块,块内暴力。。
由于这样不够靠谱,所以我们随机旋转坐标系几十次就差不多了。

BZOJ3511——Map——Minimal_Cut
打BZOJ3708绝望以后,我们来水一题。一眼最小割。
考虑划为 S S 集代表 A A 国,划为 T T 集代表 B B
建图: S S 连每个点流量 VA V A ,每个点连 T T 流量 VB V B
对于每条边,两个端点点之间连双向边流量 EC E C
新建一个点 X X S S X X 流量 EA E A X X 连两个端点流量 INF I N F
再新建一个点 Y Y ,两个端点连 Y Y 流量 INF I N F Y Y T T 流量 EB E B
认为1号点 VA=INFVB=0 V A = I N F , V B = 0
n n 号点 VA=0VB=INF V A = 0 , V B = I N F

(BZOJ3708下载了集训队的数据,本地测试飞快,正在向BZ要数据qwq)

2.12

早上起床发现lydsy给了3708的数据,打开一看发现数据是错的,心态崩了,再次联系lydsy,然而一直到晚上都没有回我qwq。今天水一下九月月赛,明天要回老家,又是7h的车程qwq。

BZOJ5043——DP——Common
从高位到低位考虑,设 f[i][j] f [ i ] [ j ] 表示考虑到第 i i 位,第 i i 位之前部分的 m m 还剩 j j 时,最小的 k k 是多少,因为当 j>n j > n 时必然无解,故只需要考虑不超过 n n 的状态。

BZOJ5044——Others——Construct——Plane_Geometry
一道比较简单的构造题吧。
考虑初中知识,尝试用向量(3,4)来构造(包括它的翻折旋转)。(其实样例已经在暗示了)
然后我们发现当 n>4 n > 4 时,都可以在 (n2) ( n − 2 ) 边形的基础上进行构造,然后就没有了。

BZOJ5045——Others——Scan_Lines
旋转坐标系,转化为若 (x,y) ( x , y ) 以及 (x,y+1) ( x , y + 1 ) 都有砖块,则 (x+1,y) ( x + 1 , y ) 处可以放入一个砖块。
从下到上考虑每个 x x ,那么若某个 y y 右侧不存在 y+1 y + 1 ,则它不可以存在,用set维护所有存在的 y y ,以及所有右侧为空的 y y ,这些 y y x+1 x + 1 处要被删除。

BZOJ5046——DP——Game_Theory
首先有一个很显然的结论:这个游戏不关心能量的多少,只关心能量的差值。
然后观察到题目中特意强调了美味值和不大,考虑用这个dp。设 s[i] s [ i ] 表示 i i n n 这些糖果美味度的总和。
f[i][j] f [ i ] [ j ] 表示考虑 i i n n 这些糖果形成的子游戏,先手希望拿到至少 j j 点美味度时,先手与后手的能量差值最少是多少。
若先手决定拿走第 i i 个糖果,那么后手能拿走的美味度总和不超过 s[i]j s [ i ] − j ,即要保证后手拿不到 s[i]j+1 s [ i ] − j + 1 ,故 f[i][j]=f[i+1][s[i]j+1]r[i]+1 f [ i ] [ j ] = − f [ i + 1 ] [ s [ i ] − j + 1 ] − r [ i ] + 1
若先手决定让后手拿第 i i 个糖果,那么至少比后手多1点能量,且可以在未来拿到 j j 点美 味度,故 f[i][j]=max(1,f[i+1][j]+r[i]+1) f [ i ] [ j ] = m a x ( 1 , f [ i + 1 ] [ j ] + r [ i ] + 1 )
最后先手的总美味度即为最大的 k k ,满足 f[1][k]AB f [ 1 ] [ k ] ≥ A − B

BZOJ5047——Map——Shortest_Way——Dijkstra
对于固定的终点来说,依然是越早到越好。
预处理出模 c c 意义下每种取值的最佳等待时间,然后建图求最短路即可。

BZOJ5048——Map——Union_Find_Sets
观察到塌陷的地方比较少,于是我们将奶牛的运动转化为塌陷的运动。
维护四个方向的并查集,将障碍扫过路径上的奶牛删掉即可。

看看明天车上能不能水完九月月赛吧qwq 。(可能会没有位置给我放电脑呢,这样我就要手机码了。)

2.13

恩,酒店的网速还可以,就是有点不稳定。
白天在老家房子的话是没有wifi的qwq,所以这几天写题会很少,不过相对的质量也会更高吧。(大概率不会)

BZOJ5049——Map——Meet_In_The_Middle
题目又是特意提醒了数据随机,那么这样就好办了。
随机的话大概一个点平均连5条边,可以yy一下最短路的距离也不会太长,大概是8左右吧。
这样用MEET_IN_THE_MIDDLE,从 S S T T 各往下搜4层。
如果没有碰到的话就BFS整张图,这样的情况不会太多。

BZOJ5050——Data_Structure——Segment_Tree(ODT)
怎么说呢,数据随机,那就可以乱搞了。
根据以往经验,这样的题一般都是可以暴力维护一些东西的。
其实我们维护一下最小深度差,深度差以内的就直接加,超过重构就行了。
线段树做。(其实这种暴力的貌似都叫ODT?老司机树233)

BZOJ5051——DP——Compression
无视同一行/同一列的两个格子的位置关系,只需要在它们不相同时将方案数乘2,
如此一来只关心每一行/每一列有多少格子没满足,这只有0,1,2 三种情况。
f[i][j][S][k] f [ i ] [ j ] [ S ] [ k ] 表示考虑到 (i,j) ( i , j ) ,每一列剩余情况为 S S ,第 i i 行还有 k k 个格子需要填充时的方案数,然后逐格转移即可。
时间复杂度 O(n3n) O ( n 3 n )

这样的话BZOJ的2017九月月赛就水完了呢,这几天都是做套题会比较好吧。
还要抽时间写作业啊。
lydsy还是没有回答3708数据问题!!!!!

2.14

今天lydsy终于回了数据问题,然而说有空再改,WTF

BZOJ3827——DP——Common
神奇的dp。
首先断环成链,计算前缀和。
然后计算每一个点作为该区间结尾端点时的 cnt c n t 值和 last l a s t 值, cnt c n t 值记录区间 [last[i],i] [ l a s t [ i ] , i ] 完成分割的分割数。
当我们枚举一个点,显然要贪心取最长,所以有: sum[i]sum[j]d s u m [ i ] − s u m [ j ] ≤ d
转移: cnt[i]=cnt[j]+1,last[i]=last[j] c n t [ i ] = c n t [ j ] + 1 , l a s t [ i ] = l a s t [ j ]
ilast[i]n i − l a s t [ i ] ≥ n ,输出 cnt[i] c n t [ i ]
24MB内存我**

BZOJ3828——Others——Miscellaneous
首先先 O(n) O ( n ) 扫出以所有点为相遇点,想走出符合条件的这个路径的话,左端点最靠右是多少,以及右端点最靠左是多少
这样对于从左到右的所有相遇点,他们的左端点和右端点都是单调的
所以我们可以利用这个性质, O(n) O ( n ) 扫出对于每个相遇点的左端点和右端点外,是否有颜色相同的点,如果有,则可以把他们当做起始点,如果没有,则这个点不能当做相遇点..

BZOJ3829——DP——Greed
啊,一看就是树形dp什么的。
对每个节点记录两个值,一个是从这个节点下去遍历所有子节点之后再回来所需要花费的时间,另一个是假设从0时刻开始到达这个点并接下来遍历这个子树,安装完成的时间的最大值最小是多少
然后转移时我们可以贪心得排一个序,然后按顺序走完这些子树,直接算出父节点的值
不妨设 ti t i 为从 i i 开始遍历一圈回来的时间, bi b i 为这颗子树最大值的最小值
然后子树 i i 排在 j j 前面当且仅当 max(1+bi,3+ti+bj)<max(1+bj,3+tj+bi) m a x ( 1 + b i , 3 + t i + b j ) < m a x ( 1 + b j , 3 + t j + b i )

BZOJ3830——DP——Parallelogram
首先这些车肯定是分批的,然后我们就可以dp了。
f[i] f [ i ] 表示前 i i 辆车全部回来的最少时间,那么有:

f[i]=max(f[j]+ij1,A[i])+2s+ij1 f [ i ] = m a x ( f [ j ] + i − j − 1 , A [ i ] ) + 2 ⋅ s + i − j − 1

然后 f f 数组显然是单调递增的,所以 f[j]+ij1 f [ j ] + i − j − 1 也是单调递增的,就分段得到 f[i] f [ i ]
{f[j]+ij1+2s+ij1,A[i]+2s+ij1,f[j]+ij1>A[i]f[j]+ij1<=A[i] { f [ j ] + i − j − 1 + 2 ⋅ s + i − j − 1 , f [ j ] + i − j − 1 > A [ i ] A [ i ] + 2 ⋅ s + i − j − 1 , f [ j ] + i − j − 1 <= A [ i ]

对于下面那部分,要使 j j 最大,可以直接在 f f 数组里面二分,然后上面那部分就是求一个 [j,i) [ j , i ) min m i n ,可以数据结构维护。
但实际上上面的部分有决策单调性qwq,然后决策点单调前移,所以就可以 O(n) O ( n )

BZOJ3831——DP——Monotonous——Queue
这个…单调队列优化dp就没了。

今天写了这么多dp,晚上CF的dp还没写出来,太惭愧了啊。

2.15

BZOJ3832——Map——Topsort
很好的利用了DAG的性质。题解

BZOJ3833——Divide_Conquer——Overall_Binary//——Data_Structure——Tree_In_Tree——Segment_Balance
坐标系的转化是要记住的一个点。
然后这道题很数据结构,又被我分治掉了qwq。题解

BZOJ3834——Divide_Conquer——Divide_Block——Common
首先枚举答案 n n ,变成检验 A1n<BnC1n<Dn ⌊ A − 1 n ⌋ < ⌊ B n ⌋ 以 及 ⌊ C − 1 n ⌋ < ⌊ D n ⌋ 有没有解
分块求解即可。

BZOJ3835——Others——Miscellaneous
没想到,膜题解。
首先,最优方案一定是先用i步拿完了前i层的点,然后再每次取k个,直到取完。
所以对于每一个 k k ,相当于求 max(i+s[i]k),1imaxdep m a x ( i + ⌈ s [ i ] k ⌉ ) , 1 ≤ i ≤ m a x d e p
max(ki+s[i])k,1imaxdep ⌈ m a x ( k i + s [ i ] ) k ⌉ , 1 ≤ i ≤ m a x d e p
也就是说对于每一个 k k ,只需要求出 max(ki+s[i]) m a x ( k i + s [ i ] ) 就好了。
我们可以把 ix+s[i] i x + s [ i ] 当做一个一次函数,然后对于不同的 i i 形成的这些一次函数维护一个凸壳,然后把 k k 排好序在上面扫一遍就可以求出最大值了

BZOJ3836——DP——Compression
对于每个点 x x ,设 S S 为三进制状态, S S i i 位表示根到 x x 路径上深度为 i i 的点的状态:
0:选了;1:没选,且没满足 ;2:没选,且已满足
f[i][j] f [ i ] [ j ] 表示考虑根到 x x 路径上深度为 i i 的点时这些点的状态为 j j 时的最小费用,然后按DFS序进行DP即可。

我永远喜欢薇尔谢特!

2.16

BZOJ3521——Data_Structure——BIT
将题目的条件转化后我们可以得到:

k[L,R],sum[L1]sum[k]sum[R] ∀ k ∈ [ L , R ] , s u m [ L − 1 ] ≤ s u m [ k ] ≤ s u m [ R ]

处理出 L[i] L [ i ] 表示i左侧第一个大于 sum[i] s u m [ i ] 的的位置), R[i] R [ i ] 类似。
然后问题就转化为 MaximizeRL+1 M a x i m i z e R − L + 1 同时 L[R]L,RR[L] L [ R ] ≤ L , R ≤ R [ L ]
R[j] R [ j ] 从小到大排序,依次把 iR[j] i ≤ R [ j ] 的i加入候选部分,然后再用BIT维护剩下的 L L 数组,就可以解决了,复杂度 O(nlogn) O ( n l o g n )
上面对于 L,R L , R 数组的处理复杂度为 O(nlogn) O ( n l o g n ) ,但是由于本题特殊的性质:前缀和连续变化,因此直接记录上一个值的位置就可以了,可以做到 O(n) O ( n )

BZOJ3522——DP——Tree
由于可以 O(n2) O ( n 2 ) 搞,很容易想到枚举中间点(树根),然后用树形DP搞一搞。
这题比较简单,Claris在4543将 n n 的范围增大到了10w,见下。

BZOJ4543——DP——Tree
没错,这题的指针转移十分妙,而且时间复杂度证明更妙!
其实上面不应该写见下,应该是见题解

BZOJ3523——Greed——Use_Data_Structure——Monotonous_Queue
感觉没什么好说的qwq。就是多的先放,一样多放end,放不了无解。堆维护一下。

BZOJ3524——Data_Structure——Persistent——Segment_Tree
一道主席树模板题。

BZOJ3526——Data_Structure——Segment_Tree
在线段树上存 mi,mx m i , m x 分别表示表示该左端点取卡牌的两个值时,右端点的最小值,没有就是-1。
合并区间的话,判断右区间的左端点和左区间的值的大小即可。

BZOJ3872——Divide_Conquer——Binary_Search
显然从食蚁兽的边倒着推可以使问题更简单。
以这条边作为这棵树的“根”,开始遍历其他的边,
遍历到每条边的时候计算一下“到这条边时这群蚂蚁会被吃掉”的当时蚂蚁数量上限和下限。
然后对于每个叶子节点的那些边,二分一下有多少组蚂蚁会被吃掉就好了。

今天水了好多题qwq。把POI2014写剩下一题了,最后那题Snake是神题,大概是汉密尔顿回路,然后什么鬼dp,并不会。现在BZOJ上和POI上的solved都只有1。
开新番了qwq,但我永远喜欢薇尔谢特!

2.17

没什么特别想做的题,然后今天去看了电影所以时间比较少,索性做一下雅礼集训的题。

LOJ6029——Data_Structure——Segment_Tree
显然又是线段树的暴力(ODT)维护什么的。
区间除法其实就是区间减法,然后如果某一段减去的数字一样,显然可以一起打标记,否则暴力下放。
线段树记录的大概就是max和min之类的。

LOJ6030——Others——Construct——Miscellaneous
以下白0黑1。显然只有全白是无解的。对于每一列,只要有0,都需要被赋值至少一次。
考虑构造一个全1的行来进行赋值,可以枚举构造第 i i 行,设这行的零有 x x 个。
此时如果第 i i 列有1,则构造出这个行需要 x x 步,否则需要多花费一步给这一列放一个1。
所有步数取min即可,当然还有一些细节处理。

LOJ6031——String——SAM
神题,看题解,看完还是不会写。对着别人的程序写.gif。
构造SAM即可求出某个字符串在原串中匹配的次数,对 k k 阈值

如果 Ksqrtn K ≤ s q r t n ,即长度不大,暴力枚举区间即可,复杂度 O(K2q) O ( K 2 q )

如果 Ksqrtn K ≥ s q r t n ,那么每一个询问区间都是一个串前缀的后缀,这个可以倍增跳fail来做,复杂度为 O(q(K+mlogK)) O ( q ( K + m l o g K ) )

国家队今晚更新qwq

2.18

昨晚熬夜看了下一集,但是不能一次性看完真是很难受!!
今天做的是NWERC2015

BZOJ4425——Greed——Use_Data_Structure——Monotonous_Queue
把所有区间按照左端点从小到大排序,对于一个区间,选择结束时间最早的区间作为上一个,答案+1;如果不存在则新建一个。
优先队列维护一下即可。

BZOJ4426——DP——Parallelogram
如果一个区间包含另一个区间,那么这两个区间是否在一起的生产率是一样的。
将所有这种包含了其他区间的区间放入数组 b b ,其余的放入数组 c c ,有多个相同的时候则从 b b 移一个到 c c
那么 c c 里所有区间左端点递增,右端点也递增,设 f[i][j] f [ i ] [ j ] c c 中前 i i 个区间划分成 j j 组的最大收益,直接DP即可,决策具有单调性。
然后把 p p 分配给 b b c c ,求出 b b c c 组合取来的最大收益即可。

BZOJ4427——Map——Bipartite_Graph_Matching
照题意建图,然后跑二分图匹配。细节特别多需要注意。

BZOJ4428——Search——DFS
方程 f[i]=min{pj+f[nj+1]}+r(1j<n) f [ i ] = m i n { p ∗ j + f [ ⌈ n j + 1 ⌉ ] } + r ( 1 ≤ j < n )
记忆化搜索即可通过。
我们考虑把 n n 行分成 j+1 j + 1 段,每段下面加一个 printf p r i n t f ,由于最后一个可以通过排除法得到,所以只加 j j printf p r i n t f ,还有题目中说是最坏情况,所以把有问题的一段给最大的。
其实在枚举的时候有个小技巧, nj+1 n j + 1 取整在一段时间内只是会一样的,而 j j 反而大了,这样的 j j 明显不会更优,可以跳过。

BZOJ4429——Map——Bipartite_Graph_Matching
显然就是一个二分图匹配,没了。

BZOJ4430——Data_Structure——BIT
看第一眼:不就是个三维偏序,直接上CDQ,下一秒发现还是算了。
考虑不满足条件的数的性质,这一对数在其中两个排列里的位置关系是相同的,在另一个排列里的位置关系相反。
那么统计两两排列之间不满足偏序关系的数对的个数,这样统计下来每对数都被统计了两次,除以2就是不满足条件的对数。
树状数组求逆序对的简单过程qwq。

BZOJ4431——Calc_Geometry——Simulation
令人绝望的暴力计算几何题。
首先从大到小枚举答案,再答案!枚举方案,通过镜面对称终点得到路线,然后平方验证路线。

这最后五天会花多一点时间写作业,争取能做完,所以最后这几天一共就水一套月赛加两三道杂题好了,其实也没什么心情写题目了。

2.19

今天大部分精力用来写作业了,不过还是抽时间写了几个水题。
明天就要回家了,作业的压力好大。

BZOJ2818——Math——Phi
良心水题,筛出欧拉函数再求个前缀和就可以了。

BZOJ2819——Map——LCA
树链查询可以变成对某些点到根的查询的叠加,这样就只需要解决查询从根发出的树链即可。
如果我们询问的是从根到 X X 节点树链上的值,那么只有 X X 节点或 X X 节点的祖先可能影响到 X X 节点的答案。
也就是说,一个点修改以后,只会影响它为根的子树内的节点。
这样我们把这个节点所在的子树区间 [l,r] [ l , r ] 修改一下即可。
查询的时候,如果查询的是 X X 点,那么返回X节点所在DFS序中的那个位置的数即可。
这样我们可以用线段树就行了,BIT之类的数据结构也是可以的。

BZOJ2826——DP——Monotonous_Queue
f[i][j] f [ i ] [ j ] 表示第 i i 天持有 j j 个污染物,那么答案一定是 f[i][0] f [ i ] [ 0 ] 中的一个。
转移式: f[i][j]=max(f[it1][k]a[i]k+a[i]j) f [ i ] [ j ] = m a x ( f [ i − t − 1 ] [ k ] − a [ i ] ∗ k + a [ i ] ∗ j )
用单调队列维护 f[it1][k] f [ i − t − 1 ] [ k ] ,保证队头最大。队列中记录 k k
当队头的 k k 加上当天的最大买入值仍小于 j j 时弹出队头。
队尾的值若小于当前的值则弹出队尾。

至此BZOJ的solved134,突然很想写到150solved,但是可能会不够时间写作业。纠结.gif

2.20

今天回家,身体不适很舒服,solved150还是算了吧,这几天每天写两题,把2017十二月月赛写完就算了。
今天写了两题暴力。

BZOJ5123——Search——Memory
f[l][r] f [ l ] [ r ] 表示根节点为 [l,r] [ l , r ] 的线段树,匹配选择根节点的最大匹配&方案数, g[l][r] g [ l ] [ r ] 表示根节点为 [l,r] [ l , r ]
的线段树,匹配不选择根节点的最大匹配&方案数。那么这是一个很普通的树形dp。
注意到区间长度相等的线段树的结果是一样的,且每层至多有两种区间长度不同的区间,因此直接以区间长度为状态进行记忆化搜索即可。

BZOJ5130——Search——Minimum_Representation
爆搜字符串 S S 的最小表示,然后通过 KMP K M P 求出权值,再用组合数计算方案数即可。

2.21

BZOJ5122——Simulation——Common
这题好神经啊qwq,很巧妙,而且极易写错。
推公式得出终点坐标,然后倒着模拟 r+c r + c 轮,一定可以填完整个矩形。

BZOJ5127——Others——Miscellaneous
一个区间合法当且仅当任意两个相邻的数差值不超过1,预处理出对于每个 i i ,最多能往右延伸到哪里即可。

BZOJ5128——DP——Interval
枚举长度 len l e n ,那么 len l e n 必须要是 n n 的约数,然后枚举每个长度为 len l e n 的子串 S S ,检查是否可行。
对于检查,设 f[i,j] f [ i , j ] 表示区间 [i,j] [ i , j ] 能否通过 S S 产生,转移则是要么在末尾产生某个长度为 len l e n 倍数的区间,要么接着匹配一位(即 S(ji)mod|S| S ( j − i ) m o d | S | )。
区间dp,时间复杂度 O(n3len) O ( n 3 l e n ) 。 总时间复杂度 O(n3d(n)logn) O ( n 3 d ( n ) l o g n )

BZOJ5129——Divide_Conquer——Point_Divide
典型的点分治题目。
disx d i s x 表示从 S S x x 的最小代价 wx=disx+costx w x = d i s x + c o s t x
考虑最短路的 Dijkstra D i j k s t r a 算法,每次从堆中取出 w w 最小的 x x ,然后更新与 x x 距离不超过 limx l i m x 的所有点即可。
注意到 Dijkstra D i j k s t r a 算法中每次取出的 w w 单调不下降,故每个点只有第一次被更新时才是最短路,这说明一个点访问过就可以不再考虑它。
对树进行点分治,对于每个分治结构,从重心开始 BFS 预处理出一个序列,满足序列中所有点到重心的距离依次递增。
那么每次从堆中取出 x x 后,枚举 O(logn) O ( l o g n ) 个经过它的分治结构, 不断更新序列首部的点的最短路,并把更新过的点删除,直到树上距离超过 limx l i m x 为止。
因为每个点只被 O(logn) O ( l o g n ) 个分治结构经过,故总时间复杂度为 O(nlogn) O ( n l o g n )

今天作业做得不少,看来有望做完了QAQ。

2.22

大家当我昨天写的最后一句话是个冷笑话好了。
不颓,是不可能的了,这辈子都不可能的了。
薇尔谢特还是那么美丽qwq。

BZOJ5124——DP——Common
这个题目和下面这个题目都放在题解里面了。

BZOJ5125——DP——Parallelogram
看上面。

BZOJ5126——Others——Miscellaneous
其实做法对于我来说还是有点神奇qwq。
将差值看成边权,并添加 0 边来消除负数,首先可以贪心将每个点都买到剩一个。
那么若是树或者自环,则答案为每个点的入边中权值的最大值。
对于环(自环除外)来说,必须要删掉环上一条边,枚举每条边删除即可。

这几天大概是不会写题目的了,一方面要写多一点点作业,另一方面还要学学vim,收拾收拾东西,看看番什么的。

2.24

今天碰了一道题,是为了学习用vim。然后这道题我还不会做。
不过大概是可以不用dev了吧,虽然只会最基础的操作qwq。

BZOJ3884——Math——Phi
大家看这里吧。

2.25

开学了,晚上讲了训练有关事宜?
然后继续练习vim。
lydsy终于把3708的数据改了!然后我就是第一个AC的人啊!可喜可贺、

BZOJ3708——Map——Euler_Path
这题还是很神的。

n n 个发生器就是 n n 个点,边是每个发生器到它产生的数字,单向边。
那么,这题要做的事就变成,走一条路,使得在无路可走的时候,要么是没有停在 n n 点,要么是没有遍历所有的边。

如果图不是欧拉路图:那么,我们随便dfs找条路就OK啦。

如果图是欧拉路:
如果结束点不在 n n :那么,我们也输出这条路。
如果结束点在 n n :去掉与 n n 相连的边,判断剩下的图中是否存在环。
如果存在:那么去掉环之后,重新找条欧拉路,输出路径。
如果不存在:那么游戏失败。

BZOJ4106——Others——Miscellaneous
直接算出每个点函数值求极差。

2.26

这几天题解就不写在这里了,写一下用了什么方法就算了。写完WF2015开新博文来一起放。

BZOJ4114——Others——Miscellaneous
发现每一条航道都是独立的,那么对于每条航道算出可行的出发时间段,总计最多也只有 106 10 6 级别的区间数。然后问题就转化成了多组区间求交,将区间排序后用1和-1表示进出什么的乱搞就行了。

BZOJ4111——Search——BFS
由于每个点至多连4条边,所以令 fi,j,k f i , j , k 表示到 (i,j) ( i , j ) 这个位置,已经打了 k k 个字符所需的最少步数,直接bfs就行了。

BZOJ4110——Others——Sub_Sequence
sort以后分开两个答案组和一个待定组。
对于每一个串,若只能放进其中一个答案组,就放进去;若两个答案组都能放,就看待定组情况。
若它能放在待定组,就放在待定组;否则将这个串和待定组里的串分别放在两个答案组,清空待定组。

2.27

然后发现自己很多WF的题都是不会做(或者懒得打)的,所以还是不拉出去写了。
昨天的sol已补。

BZOJ4108——Map——Network_Flow——Cost_Flow——Have_Lower_Bound
思考了一会dp,思考了一会网络流,无果,然后发现确实是个网络流。
将每个点拆成两个,之间连边,上下界均为1。用一个单独的点连向1限制流量,再加入每两点之间的边。
然后求有上下界费用流就行了。

BZOJ4116——Map——Tarjan——Bridge
考虑将边集 E E 拆成一些子集 E1,E2,E3,... E 1 , E 2 , E 3 , . . . ,满足任意一个简单环可以被拆成一些子集的和,且不存在两个子集合并后仍满足条件,那么答案就是 gcd(|E1|,|E2|,|E3|,..) g c d ( | E 1 | , | E 2 | , | E 3 | , . . ) 的所有约数

对于一个简单环,上面的边一定不是桥边,而和它在一个集合的边肯定不在其他简单环上。因此删除它之后,这些边就从非桥边变成了桥边。
所以我们尝试删掉每一条非桥边并统计有多少边成为了新的桥边。
上面的gcd等价于gcd(删掉一条非桥边后新产生的桥边数量+1)

BZOJ3792——DP——Matrix
这种题一眼就是矩乘优化dp了吧。
构造矩阵就是把点当做原图的边。

2.28

BZOJ3609——Game_Theory——Common
因为刚开始的数量都是1,所以不论怎么合并,合并次数都是相同的。
所以我们就算一下合并次数然后看奇偶性就行了。

BZOJ4043——DP——Common
QBXT讲过的题目,非权限在UVALive-6932
dp[i][0/1][0/1] d p [ i ] [ 0 / 1 ] [ 0 / 1 ] 表示前 i i 个字符,第一个字符串是否等于第二个字符串,第二字符串是否等于第三个字符串。
枚举第i+1位所有问号是什么字母,直接转移。复杂度 O(n263) O ( n ∗ 26 3 )
预处理出 f[i][j][k][0/1/2][0/1/2] f [ i ] [ j ] [ k ] [ 0 / 1 / 2 ] [ 0 / 1 / 2 ] 表示第一个串字符是 i i ,第二个串字符是 j j ,第三个串字符是 k k ,由于可能出现“?”或者没有字符的情况。
因此若没有字符用0表示,若是“?”用27表示。
这样将其中所有“?”用字母代替后,第一个串的字符与第二个串的字符的大小关系是0/1/2,
第二个字符与第三个串字符大小关系是0/1/2的方案总数。
在转移时直接拿f数组转移。当然这个预处理的复杂度比较可怕233。

BZOJ4117——Math——Probability
一种天气情况的概率只与4种天气的出现次数有关,故将相同概率的情况计数后放入堆中模拟哈夫曼树即可。
即构造哈夫曼树的时候,假设最小的权值为 p p ,有 k k
那么合并成 k2 k 2 个权值为 p2 p ∗ 2 的结点
如果 k k 为奇数,那么将其中一个放回去,剩下的合并

BZOJ4205——Map——Network_Flow——Max_Flow——Common
如果我们直接暴力建图,就算是dinic这种能过百万的方法怕也因为边太多滚粗了。
我们采用将边分类的方法优化。考虑 a a 项属性值能被 x x 整除且 b b 项能力值能被 y y 整除的所有点,只要是在两侧一定能够匹配,所以我们在匹配的网络流模型中间增加一排这样的点,满足要求的左右点分别与它相连,边权为正无穷。
因为 x x y y 只需是质数,这样的点不会很多,大概7000个,而两侧每个点至多连出9条边,最后的图是70000个点,200000条边左右。但这样建图依然是分层图,这下用dinic就可以过了。

BZOJ4548——Others——Scan_Lines
用双向链表维护两边最近的相同颜色的点,考虑如果当前的点是该颜色点中最高的那么双向链表所指的横坐标就能确定下矩形左右边界,当这个矩形确定后,这个最高点会对两侧点造成干扰,删掉就好。这样下矩形就确定好了,上矩形将纵坐标上下翻转就好了。
3658双倍经验

转眼就三月了,要开新坑了qwq。
还有两个月就省选了啊。

你可能感兴趣的:(刷(shui)题记录)