C Euclidean Distance
题意: 给出高维空间的一个点A, 求另一个点P满足坐标非负且坐标和为1, 使得P到A的距离最小.
真正的思路: https://www.cnblogs.com/dillonh/p/11215846.html
虚假的思路: 本以为可以用拉格朗日乘子法做, 最后发现没有考虑坐标非负的条件, 不是只有等值约束,还有n个不等式约束, 所以L函数会多n个系数不会求...然后又用了KKT条件, 结果最后有ki*g(xi)=0, 网上找到的方法是枚举ki=0或者g(x)=0...2^n复杂度...xjb求果然做不出
虽然跟这个题的做法没有关系, 但是还是把看过的博客码一下, 有关拉格朗日乘子法和KTT条件:
https://www.cnblogs.com/liaohuiqiang/p/7805954.html
https://blog.youkuaiyun.com/weixin_41500849/article/details/80493712
https://blog.youkuaiyun.com/qq_34531825/article/details/52872819
E ABBA
题意: 给出AB的个数n, BC的个数m, 问有多少个长度为2*(n+m)的串是可以由n个AB子序列和m个BA子序列构成.
思路: 比赛时就没有好好想一下dp, 一直在对着表找规律, 最后也没有找出来. 虽然如此, 但是我感觉打表还是很有用的.
dp 刷表法
我们从串的第一位开始填字符, dp[i][j]表示当前用了i个A和j个B时, 会有多少种情况合法.
可以知道,
假设有一个合法串,因为子序列n个AB和m个BA,那么显然有前n个A必为AB的A,前m个B必为BA的B。因为如果我前n个A中有一个是BA的A,那我是不是可以从更后面随便找一个A给这个B用,那么显然前n个A必为AB的A。
我们假设DP[i][j]为i个Aj个B,放A:
如果i < n那么可以直接放这个A,理由如上
如果i >= n,那么我们要确保这个A能给前面的B当BA用,那么当前BA需要的A是min(j, m)个,已经给他了i - n个,故(i - n) < min(j, m)则还可以继续放。
参考: https://www.cnblogs.com/KirinSB/p/11209560.html
I Points Division
给出平面上n个点, 每个点有a价值和b价值, 现在划一条折线将平面分成A, B两部分, 使得A/B部分的任意一个点p/q满足, Xp<=Xq, Yp>=Yq. 在此基础上, 求A中a价值+B中b价值的最大值.
这条线是从左到右不下降(阶梯状上升的).
假设在线上的点, 属于B集合(将线移动到紧贴B集合的边缘).
dp[i]维护当i点在这条线上时, 所有考虑到的点的最大贡献.
dp[i]=max(dp[1~j])(Ⅰ)+b[i]
对于每个i, 不但要算出并更新当前其dp值(Ⅱ), 还要更新之前点的dp值(Ⅲ). 这个过程就是让之前每个点考虑到的点的范围. 这个过程相当于:
(Ⅲ)对于每个j∈1~n, dp[j]+=a[i](如果i在j上方) dp[j]+=b[i](如果i在j下方) 不要忘记dp[j]代表j这个点恰好在线上.
因为考虑每个点都有三个操作: Ⅰ查找区间最大值, Ⅱ更新当前点的值, Ⅲ更新所有点的值(+a[i]或b[i]), 所以我们要用线段树维护区间最大值.
另外,上面提到的不论是i,j,1,n都是离散化后的y坐标.
对于所有的点, 要按x坐标从小到大,x坐标从大到小排序.