APIO选讲

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 可以通过极角排序后维护两条扫描线来解 决该问题。
APIO2011方格染色
• 有一个n*m的黑白矩阵。其中有k个点已经 被染过色了。对其它没被染过色的点进行 染色。 • 求存在多少种染色方案,使得每2*2的矩阵 中存在奇数个黑色格子。 • n,m,k<=1000000。
APIO2011方格染色
APIO2014连珠线
• 只有操作2存在蓝线。 • 假如我们确定了根。 • 令dp[i][0/1]表示以i为根的子树中,是否存 在一个操作是i通过操作2插入到树中的,这 样的最大分数和。 • 转移比较简单。 • 时间复杂度为n^2。
APIO2014连珠线
• 考虑加速这个做法。 • 令dp[i][j][0/1]表示以i为根的子树中,不考 虑j这个儿子,是否存在一个操作是i通过操 作2插入到树中的。 • 每次根在改变时,只会影响两个dp[i]的变化, 直接更新答案就可以了。 • 时间复杂度为O(n)。
APIO巴厘岛的雕塑
• 从高到低枚举所有位,要使得对于每组该 位最好都为0。 • 令dp[i][j]表示前i棵树分为j组是否能够满足 条件。 • 枚举k,表示令k+1~j为一组。 • 满足条件当且仅当dp[k][j-1]满足条件且 k+1~j为一组时满足当前所有位的条件。 • 时间复杂度为n^3*位数。
APIO2015巴厘岛的雕塑
• 有n棵树,每棵树都有一个年龄,将其分为 m组,其中m是介于A~B之间的一个数。每 组至少有一棵树且所选的树是连续的,每 棵树一定在某个组中。对于一组,令ai表示 该组中树的年龄之和。合理分配使得ai的按 位取或的值最小。 • part1:n<=100,1<=A<=B<=n。 • part2:n<=2000,A=1,1<=B<=n。
APIO巴厘岛的雕塑
• 对于part2: • 仍然从高到低枚举每一位。由于A=1的存在, 我们可以令dp[i]表示前i个数在满足条件的 情况下最少分为几组。 • 因此复杂度降为n^2*位数。
APIO2015雅加达的摩天楼
• 有n个点,每个点有跳跃能力pi,即能从一 个点x跳到x+pi或者x-pi,跳跃能力只能携带 一种,到达一个点j可以直接转化成pj。现 在想从0跳到1,至少需要几步。 • n<=30000。
APIO2010巡逻
• 给定一棵n个节点的树,在这棵树上增加K 条边。使得从1开始遍历完所有边最终返回 1所经过的最少边最小。 • n<=100000,K<=2。
APIO2010巡逻
• 若K=0,最少边显然是2*(n-1)。 • 若K=1,所加的边一定在最长直径上。 • 若K=2,需要找两条边,使得这两条边加入 后组成的环最大。 • 换一个角度考虑,若一条边在第一次中已 经被覆盖了,又被第二条边覆盖了一次, 那么这条边又需要经过2次了。 • 因此将第一条边所覆盖的边对答案的贡献 设为-1,再跑树的直径即可。
APIO2010信号覆盖
• 在二维平面上有n个点。不存在3点共线或 者4点共圆。 • 任意选择其中3个点,两两之间为直径建圆, 在圆内的点即为被覆盖到的点。 • 求期望被覆盖到的点的个数。 • n<=1500。
APIO2010信号覆盖
• 考虑其中每4个点,若这4个点组成了凹四 边形,则对答案贡献1,否则对答案贡献2。 • 我们现在需要计算这样的凹四边形的个数。 • 这等价于枚举一个点,求包含该点的三角 形个数。 • 我们统计没包含该点的三角形个数。
APIO2013机器人
• • • • • • • 有一个n*m的房间,每个格子有几种可能。 1:机器人,编号为1-9中的一种。 2:顺时针旋转90°器。 3:逆时针旋转90°器。 4:障碍。 5:空格。 每次可以向某个方向推动一个机器人,直到机器人 碰到障碍或者墙。 • 编号连续的机器人会变成复合机器人。 • 求最少推动几次,得到复合机器人1-9。 • n,m<=500。
APIO2009会议中心
• 给定n段区间。
• 选择其中若干区间,使得不存在一个点被 覆盖两次。
• 要求在选择区间尽可能多的情况下,选择 的区间的编号字典序尽可能小。 • n<=200000。
APIO2009会议中心
• 第一问十分easy。 • 按右端点进行排序,能加就加。 • 要使得字典序最小。 • 按编号依次枚举区间,若加入该区间后最 大值不变,则加入。 • 问题转化为加入某区间后求最大值问题。
APIO选讲
——alpq654321
APIO200Байду номын сангаас免费道路
• 一张有n个点m条无向边的图,其中有些边 为特殊边。 • 选出一个子图,使得恰好有K条特殊边,且 任意两点都能到达。 • 输出方案。 • n<=20000,m<=100000。
APIO2008免费道路
• 将非特殊边全部加入子图中,就能知道哪 些特殊边是必须加入的。 • 将这些特殊边加入,不足K条的话在其它特 殊边中能加则加。 • 若此时仍不满足K条,在剩余特殊边中任意 加。 • 最后对于所有非特殊边能加则加。
APIO2009oil
• 给定一个n*m的矩阵。 • 选择3个k*k的互不相交的子矩阵,使得这3 个子矩阵之和最大。 • n,m,k<=1500。
APIO2009oil
APIO2009oil
• 维护左上、右上、左下、右下的最大子矩 阵。就能很轻易地解决左边4种情况。
• 对于右边两种情况,在枚举第二条分割线 的同时,不断更新最大值就可以了。
APIO2014回文串
• 本质不同的回文串数量级为n。 • 对于每个回文串直接在suffix_array中求出现 了多少次。 • 时间复杂度为O(nlogn)。
APIO2014序列分割
• 有一个长为n的序列,共切割k次。
• 每次切割一个序列分为两段,得到的分数 为每一段的和的乘积。 • 要使得分数最大化。 • n<=100000,k<=200。
APIO2014序列分割
• • • • • 设f[i][j]表示前i个分了j次得分。 有f[i][j]=max{f[k][j-1]+sum[k]*(sum[i]-sum[k])}。 第二维只与j-1相关。 一个标准的斜率优化式子。 时间复杂度为nk。
APIO2014连珠线
• 一个游戏是这样的:初始有一个节点,每 次可以选择两种操作。1:加入一个新的节 点,与之前的节点用红线相连。2:加入一 个新的节点,将之前某条红线断开,并将 红线改为蓝线,与新加入的节点相连。 • 现在已知最终n个节点的状态以及每条线的 得分。 • 给每条线染色,使得蓝色线的分数和最大。 • n<=200000。
APIO2012guard
• • • • • 有n个点,m个信息以及K个忍者。 每个信息形如L~R中是否存在忍者。 信息一定是正确的。 判断哪些点一定存在忍者。 n,m,k<=100000。
APIO2012guard
• 对于那些没有忍者的信息,直接在n个点中 删去。
• 题目转化为存在若干区间,这些区间一定 存在忍者。 • 枚举每个点,计算该点不存在忍者时,最 少需要放置忍者数量是否大于K,若大于, 则该点一定存在忍者。 • 时间复杂度为nm。
APIO2009ATM
• 给定一张n个点m条有向边的图。其中若干 点为特殊点。 • 每个点都有一个点权。 • 你需要找到从1开始的一条路径,最终在特 殊点中结束,使得你所得到的点权之和最 大(一个点被经过2次只得到一次点权)。 • n,m<=500000。
APIO2009ATM
• Tarjan缩点后跑SPFA即可。
APIO2010特别行动队
• 有n个数以及3个参数a,b,c。 • 将这n个数分成若干段,每段对答案的贡献 为ax^2+bx+c,其中x表示该段每个数的和。 • 要使得贡献和最大。 • n<=1000000。
APIO2010特别行动队
• 求前缀和,那么区间[l,r]的和可以表示为 s[r]-s[l-1]。 • 有dp[i]=max{dp[j]+a(s[i]-s[j])^2+b(s[i]-s[j])+c}。 • 这是一个标准的斜率优化形式。
APIO2015雅加达的摩天楼
• • • • 直接暴力构图最坏情况是n^2条。 考虑分块。 当pi>根号n时,直接连边。 建立根号n*n个辅助点,当pi<=根号n时只需 连1条边就可以了。
• 我们先强行将这K条边塞进MST中。 • 对剩下的边作一次MST。 • 这些在MST中的已知边权的边一定是会被选 上的,可以把这些点缩起来。 • 问题转化为一棵K个节点的树的问题。 • 2^K枚举每条边是否在MST中,每次只要在 kruskal中暴力找最大边权即可。
APIO2014回文串
• 给定一个长为n的字符串。 • 求所有回文串的最大出现值。 • 一个串的出现值的定义为该串的长度*该串 在原串中的出现次数。 • n<=300000。
APIO2012dispatching
• 给定一棵树,每个点有两个点权领导力和 薪水。 • 选择一个点x,再在以x为根的子树选择若干 点,使得选出的若干点薪水之和<=m,要求 选出的点的数量*x的领导力尽可能大。 • n<=100000。
APIO2012dispatching
• 一个显然的结论,当x固定时,在子树中选 择的点一定是按薪水从小到大选中的。 • 那么我们对于每个x都维护一个大根堆,若 薪水之和超过m,则删除堆顶。 • 需要做的是堆的合并,左偏树即可。 • 时间复杂度为nlgn。
APIO2011寻路
• 在二维平面内有一些不相交矩阵。 • 从(x1,y1)走到(x2,y2),求最短路,要求不能 进入矩阵内部且只能在矩阵边缘转弯。 • 最多1000个矩阵,x,y<=10^9。
APIO2011寻路
• • • • • 显然可以离散化。 这样之后最多存在n^2个点。 求出所有点上下左右最近的点。 跑dijkstra+heap就可以了。 时间复杂度为n^2lgn。
APIO2013机器人
• 令dp[l][r][x][y]表示编号为l~r的机器人所在 (x,y)这个位置时的最少推动次数。
• 有 dp[l][r][x][y]=min{dp[l][k][x][y]+dp[k+1][r][x][y ]}或者dp[l][r][x][y]由其它dp[l][r][x1][y1]而来。 • 后者可以通过SPFA来解决。 • 这就是一个斯坦纳树的经典问题。 • 时间复杂度为2^n*SPFA(nm,nm)+3^n*nm。
APIO2009会议中心
• 令f[i][j]表示从左端点i开始(先将点的编号 离散化),出现2^j不相交的区间最近的右 端点编号。 • 有f[i][j]=f[f[i][j-1]+1][j-1]。
• 每次加入一段区间后,相当于将原来的大 区间分割成两个小区间,依次用f数组找最 大值之后判断是否可行即可。
• 一个比较显然的结论: a[i][j]^a[i][j+1]^a[i+1][j]^a[i+1][j+1]=1。 • 由此可以推导出a[i][j]^a[1][1]^a[i][1]^a[1][j]=1。 (i,j同为偶数) • a[i][j]^a[1][1]^a[i][1]^a[1][j]=0(i,j不同为偶数) • 枚举(1,1)的颜色,若存在点(x,y)已被染色,则 (1,x)与(y,1)确定其中一个另一个就能被确定。 • 并查集维护这些信息(顺便判断是否无解)。 • 答案为2^(未被染色的集合个数)。
APIO2012guard
• 考虑加速计算最少放置忍者数量。 • 最少放置的忍者数量=最多互不相交的区间数 目! • 考虑第i个点,它一定存在忍者当且仅当存在 一段区间[l,i]与一段区间[i,r],使得i必须存在忍 者。 • 求出最大的l与最小r。 • 预处理出pre[i]与suf[i]表示前i个点与后i个点最 多不相交的区间。 • 用来更新答案即可。
APIO2013道路费用
• 给定一张无向联通图,存在边权c与点权a。 • 加入K条特殊边,构造这些边的边权使得存 在一棵最小生成树使得所有点到1号点的距 离(只考虑特殊边的长度)乘以该点点权 的乘积和最大。 • n<=100000,m<=300000,c,a<=1000000,K<=20。
APIO2013道路费用
相关文档
最新文档