最近几天

好吧最近状态不是很好。努力调整状态。

8.19

T1:给定一个图,问是否能从a走b条边到c。

解法:观察到如果从a到b能走与c奇偶性相同且比c小的边数,那么按这种路径走到b后,可以来回走一条边使边数达到c,所以做一个spfa处理从a走到b经过奇/偶条边最小的边数即可

T2:小G要犯N次罪,如果某一种罪犯的次数是a或a的倍数,则不用受惩罚,问多少种犯罪方法使小G不受惩罚。

解法:对同一种罪A,如果有多种数使他不受罚,那么犯这种罪的次数mod它们的lcm只要是这些数中任意一个倍数即可,设状态f[a[1],a[2],..a[n]]表示犯第一种罪的次数mod lcm为a[1],...犯第n种罪的次数mod lcm为a[n]的情况有多少种犯法,最后要求的是f[N,0,0,0,...,0];尤于这些lcm乘起来会小于123,所以可以把n维状态维压成一维,设g[i,j]表示犯了i次罪,压成了那种状态为j的情况的次数,由g[i,j]转移到g[i+1,x],每次转移给g[i+1,x]的贡献是固定的,所以可以设置一个矩阵表示从i状态转移到j状态对状态j的贡献,用f*h(矩阵乘法)即可求出f[i+1],转移N次,所以对矩阵乘法加一个快速幂可以解决超时的问题。


T3:给出一棵树,每条边有一种边权,问在树上走[L,R]条边,这些路径中最大的中位数

解法:点分治,把所有路径分为经过重心的路径和不经过的路径,很经典的分治做法。然后二分一个答案,看经过重心的路径中是否有满足要求而且以二分的值为中位数的路轻,设二分的值为m,设X[i]表示当前这棵子树中从根往下走i步经过的边权大于等于m和小于m的边之差。Y[i]表示查询过的子树中往下走i步的最大边数差(与前面相同),i+j需要满足L<=i+j<=R。我们发现对于i的增加,j的区间是连续转移的,在j上加个单调队列即可。


8.20

T1:设计一种编绎器,支持以下同几种操作:在光标位置加一个数,左/右移光标一位,删除光标前的数,查询s1-sk的最大值。(si为前缀和)

本来我觉得是splay,但没有想到怎么维护前缀和,还是写了暴力

解法:用两个栈维护光标前和光标后的序列,对于光标前的序列再维护一个前缀和的最大值即可


T2:A和B轮流买东西,可以且必须买连续的k件物品,第一个不能买东西的人输,给出两个人初始拥有的钱,和各件物品的价格,问谁赢。 

解法:类似数学题。设m(i)表示要买第i件物品,推出求m(i)的公式即可。


T3:矩形交,好像要写四分树,这种二维数据结构我还没写过,要加强。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值