SRM566 1000pts

绍一的模拟赛题

题意:

小Z养了$??$只企鹅,第$i$只企鹅的坐标为$(x_i, y_i)$,颜色为$??_??$。出于对企鹅安全的考虑,他决定造栅栏。地面上有$??$个桩,编号$0...?? − 1$,小Z会用一些直的栅栏,每个栅栏连接某两个桩子。对于最后的结果,任意两个栅栏不能交叉。任意一个桩只能连接0个或2个栅栏,栅栏必须围成一些封闭的多边形。由于经费有限,每一个多边形内至少包含一只企鹅。小Z的企鹅有着许多颜色。相同颜色的企鹅必须在同一个多边形内。为了保证所有企鹅的安全,每一只企鹅都必须被包含在某一个多边形内。

各种不合法的情况:

某种合法的情况:


现在小Z想知道自己有多少种合法的不同的造栅栏的方案??????。

【题解】

用?[??][??][0..1]表示??, ??必须选,点的编号在??, ??之间,最外层的多边形内没有(0)或有(1)企鹅的除了最外层多边形其他多边形均合法的方案数。??[??][??]表示??必须选,点的编号在??, ??之间合法的方案数。??[??][??]表示,点的编号在??, ??之间合法的方案数。当一个栅栏两侧没有相同颜色的企鹅时定义这
个栅栏是有效的。

然后就可以直接区间DP了。考虑计算?[??][??][??????],枚举中间点????,当< ????, ?? >合法时进行转移,分类讨论??????和三角形(??, ????, ??)中有没有点的情况,再考虑向量< ??, ???? >右侧有没有企鹅,没有直接转移,有的话,考虑多边形(??, ?? + 1, ???? − 1, ????)内有没有点分类讨论一下即可。考虑计算??[??][??],枚举中间点????,当< ????, ?? >合法时进行转移,如果向量< ??, ?? >左侧和向量< ??, ???? >左侧的企鹅的并集为空??[??][??]+ = ?[??][????][1],否则如果向量< ???? + 1, ?? >的企鹅和上面两个的并集为空??[??][??]+ =?[??][????][1] * ??[???? + 1][??]。??[??][??]可以轻松的从??[??][??]转移过来。

【分析】

题解非常地神,直接给出了一个dp,这里从头分析为什么要这么做。

首先很容易确定一条边是否可以选(如果这条边两侧有相同颜色的企鹅,那么不能选)

那么现在问题变成了知道一些边能选不能选,要求选择一些边使得它们围成多个多边形,且每个企鹅都在一个多边形里,每个多边形里都有至少一个企鹅。
问题是在一个环上选出一些边,怎么就变成区间dp了呢?

考虑最朴素的暴力:枚举每条边选不选,再检查是否满足条件。所以第一步,我们考虑枚举一条边,选择任意一个点作为起始点,如下图选择了这个绿色的点

为了不重复,我们枚举这个点沿逆时针方向遇到的第一个有边的点。具体地说,这个点可能有边,可能没有边,如果没有边,我们按逆时针顺序继续枚举下一个点,直到枚举到一个有边的点,标为蓝色。

接下来继续枚举第二的点作为边的另一端,我们现在找到了一条边<i,j>,由于i是从l开始第一个有边的点,所以[l,i+1]里面的点都不会再有边了,而[j+1,r]里点只有它们内部才可能有边。这就剩下可能有边的点恰好是一个区间,所以可以考虑区间dp。我们现在关心的是什么?是[i,j]这段区间里,能形成多少种如红线的方案,具体来说就是选了某些边,且i,j都已经作为一个端点,这样就可以  在添加了(i,j)之后合并了,记方案数为h(i,j)(暂时不企鹅的限制),那么此时答案需要加上h(i,j)*([j+1,r]里连边的方案数)。

再来看[j+1,r]里连边的方案数怎么求,我们发现这又是可以看成一个环,我们又回到了一个和原来的问题一样的问题,可以用同样的方式求解,不妨用f(l,r)表示,这样答案就是f(0,n-1)。

现在我们考虑h(l,r)怎么求,同样的,我们可以枚举l出去的第一条边<l,i>

时间: 2024-10-10 20:58:54

SRM566 1000pts的相关文章

Topcoder SRM579 1000pts

石头剪刀布QAQ 一看是个很油的概率dp 首先一看你很快能得出状态的表示F[i][r][p][s] 然后只要考虑r,p,s出现的次数来进行概率dp就好了 具体实现的时候细节很多(少) 如果预处理一下组合数常数短了一截.但是自信的我认为50^4根本不慌.最后还是过了. #include<map> #include<stack> #include<queue> #include<cstdio> #include<string> #include<

topcoder 650 srm div2 1000pts

(15) 也是 DIV1 500 题意是给定 一个无向图 删去一条边以后 可不可以是完全二叉树. 细节点很多,开始做法居然求到桥去了,最近强联通写傻了. 最多1024-1个点 1024-1条边枚举 所以: 先枚举要删去的边,然后进行判断. 判断是否是一颗完全二叉树的话 要一个标记deep深度 max deep==h 然后还要看是否整个图强联通 还有一点 点的度 为1 ,2 ,3 其中度为2的只有一个 ,度为1的有2^(h-2)个 code: 1 #include<iostream> 2 #in

SRM489 Div1 1000pts:AppleTree

挺优秀的一道题,想出做法时感觉很惊艳. 题意: 数轴上有\(D\)个连续整数刻度,有\(N\)棵树要种在这些刻度上,其中第\(i\)棵与两旁(如果有的话)相邻的树至少要相距\(R_i\),问方法数. \(1 \leq N , R_i \leq 40\) 思路: 首先,如果确定了种树的顺序,就确定了相邻树的最小间距.把\(D\)减掉最小间距之和,所得的就是"冗余刻度"的数量. 把这个数量分配给\(N+1\)段间隙,用插板法可以求出方法数. 所以问题在于,对于每一个\(L\),求出1到\(

Topcoder SRM 603 div1题解

昨天刚打了一场codeforces...困死了...不过赶在睡前终于做完了- 话说这好像是我第一次做250-500-1000的标配耶--- Easy(250pts): 题目大意:有一棵树,一共n个节点,每个节点都有一个权值,两人A和B分别进行操作,由A先手,每人可以选择一条边,将它删掉得到两个联通块.游戏不断进行下去,最后只剩下一个节点.A希望最后的节点权值尽可能大,B希望尽可能小,求这个最后的值.数据保证n<=50. 这道题真的是博弈好题啊-(感觉放到ACM很合适啊) 我们考虑第一次A会如何选

iOS开发——图形与动画篇OC篇&amp; POP简单介绍及使用

POP简单介绍及使用 前言 动画在APP开发过程中 大家多多少少都会接触到 而且随着ios7的扁平化风格启用之后 越来越多的APP开始尝试加入各种绚丽的动画交互效果以增加APP的用户体验(当然 还是以国外的APP居多) 有过相关开发经验的同学肯定知道在iOS中 动画相关的部分都是基于Core Animation 但是今天我们不讨论Core Animation 今天的主角是POP -来自于Facebook的动画引擎(其实我不喜欢把POP定义为动画引擎 我愿意称它为函数发生器) 介绍 官方地址 ht

iOS开发——完整项目实战OC篇&amp;百思不得姐第五天

百思不得姐第五天 上午 一:蒙板 tabBarController:addsubViews Window:rootViewController Modal:presentViewController(rootViewController) 二:显示界面不是想要的效果 由于是使用Xib所以默认在ViewDidLoad中的frame是对应Xib的frame:(600,600) 我们如果要实现布局应该在-viewDidLayoutSubViews实现 但是如果真的要在ViewDidLoad里面实现我们

iOS开发&gt;学无止境 - POP 介绍与使用实践(快速上手动画)

作者:里脊串(@里脊串) 网址:http://adad184.com/2015/03/11/intro-to-pop/   前言 动画在APP开发过程中 大家多多少少都会接触到 而且随着ios7的扁平化风格启用之后 越来越多的APP开始尝试加入各种绚丽的动画交互效果以增加APP的用户体验(当然 还是以国外的APP居多) 有过相关开发经验的同学肯定知道在iOS中 动画相关的部分都是基于Core Animation 但是今天我们不讨论Core Animation 今天的主角是POP -来自于Face

[翻译] POP Facebook的动画开源库

Pop is an extensible animation engine for iOS and OS X. In addition to basic static animations, it supports spring and decay dynamic animations, making it useful for building realistic, physics-based interactions. The API allows quick integration wit

TopCoder 649 div1 &amp; div2

最近一场TC,做得是在是烂,不过最后challenge阶段用一个随机数据cha了一个明显错误的代码,最后免于暴跌rating,还涨了一点.TC题目质量还是很高的,非常锻炼思维,拓展做题的视野,老老实实补题吧. div2 250pts 题意:判断s去掉一个字符后能否和t一样. 代码: 1 class DecipherabilityEasy { 2 public: 3 string check(string s, string t) { 4 int n = s.size(); 5 int m = t