team2012-E3

从 Trac 迁移的文章

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

原文章内容如下:

姓名:唐雅洁

ID:  Kacey_T

邮箱:tyj_11@163.com

电话: 15267036179








**Contest 1**


0001  Kitty's Game

    有n 个点,m 条有向边,每个点的权值为pi。求从1到n,路径上各点权值的最小公倍数为k的方案数。并且在路径上每走一步,最小公倍数的值都必须增加。

    用动态规划求解,F[i][j]表示到第i个点时,最小公倍数的值为j的方案数,转移为F[i][j] = sum(F[k][x]),满足从k到i有边且lcm(x , pi) = j。因为最小公倍数最多可达到10^6,所以需要将可能达到的值

    先预处理出来,降低动归的复杂度。



0002  Review Plan

    有n本书,要求每天读完一本书,但是有m个限制条件:在第Di天时不能读完Ci这本书。求合法读书顺序的方案总数。

    比较裸的容斥原理,要注意限制条件可能重复的trick。



0003  Decode

    给出k个n位的编码,m次询问判断能否选取一些编码异或产生所要求的编码,并且最多可有3个错误位。若有则输出字典序最小的编码。

    线性空间的基可以表示出空间内任意元素。所以对k个编码消元,最多剩下n个的编码,每一位都有一个代表元。对每一次询问,先枚举错误位数和位置,即确定可能解的编码,再DFS一位一位判断是否可行。



0004  Ribbon Gymnastics

    给出四个点,以四个点为圆心构造四个两两不相交的圆,求四个圆半径之和的最大值。

    画图可推出只有三种情况。



0005  Gao the Grid

    n*m的网格,求三个格点构成三角形的总方案数。

    直接计算太复杂,所以可以用总方案数-不合法方案数来求解。不合法的情况就是三点共线。枚举三点共线的线段所占格子的长x和宽y,然后在这个区域内共线的情况总共有gcd(x,y)-1种,所以可以平方级枚举

    统计不合法方案数。



0006  Cut the Tree 2

    给一棵树,树的权值为子树所有权值之和。现在可以选一个点,所得价值为以它为根的情况下,它的所有子树权值之积。问选哪个点得到的价值最大。

    DFS遍历求子树权值之和,再枚举所选的点计算价值。要注意高精度处理大数。



**Contest 2**  

0007  Alice's present

    一行上有的n个数,m次查询,每次询问[Li,Ri]区间内最靠右的第二次出现了的数字是什么。

    首先从左往右扫一遍,记录下每个数字上一次出现的位置。然后离线处理查询,按照右端点Ri排序,不断更新最优值即可。

0008  Bounty hunter

    有n个城市,每个城市提升1攻击力需花费ai金钱,提升量可以为小数。离开城市时可获得当前攻击力*bi的收益。初始时有x0的金钱及y0的攻击力。    

    很有趣的贪心题,ym猛犸学长。倒着推,首先显然如果要在某个城市购买攻击力,一定是将钱全部花完。列出表达式可以发现,在第i天是否购买攻击力,取决于ai与sum(bi~bn)的大小。假设已经觉得在第j天

    购买攻击力,则在第i天时(i<j),若购买攻击力的的收益+后面的收益>不在第i天购买+后面的收益,则在第i天购买攻击力。

0009  Guess a Function

    格雷码的反函数。

    原式可以改写成g'(f(x))=h2(g(h1(g(x)))),然后我枚举m1和s1,可以得到g(h1(g(x)))的值p,然后h2(p)可由两种情况确定,现当p%m2+s2<m2时,h2(p)=p+s2,否则h2(p)=p+s2-m2。求出m1,s1,m2,s2后

    问题也就解决了。

0010  Maze

    k*n的网格,三种类型的格子,旋转方向任意。m组格子,每一组中的格子类型是相同的。求从左边缘到达右边缘的总方案数。

    显然用动态规划求解,枚举不同的情况即可,转移方程很容易推。另外每一组组内可以用矩阵进行加速。总是WA的原因是矩阵写错了一个变量。

0011  Paint Erased

    给出一些矩形进行插入和删除,最后求一条折线段在插入区域内的长度。

    看了prowindy学长的报告。首先求出每一个矩形和每一个线段的交(用0~1表示),然后把线段离散化,用set维护。

0012  Versus

    给出n对数,求满足(xj>xi,yj>yi)(j>i)的个数是否大于n的一半。 

    比较裸的最长上升子序列。nlogn级的算法。



**Contest 3**

0013  Battle: Dojo

    题意比较长,偷个懒不再描述一遍。这道题是典型的格子题求最优解。

    BFS求解。先预处理出mod4的不同情况下每个defender的朝向和不能够到的点。注意在时刻0也是会遭受攻击的。这种题目主要是考验人的细心程度。

0014  Balloon

    n对圆心坐标,每一组恰好选出一个圆,确定半径,使得它们互不相交。求最大半径为多少。

    比较裸的2-SAT问题。将每个圆拆成两个点,分别表示取与不取,在有条件i则必有条件j时,从i到j建立一条有向边。

0015  Kaguya's Game

    给出一棵树,c种颜色,要求给每个结点染色,并且相邻两结点不能同色。m次询问若在结点x和结点y之间加一条边,染色方案会减少多少。

    单棵树的染色方案数为(c-1)^n,从上往下染色即可推出。而加上一条边之后,原本的一棵树变成了一个环+环上某个结点生出的一颗树。统计环上的方案数可推出公式Fi=Fi-1*(c-2)+Fi-2*(c-1)。最后环与树

    的方案数相乘即可。求解过程中需要用到LCA算法。

0016  The Toy of Flandre Scarlet

    l*w*h的立方格子,每个格子有一个值。每次操作可以任选相邻两个格子同时加上或减去一个数,不限操作次数。问是否能够将所有格子上的数都变为0。

    比较典型的黑白染色问题。每一次选定一黑一白同时加减,可以套用网络流模型求解,从黑格子往白格子建边。若满流则有解,否则无解。

    PS:貌似就是判断奇偶性的问题,弄复杂了。。。

0017  Cipher Lock

    给出一个n个点构成的环,每个点有两个值,要求保证相邻两个点至少有一个值是一样的。给8个点的属性值,求剩下的点有多少种合法方案。

    比较明显的矩阵递推题,加上限制条件之后,对被分成八段的环,顺序扫一遍。对于每个点有4种状态,值1与右端点相同\值1与右端点相同\值1与值2都与右端点相同\都不相同。于是可以推出4*4的转移矩阵,

    每一段的初始状态是确定的。


0018  Japanese Mahjong I

    给出13张牌,问加上哪些牌可以按照规则胡。

    枚举将,然后DFS判断即可。


**Contest 4**

0019  Social Net

    n个点,m条边,每个点有一个权值ci。先求最大生成树,然后在这棵树上,有q次查询,每次查询从结点x到结点y的路径上cj-ci的最大值(j出现在i之后)。

    kruskal求最大生成树,然后LCA查询。倍增维护从结点x,向根走2^i步这段路径中的最大值、最小值、从下至上与从下至上的cy-cx的最大值。最后分两种情况,在同一段/在不同段考虑最优值。同一段的随着

    DFS倍增维护已处理出,在不同段的线性扫一遍即可。

0020  Diablo III

    题目规则不一一描述。大意是打死一定量的小兵就可以打boss,问在满足规则下最多能打死几个boss,在此基础上所喝药水最少。

    打单个boss的过程可以先用动归枚举出来所有情况,F[i][j][k]表示当前人血量为i,boss血量为j,boss攻击力为k的情况下所喝最少要水量。外层的动归则是以第x个地图作为状态量,转移是在该地图打或者

    不打boss,用最近的满足条件的地图转移即可(队列维护)。

0021  Driving Helicopter I

    裸凸包。。。。。

0022  E - Cup

    n个队进行单循环赛,给出每场比赛的比分和世界排名。按照给定规则求小组最终排名。

    按照题目进行递归的模拟即可。

0023  Wagon

    在水平轴上1~n的整点中取m个点放仓库,使得左右点到仓库距离之和最小。并且要求字典序最小的解。然后每个点有一个货物量pi,需要送到离它最近的仓库,如果有两个则任选一个。求最小仓库容量。

    题意不太好懂,它要求的是首先固定住仓库的位置。第一步用贪心模拟,确定仓库的位置。然后再二分答案+贪心判定。

0024  Toy Blocks

    给出n个木块,每个木块有个坐标xi,高度hi。可以讲木块向左或向右推倒,产生类似多米诺骨牌的效果。问至少推倒几块可以全部推倒。

    首先用栈处理出每个木块向左或者向右能够推倒的最远距离lefti和righti。然后再动态规划求解。f[i]表示1-i个骨牌全被推倒并且第i个向左倒最少推几个,g[i]表示1-i个骨牌全被推倒并且第i个向右倒最少

    推几个。转移时,平方级的枚举很好想,但是复杂度太高,所以我们需要用到数据结构来维护。用线段树来维护最小值。最后的ans=min(f[n],g[n])。

姓名:唐雅洁

ID: Kacey_T

邮箱:tyj_11@163.com

电话: 15267036179

**Contest 1**

0001 Kitty's Game

有n 个点,m 条有向边,每个点的权值为pi。求从1到n,路径上各点权值的最小公倍数为k的方案数。并且在路径上每走一步,最小公倍数的值都必须增加。

用动态规划求解,F[i][j]表示到第i个点时,最小公倍数的值为j的方案数,转移为F[i][j] = sum(F[k][x]),满足从k到i有边且lcm(x , pi) = j。因为最小公倍数最多可达到10^6,所以需要将可能达到的值

先预处理出来,降低动归的复杂度。

0002 Review Plan

有n本书,要求每天读完一本书,但是有m个限制条件:在第Di天时不能读完Ci这本书。求合法读书顺序的方案总数。

比较裸的容斥原理,要注意限制条件可能重复的trick。

0003 Decode

给出k个n位的编码,m次询问判断能否选取一些编码异或产生所要求的编码,并且最多可有3个错误位。若有则输出字典序最小的编码。

线性空间的基可以表示出空间内任意元素。所以对k个编码消元,最多剩下n个的编码,每一位都有一个代表元。对每一次询问,先枚举错误位数和位置,即确定可能解的编码,再DFS一位一位判断是否可行。

0004 Ribbon Gymnastics

给出四个点,以四个点为圆心构造四个两两不相交的圆,求四个圆半径之和的最大值。

画图可推出只有三种情况。

0005 Gao the Grid

n*m的网格,求三个格点构成三角形的总方案数。

直接计算太复杂,所以可以用总方案数-不合法方案数来求解。不合法的情况就是三点共线。枚举三点共线的线段所占格子的长x和宽y,然后在这个区域内共线的情况总共有gcd(x,y)-1种,所以可以平方级枚举

统计不合法方案数。

0006 Cut the Tree 2

给一棵树,树的权值为子树所有权值之和。现在可以选一个点,所得价值为以它为根的情况下,它的所有子树权值之积。问选哪个点得到的价值最大。

DFS遍历求子树权值之和,再枚举所选的点计算价值。要注意高精度处理大数。

**Contest 2**

0007 Alice's present

一行上有的n个数,m次查询,每次询问[Li,Ri]区间内最靠右的第二次出现了的数字是什么。

首先从左往右扫一遍,记录下每个数字上一次出现的位置。然后离线处理查询,按照右端点Ri排序,不断更新最优值即可。

0008 Bounty hunter

有n个城市,每个城市提升1攻击力需花费ai金钱,提升量可以为小数。离开城市时可获得当前攻击力*bi的收益。初始时有x0的金钱及y0的攻击力。

很有趣的贪心题,ym猛犸学长。倒着推,首先显然如果要在某个城市购买攻击力,一定是将钱全部花完。列出表达式可以发现,在第i天是否购买攻击力,取决于ai与sum(bi~bn)的大小。假设已经觉得在第j天

购买攻击力,则在第i天时(i不在第i天购买+后面的收益,则在第i天购买攻击力。

0009 Guess a Function

格雷码的反函数。

原式可以改写成g'(f(x))=h2(g(h1(g(x)))),然后我枚举m1和s1,可以得到g(h1(g(x)))的值p,然后h2(p)可由两种情况确定,现当p%m2+s2

问题也就解决了。

0010 Maze

k*n的网格,三种类型的格子,旋转方向任意。m组格子,每一组中的格子类型是相同的。求从左边缘到达右边缘的总方案数。

显然用动态规划求解,枚举不同的情况即可,转移方程很容易推。另外每一组组内可以用矩阵进行加速。总是WA的原因是矩阵写错了一个变量。

0011 Paint Erased

给出一些矩形进行插入和删除,最后求一条折线段在插入区域内的长度。

看了prowindy学长的报告。首先求出每一个矩形和每一个线段的交(用0~1表示),然后把线段离散化,用set维护。

0012 Versus

给出n对数,求满足(xj>xi,yj>yi)(j>i)的个数是否大于n的一半。

比较裸的最长上升子序列。nlogn级的算法。

**Contest 3**

0013 Battle: Dojo

题意比较长,偷个懒不再描述一遍。这道题是典型的格子题求最优解。

BFS求解。先预处理出mod4的不同情况下每个defender的朝向和不能够到的点。注意在时刻0也是会遭受攻击的。这种题目主要是考验人的细心程度。

0014 Balloon

n对圆心坐标,每一组恰好选出一个圆,确定半径,使得它们互不相交。求最大半径为多少。

比较裸的2-SAT问题。将每个圆拆成两个点,分别表示取与不取,在有条件i则必有条件j时,从i到j建立一条有向边。

0015 Kaguya's Game

给出一棵树,c种颜色,要求给每个结点染色,并且相邻两结点不能同色。m次询问若在结点x和结点y之间加一条边,染色方案会减少多少。

单棵树的染色方案数为(c-1)^n,从上往下染色即可推出。而加上一条边之后,原本的一棵树变成了一个环+环上某个结点生出的一颗树。统计环上的方案数可推出公式Fi=Fi-1*(c-2)+Fi-2*(c-1)。最后环与树

的方案数相乘即可。求解过程中需要用到LCA算法。

0016 The Toy of Flandre Scarlet

l*w*h的立方格子,每个格子有一个值。每次操作可以任选相邻两个格子同时加上或减去一个数,不限操作次数。问是否能够将所有格子上的数都变为0。

比较典型的黑白染色问题。每一次选定一黑一白同时加减,可以套用网络流模型求解,从黑格子往白格子建边。若满流则有解,否则无解。

PS:貌似就是判断奇偶性的问题,弄复杂了。。。

0017 Cipher Lock

给出一个n个点构成的环,每个点有两个值,要求保证相邻两个点至少有一个值是一样的。给8个点的属性值,求剩下的点有多少种合法方案。

比较明显的矩阵递推题,加上限制条件之后,对被分成八段的环,顺序扫一遍。对于每个点有4种状态,值1与右端点相同\值1与右端点相同\值1与值2都与右端点相同\都不相同。于是可以推出4*4的转移矩阵,

每一段的初始状态是确定的。

0018 Japanese Mahjong I

给出13张牌,问加上哪些牌可以按照规则胡。

枚举将,然后DFS判断即可。

**Contest 4**

0019 Social Net

n个点,m条边,每个点有一个权值ci。先求最大生成树,然后在这棵树上,有q次查询,每次查询从结点x到结点y的路径上cj-ci的最大值(j出现在i之后)。

kruskal求最大生成树,然后LCA查询。倍增维护从结点x,向根走2^i步这段路径中的最大值、最小值、从下至上与从下至上的cy-cx的最大值。最后分两种情况,在同一段/在不同段考虑最优值。同一段的随着

DFS倍增维护已处理出,在不同段的线性扫一遍即可。

0020 Diablo III

题目规则不一一描述。大意是打死一定量的小兵就可以打boss,问在满足规则下最多能打死几个boss,在此基础上所喝药水最少。

打单个boss的过程可以先用动归枚举出来所有情况,F[i][j][k]表示当前人血量为i,boss血量为j,boss攻击力为k的情况下所喝最少要水量。外层的动归则是以第x个地图作为状态量,转移是在该地图打或者

不打boss,用最近的满足条件的地图转移即可(队列维护)。

0021 Driving Helicopter I

裸凸包。。。。。

0022 E - Cup

n个队进行单循环赛,给出每场比赛的比分和世界排名。按照给定规则求小组最终排名。

按照题目进行递归的模拟即可。

0023 Wagon

在水平轴上1~n的整点中取m个点放仓库,使得左右点到仓库距离之和最小。并且要求字典序最小的解。然后每个点有一个货物量pi,需要送到离它最近的仓库,如果有两个则任选一个。求最小仓库容量。

题意不太好懂,它要求的是首先固定住仓库的位置。第一步用贪心模拟,确定仓库的位置。然后再二分答案+贪心判定。

0024 Toy Blocks

给出n个木块,每个木块有个坐标xi,高度hi。可以讲木块向左或向右推倒,产生类似多米诺骨牌的效果。问至少推倒几块可以全部推倒。

首先用栈处理出每个木块向左或者向右能够推倒的最远距离lefti和righti。然后再动态规划求解。f[i]表示1-i个骨牌全被推倒并且第i个向左倒最少推几个,g[i]表示1-i个骨牌全被推倒并且第i个向右倒最少

推几个。转移时,平方级的枚举很好想,但是复杂度太高,所以我们需要用到数据结构来维护。用线段树来维护最小值。最后的ans=min(f[n],g[n])。