7.2
题意:给你一个数组要给是-1的填上数,使得没有奇数长度的回文串,问方案数
思路:可以简化成没有长度为3的回文串,所以我们把奇数偶数位分开,要满足每个数组不能有连续相同的值
用$dp[i][2]$表示中间有$i$个-1,两端是否数值相同,转移即可,注意边界和特殊情况
题意:分形图求每个点坐标
思路:计算几何要补补。。递归模拟即可
题意:自己看
思路:从平常的汉诺塔出发,$f[i]=f[i-1]*2+1$,是一个线性递推式,打表找一下规律,发现不同优先级下有关$n$都是一个线性递推式
所以用dfs求出$f[1]$,$f[2]$,$f[3]$,通过三项即可求出线性递推式的系数和常量
(留坑补DP正解)
题意:在平面上的点集中加入若干个点,使得任意两点在一条平行于x/y轴的直线上或这两点围成的矩形上或内部有其他点
思路:发现给你$n<=1e4$而最多可以输出$2e5$个点,所以猜出加的点应该是log关系,所以想到分治
按照要求对于每一层分治,都可以加该循环内点数个数个点,所以我们以$Point[mid].x$为轴,其他点的$y$值都“拍到”该轴上,可以发现这样左右两边任意点对都可以满足要求
题意:有n匹马,每匹马最多有3个敌人,把马划分为2个集合,使得每匹马在该集合中最多只有1个敌人,若不行输出-1
思路:迷惑复杂度过了?? 本人思路很暴力:因为每匹马最多只有3个敌人,所以只对于该匹马,两个集合中一定有1个是合法的,然后手摸了好几组感觉没有-1的情况
先把所有马放在一个集合中,然后爆搜每一匹马,如果这匹马现在不符合,就把它换边,那么这匹马肯定符合,然后去搜被换边他影响的点,如果又不符合了就继续变
可以这样理解:如果这匹马换边了导致换边后在一个集合的敌人(最多1个,且如果已经被确定过)不满足,那么该敌人会换到另一边,可能又会换一个回来(以此类推),但是无论怎样该点在这个集合的敌人数不会超过2,所以在本轮循环中不会再次不符合。这样就可以解释为什么不会出现死循环而-1了
然后循环n轮使得使得每匹马都被确定过,就是最终答案
(留坑证明复杂度(可能是边数很少,图非常稀疏))
题意:给一个字符串,求相邻交换最少次数,使得字符串变成一个回文串
思路:用贪心(没想出来QAQ),考虑开头结尾相对应的位置用什么字母去填,就暴力看哪个字母移到当前开头结尾的步数最少,那就移过去
如果步数最少的两个点就近匹配而没有到开头结尾,那么步数较远的点填开头结尾付出的代价一定比你最近匹配节省的步数多(或等于),所以贪心正确(好抽象。。)
(两组数据理解:..ba....ab....;ab....a.....b b到开头结尾然后a匹配的时间一定小于等于a万里迢迢匹配然后b就近匹配的距离)
题意:在一个序列中挑出一些,挑出的对答案的贡献——若该数与新数列的前一位数值相同,那么$ans+=v[i]*a$否则$ans+=v[i]*b$。$a$,$b$为每次询问所给的常数,求ans最大
很容易搞出n^2的DP:$dp[i]=max(dp[j])+a*v[i]$($c[i]==c[j]$)
$dp[i]=max(dp[j])+b*b[i]$ ($c[i]!=c[j]$)
然后因为只要求前面两种情况的dp最大值,而且c[i]不大,很容易想到权值线段树,维护每一数值的最大dp值,然后询问改点最大和剩下点最大
但是本题$nlog(n)$过不了。所以有更简单的——直接维护每一个数值dp最大值和总体dp最大和次大值(保证贡献dp最大和次大值的来源的c不同)
然后如果最大值的c就是c[i],那么$c[i]!=c[j]$的最大dp值就是总体dp次大值,就可以线性$O(n)$更新了
(今日逗比:竟然忘记平面最近点对怎么写,筛质因数居然写了个O(n)复杂度。。)
7.3
题意:n个人k个钥匙,每个人要分别拿到一个钥匙再回到点p求路程最长的那个人路程最小值
思路:二分+贪心,先二分答案,对于p左边的人,尽量往左边取,右边的尽量往右边取,这样的贪心可以保证如果该二分的答案成立,那么一定可以枚举出方案
还有一种神奇的贪心:可以发现对于取的钥匙一定是坐标连续n个,所以直接暴力枚举区间就可以
(还有一种DP?$dp[i][j]$表示前$i$个人选到前$j$把钥匙$dp[i][j]=min(dp[i][j-1],max(dp[i-1][j-1],dis[i][j]))$)
题意:给一个矩阵,上面有ULRDULRD四种指向,同时这个矩阵的每个元素还有黑或白两种属性,在该格中则下一秒就到了指向的那个格子,现在在矩阵中放机器人,如果两个机器人在若干秒后相撞了,则该摆放不合法,求最大合法摆放个数和以之为前提最多有多少黑格
思路:对于机器人在每个点,可以发现至多走$n*m$步就会陷入环中(一直走一个循环),所以让每个点走这么多步,在一起的一定在一起,不在一起的一定不在一起,倍增实现
(MYY大佬做法:考虑每个点出度为1,所以一定是一个基环树森林,反向连边,然后对于换射出的点计算dep,即为它进入环时的步数,%环长度就可以知道环上哪个点和它相交)
(为什么string不pushback直接赋值会RE啊QAQ)
题意:刚开始只有1点权为0。现有两种操作:
1 u v:以u为父亲,加一个权值为v的新节点
2 u x:以u为端点,看u上方的不严格上升子序列(能选必须选,直到不能选),满足序列点权和小于等于x
思路:调了3个小时。。其实就是用倍增维护权值第2^k个大于该点的父亲,然后再加一些数组就可以了,然后我被赋值顺序搞反还有强制在线写错卡了n久(因为用离线拍导致拍了一个多小时还没拍出来)
然后就创造了CF WA24次的辉煌战绩
题意:这个好烦自己看
思路:0/1分数规划,直接二分枚举答案,因为分子不是定值而是会有前面不同决策的影响,所以用DP,把枚举的ans带进DP使得$DP[n]<=0$就说明ans合法
题意:中文题面自己看(发现自己好懒QAQ)
思路:肯定想到二分枚举答案,然后就是在确定相邻最大差值时看最小操作步数是否小于等于m
先不考虑$a[k]=0$,我们考虑对于$a[i]$的限制,可能来自于左边来自于右边,所以左边右边各更新一次(左边$dp[i]=min(dp[i],dp[i-1]+mid)$,右边同理)
不可能出现i左边的把i右边的更新了然后右边的拿这个值更新了,不然左边的直接更新i就可以了
然后考虑在已经满足的数组上砍一个0,可以发现砍了0以后需要改变的区间是一个连续的[l,r](外面的如果有需要砍的,那么里面一定都需要砍(相邻最大差为mid),如果里面有不需要砍的,那么外面一定也不需要砍),且l,r递增,所以可以用指针。
然后就区间和减去$dp[i]$再减去两个三角形(等差数列)就是把该点砍掉的答案,取每个点最小值
(今天真的wei。。什么题都调不出来。。还要补3道题:LOJ3265 CF1237D AtCoder - agc002_d 还有打崩的CF比赛E2,还有yz6205C题题解 周末补补吧)
来源:oschina
链接:https://my.oschina.net/u/4272693/blog/4336328