camp day4

来源:互联网 发布:手机淘宝热销宝贝 编辑:程序博客网 时间:2024/06/05 18:38

A题.题意:给出n~200个点,然后给出m < n - 2个逆时针的图形,要求n个点的分布满足:这些个图形的边都是水平的和垂直的. 如果不是水平和垂直的,需要加一个点,然后变成水平和垂直的.每加一个点就多用一个代价.问加点个数最少的加点的个数.
题解:带下界的费用流,点向图形流4个,因为每个都是90度,然后图形与图形之间有一个公共边,那么就连一个费用为一的,流为INF的流,然后图形向终点连2*n-4个流,注意有一个大的矩形,它的点的度数就是它里面的点的个数*2 + 4. 是这样建图,根据360分成90度.但是不知道细节了…
B题.题意:有30个点,是一个二分图,然后有一些边. 现在让你选出一个这样的集合满足:原图中的点在或者它连边的另外一端在. 问有多少种这样的集合.
题解:首先我们二进制枚举小的那一边,2^15次方,表示强制只使用这么多.然后它向右边一些点连边(设为A类点),那些点之外(B类点)的就一定要选,之后左边还剩一些不能选的,只能通过右边A类点再选一下才能覆盖,那么这个的情况数就很多了.我们现在解决的是左边要覆盖到mask(注意可以多)的点,右边的点有多少种选择.我们现在先算恰好覆盖mask的左边的点,发现这是可以预处理的,因为右边确定选的点一定和这些点没关系,接着我们mask枚举最后一个选的点,然后利用恰的性质,2^num - 1, 为系数转移. 然后弄出来恰之后,高维前缀和求和,题目就解决了.
F题.题意:给出一个序列a,n~500, 是一个排列,并且任意拿出来三个数,都不出现2 1 3 和 2 3 1这样的情况. 现在给出一个b,m~m, 里面的元素>=1 <=m, 问能不能找到一个和a形式一样的序列. 就是(ai - bi) * (aj - bj) > 0 对于all i, j.
题解:观察a的性质,就是> 这个样子的,下降的要比上一次降的最后一个数小, 上升的比上一次大, 但是这样还是不够,还有就是最后不能交叉. 那么我们dp[i][j]之后,要维护一个x,y, 但是不知道那个取最值,我们把一维放到dp里面,dp的值作为最值,最后dp[n][m][k] 枚举k看k和y有没有交叉.
G题.题意:有n~2000个数,每个数是ai告诉你,每次随机拿两个数,对它x*y或者x+y,然后再放回去,最后只会剩下一个数,问剩下数的期望. % M(1e9 + 7)意义下的.
题解:首先我们知道总的方案数,之后求各种情况的总和就行了. 并且我们发现最后一定是几个表达式,就是a*a*a + b*b*b + …. 字母随便写的… 的形式,而+号是满足期望可加的,所以我们做的框架是这样:若干几个项的乘积算在一起,对答案的贡献的总和. 我们把所有若干项相乘的这个加起来就是最后答案. 而我们发现不管是哪k个数,只要是k个数乘在一起,方案数都是固定的.我们先求方案数:对于这一堆数,dp[i][j] 有i个数, 只有前k个数他们是乘起来的,剩下的项随便,但是不能乘到前k个上面.这是个关键定义,转移就很好转移了.我们枚举下一次挑哪两个,然后做什么运算. 之后怎么算答案?很简单,就是用dp[i][j]考虑到i, 其中我们关注一个j项乘起来的值得和.
H题.题意:给出一颗树,n~4000,节点上有数字,枚举节点,从根到他都有一个序列,求这个序列的opt. 就是f[i][j] = f[i][k] + f[i][k+1] + s[i][j]. 要求输出每一个节点的这个opt
题解:首先opt能够四边形不等式优化,但是从上面往下面做会超时,因为儿子之间的转化会回溯到一个以前的决策状态,这样可能会很慢. 那我们要换优化方案. 我们发现f[1][i] = f[1][j] + f[j][i] + s[1][i],不看那个s, 那么我们如果把f[j][i]当做一个已经知道的定值,那么前面的是一个一维的dp,并且有决策单调性, 我们有一种用栈维护(id,key)的方法log的取求. 那么我们为了能够f[j][i]已知,发现如果到i的之前被算过就好了.就这样做:我们先算f[x][i],其中x枚举的顺序先从叶子开始,意思是从叶子到一直往上到x到x我们都知道了,这次的枚举顺序是从x到叶子.之间f[x][j] = f[x][k] + f[k][j] + 常数,而j是一个在x下面的点,已经算过了. 所以就解决了. n^2 logn 能过.
J题.题意:给出6666个在1~2016之间的数,让你从中挑恰好2016个数,和是%2016余0.
题解:首先正解: 一个定理, 我们从2*n - 1个数中一定能够挑出n个数,它们的和是%n = 0的, 这个还不够, 我们对p能够做这件事,之后一堆一堆的拿出来p, 最后一次2*p - 1个, 所以需要2oq - 1个数,可以弄出来%pq为0. 我们把2016分解因数,然后dp那些小的,然后一堆一堆凑起来就好了.
还有一种解法….现在做的:先挑出来1966个数,剩50个数,不挑,那么还剩4000左右各数中选50个,我们尽量拿100个不同的数,我们认为100个不同的数选50个肯定能够取出来任意%2016的数.dp做小情况. 而之前挑1900+的时候每次挑剩的最多的那个,保证尽量可以剩的情况很分散

I

0 0
原创粉丝点击