CF650D Zip-line
离线+树状数组。修改后分两种情况,一是$b_i$在LIS中,一种是不在LIS中。如果不在LIS中,把询问离线,对于每一个$b$判断左边能转移到它的最长的是多少,右边同理。正着跑一遍反着跑一遍,设原来的LIS长度为$k$,那么答案就是$max(k,ansl[i]+ansr[i]+1)$。如果在LIS中,那么看看去掉$a_i$会不会使LIS长度改变,就是说这个点同时出现在所有LIS中。有一个推论,如果一个点同时出现在所有LIS中,那么它在这些LIS中出现在同一个位置。于是正着跑一遍,对于每一个在LIS中的点,$L[i]$(正着跑时到它的LIS)就是它在这个LIS中的位置,$++cnt[L[i]]$,如果存在某一个$cnt==1$那么这个位置就是出现在了所有的LIS中,答案为$max(k-1,ansl[i]+ansr[i]+1)$,否则的话就是$max(k,ansl[i]+ansr[i]+1)$
jzoj3852,3853,3854
T1分数规划,求$\frac{ans}{node}$($ans$为总边权,$node$为点数),二分一个答案$mid$,如果前面那个东西大于$mid$,化简一下就是$ans-node*mid>0$,转化为所有边权减去$mid$之后图上是否有正环,用spfa跑一下就好了。(然而我似乎spfa判正环一直都写错了……复杂度严重退化orz)。
T2状压dp

T3树状数组+动态开点线段树,然而我数据结构似乎做傻了……先预处理出每一个人做队长最多有几个队员,离散化之后按$r$排序,然后用树状数组维护即可。然后把询问离线,每一个询问有一个$top$表示领导力必须大于等于,那么把所有人按领导力降序排序然后用线段树维护最大值即可
jzoj5925. 【NOIP2018模拟10.25】naive 的瓶子
dp。因为瓶子只有两种可能,一是直接染成目标颜色,二是先染成权值小的颜色再染成目标颜色。那么考虑dp,设$f_i$表示将前$i$个数染成目标颜色所需的最小代价,正着跑一遍,反着跑一遍,更新答案。然后再枚举颜色继续做就行了
P4117 [Ynoi2018]五彩斑斓的世界
照着题解敲了半天……这题时空双卡……
jzoj5932. 【NOIP2018模拟10.27】情报中心
用bitset,$f[i][j]$表示从$i$点经过不超过$j$的距离能到达的点的集合,空间刚好能卡过……于是对每一个点跑一遍最短路然后前缀或一下就行了。询问时直接把所有点的答案或起来
jzoj5933. 【NOIP2018模拟10.27】百鸽笼
把序列倒过来,当成主席树的板子做就可以了。注意要记得每一次更新都要直接覆盖之前的
jzoj5893. 【NOIP2018模拟10.4】括号序列
暴力的话,枚举左端点,然后向右扩展并维护一个栈,如果新加的元素和栈顶相同弹出栈顶,否则入栈。如果某一时刻栈内元素为$0$则$++ans$。考虑优化,若$i$加入栈后和$j$加入栈后栈内的元素相等,说明$[i+1,j]$区间符合条件。于是我们一遍做过去,用map记录栈内元素的哈希值,最后计算答案即可。也可以用trie树来维护,记录一下每个节点的cnt即可,比哈希快
jzoj5895. 【NOIP2018模拟10.5】旅游
就是求欧拉回路,无向图欧拉回路只要在所有点度数都为偶数时才存在,于是在所有的奇数点之间连边。因为边权很鬼畜……每两个奇数点之间的最短路肯定是他们最小生成树上的边。于是先加上所有边的答案。然后对于每条边,判断它两侧的奇度点个数是否都是奇数个,如果是的话这条边的边权再加一次
jzoj5888. 【NOIP2018模拟9.29】GCD生成树
先把相等的连起来,然后把每一个数字看成一个点,从大到小枚举gcd,把所有有这个gcd而且不在同一连通块的连起来。因为是从大到小枚举,可以保证两个点一定只有在gcd的时候会被合并
jzoj5344. 【NOIP2017模拟9.3A组】摘果子
好像是一个叫做树上依赖背包的东西?首先每个点的选择必须先选它父亲,所以选择有强制性,即$f[u][j]=f[u][j-w[j]]+v[j]$,然后选择的话要么整条链都选,要么都不选,则$f[u][j]=max(f[u][j],f[v][j])$,然后从下往上递推即可。注意要把父亲的状态转移到儿子身上,memcpy一下就行了
jzoj4736. 【NOIP2016提高A组模拟8.25】漆黑列车载运数个谎言
看到GOSICK的题有种伤心的感觉不知道为什么。首先逆否命题和原命题的真假性是一样的,那么我们就可以把操作0看做成为朋友,操作1和2看做成为敌人,那么询问就是看这两个是不是朋友就行了
jzoj4737. 【NOIP2016提高A组模拟8.25】金色丝线将瞬间一分为二
因为是曼哈顿距离所以可以两维分别考虑。一个比较明显的暴力是我们二分答案$mid$,然后对前$mid$个排序,处理一遍看看总的距离之和是否大于$D$,时间复杂度为$O(nlog^2n)$。发现这样的话瓶颈在排序上。于是我们不用每一次都排序,可以先在最开始的时候排好序,然后记录一下排名就可以了
jzoj4738. 【NOIP2016提高A组模拟8.25】神在夏至祭降下了神谕
转移方程不难推得$f[i]=\sum f[j](|s[i]-s[j]|\leq K)$。($s$表示$0$和$1$的个数差的前缀和)然后因为每一次都是在一个区间里的答案,所以可以用树状数组维护。不过因为有负数,所以值域要开大一点
jzoj5849. 【NOIP提高组模拟2018.8.25】d
题目要求最大化$min(x)*min(y)$,那么我们先按$x$排个序,从大到小枚举,然后把$b$全都扔进优先队列里,每次把堆顶取出来就行了
P4649 [IOI2007] training 训练路径
题解
jozj100041. 列车调度
总之就是对于每一个新加入的数,找到大于它的最小的数放在它后面,可以发现这样绝对不会比其他方法劣。想了各种奇奇怪怪的姿势都有点问题,于是没办法只能用set暴力模拟了。
jzoj3717. 火车(train)
据说正解并查集然而我不会,只会暴力的树剖。总而言之就是每一次路径覆盖,然后每一次判断下一个要到的点是否已经到过就可以了。加上几发大力剪枝可以过,就是在覆盖的时候如果本区间已经所有数都覆盖过就不用再递归下去了,以及查询的时候如果本区间所有数都被覆盖也不用再继续递归了。然而被细节卡死……首先查询的时候忘了按dfs序查,其次这题卡深搜,只要手动模拟深搜,再然后手动模拟的时候栈和队列搞混了……
P3320 [SDOI2015]寻宝游戏
不难(完全不知道怎么)看出,如果我们按dfs序把所有的被选择的点给排列起来,然后再把相邻点之间的距离加起来(包括首尾,也算相邻),就是答案了。于是我们可以用set来存储当前有宝藏的点的dfs序,以插入为例,设当前插入点为$u$,dfs序比它大的第一个点为$w$,比它小的第一个点为$v$,那么答案就要加上$dis(u,v)+dis(u,w)$,然后再减去$dis(v,w)$,减去同理。然后输出答案就可以了
bzoj3029 守卫者的挑战
概率dp真的是一塌糊涂……设$f[i][j][k]$表示当前打了$i$场,赢了$j$场,剩余背包容量为$k$(因为需要的最大容量不会超过$n$,所以这一维可以剪枝),且能装下所有地图的概率。考虑当前这一场,若是失败,则$f[i+1][j][k]+=f[i][j][k]*(1-p[i+1])$,否则$f[i+1][j+1][k+v[i+1]]+=f[i][j][k]*p[i+1]$。我们将所有的比赛中能拿到背包的放前面,这样可以保证后面取地图的时候可以直接判断空间够不够