team2012-D3-1A

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

=== 0001 ===

dp

因为是求lcm,所以dp时很多状态是没有用的,只需保留k的约数的那些状态,只有sqrt(k)个

f[i][j]:到第i个点时,数值为j


 === 0002 === 

容斥原理:

注意首先要去重

因为规模有点大而且矛盾的情况很多,所以直接枚举法会超时(大概会吧。。)

因此要搜索所有可能的条件组合,注意去掉有矛盾的,然后按照容斥原理乘以(-1)^k,k为选取的条件数目


 === 0003 === 

先求出一组基,方法同高斯消元

然后枚举改变0、1、2、3个二进制位的情况

判断给定的code是否能是基的线性组合

注意取一个最小值



 === 0004 === 

线性规划:

不妨设四个点分别为p1,p2,p3,p4

四个点的半径分别为r1,r2,r3,r4

那么:

    max r1+r2+r3+r4

s.t r1+r2 <= dis(p1,p2)

    r1+r3 <= dis(p1,p2)

    r1+r4 <= dis(p1,p4)

    r2+r3 <= dis(p2,p3)

    r2+r4 <= dis(p2,p4)

    r3+r4 <= dis(p3,p4)

贴上模板即可



 === 0005 === 

先求出C((n+1)*(m+1), 3)

然后减去三点共线的情况:

枚举线段的x和y分量,不妨设分别为a和b,在该线段上的点有gcd(a,b)个

在整个n*m grid中,这样的线段共有(n+1-a)*(m+1-b)条



 === 0006 === 

java大数

dfs时,记录整个子树的值的和(sum(u))以及该节点下所有儿子的乘积(mul(u))

枚举所有的点,计算砍去该点之后的值 = (sum - sum(u)) * mul(u)

0001

dp

因为是求lcm,所以dp时很多状态是没有用的,只需保留k的约数的那些状态,只有sqrt(k)个

f[i][j]:到第i个点时,数值为j

0002

容斥原理:

注意首先要去重

因为规模有点大而且矛盾的情况很多,所以直接枚举法会超时(大概会吧。。)

因此要搜索所有可能的条件组合,注意去掉有矛盾的,然后按照容斥原理乘以(-1)^k,k为选取的条件数目

0003

先求出一组基,方法同高斯消元

然后枚举改变0、1、2、3个二进制位的情况

判断给定的code是否能是基的线性组合

注意取一个最小值

0004

线性规划:

不妨设四个点分别为p1,p2,p3,p4

四个点的半径分别为r1,r2,r3,r4

那么:

max r1+r2+r3+r4

s.t r1+r2 <= dis(p1,p2)

r1+r3 <= dis(p1,p2)

r1+r4 <= dis(p1,p4)

r2+r3 <= dis(p2,p3)

r2+r4 <= dis(p2,p4)

r3+r4 <= dis(p3,p4)

贴上模板即可

0005

先求出C((n+1)*(m+1), 3)

然后减去三点共线的情况:

枚举线段的x和y分量,不妨设分别为a和b,在该线段上的点有gcd(a,b)个

在整个n*m grid中,这样的线段共有(n+1-a)*(m+1-b)条

0006

java大数

dfs时,记录整个子树的值的和(sum(u))以及该节点下所有儿子的乘积(mul(u))

枚举所有的点,计算砍去该点之后的值 = (sum - sum(u)) * mul(u)