bzoj2581 [USACO 2012 Jan Gold] Cow Run【And-Or Tree】
传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=110
传送门2:http://www.lydsy.com/JudgeOnline/problem.php?id=2581
这题我一看就知道自己不会了,只想了个O(2^n * 2 ^ n)即O(2 ^ 2n)的大暴力,也懒得打了,果断看solution。
看了之后惊呆了,看到了一种从未见过,闻所未闻的树叫做And-Or Tree,百度了一下,并没有官方中文翻译,姑且叫他“与或树”好了。这种树是一棵满二叉树,每个节点的属性要么为And要么为Or,若为And,则该节点的值为其左儿子的值 && 右儿子的值;同理若为Or,则该节点的值为其左儿子的值 || 右儿子的值。
对应到这一题,就很明显(好叭我承认并不明显= =)的看出这是一个And-Or Tree的模型了,先上一张图,这张图就是Sample Input对应的And-Or Tree

怎么理解这棵树呢?现在我们有N堆卡片,每堆有8张,FJ的操作是要取当前堆的前4张或后4张,只要这两种操作其中至少一种可以完成任务就ok了,所以这就对应每个Or节点。而由于FJ并不知道在取出这4张卡前并不知道Bessie要如何操作,所以为了保证万无一失,应该要使Bessie不管取这4张卡的前两张还是后两张都可以完成任务,即对应了And节点。上图左子树的意思是选择底部,右子树是选择顶部。具体看代码吧,很好理解的。
#include <cstdio>
#include <cstdlib> int n;
long long m, k, a[16][9], now;
char s[16]; bool solve_or(int, long long);
bool solve_and(int step, long long dis, int this4) {
int this2 = rand() & 1;
int rt = solve_or(step + 1, (dis * (a[step][this4 * 4 + this2 * 2] + 1) + a[step][this4 * 4 + this2 * 2 + 1]) % m) &&
solve_or(step + 1, (dis * (a[step][this4 * 4 + (this2 ^ 1) * 2] + 1) + a[step][this4 * 4 + (this2 ^ 1) * 2 + 1]) % m);
return rt;
}
bool solve_or(int step, long long dis) {
if (step == n + 1) {return dis <= k || dis >= m - k;
}
int next4 = rand() & 1;
int rt = solve_and(step, dis, next4) || solve_and(step, dis, next4 ^ 1);
return rt;
} int main(void) {
freopen("cowrun.in", "r", stdin);
freopen("cowrun.out", "w", stdout);
unsigned seed;
scanf("%d%I64d%I64d", &n, &m, &k);
seed += n + m + k;
scanf("%s", s + 1);
for (int i = 1; i <= n; ++i) {
for (int j = 0; j < 8; ++j) {
scanf("%I64d", &a[i][j]);
seed += a[i][j];
}
}
srand(seed); int t_this2;
for (int i = 1; i <= n; ++i) {
t_this2 = s[i] == 'B';
if (solve_and(i, now, 1)) {
printf("B");
now = (now * (a[i][4 + t_this2 * 2] + 1) + a[i][4 + t_this2 * 2 + 1]) % m;
}
else {
printf("T");
now = (now * (a[i][t_this2 * 2] + 1) + a[i][t_this2 * 2 + 1]) % m;
}
}
puts("");
return 0;
}
真是涨姿势了,这个世界上真是啥奇葩玩意儿都有。。。
bzoj2581 [USACO 2012 Jan Gold] Cow Run【And-Or Tree】的更多相关文章
- [USACO 2012 Feb Gold] Cow Coupons【贪心 堆】
传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=118 传送门2:http://www.lydsy.com/JudgeOn ...
- bzoj258 [USACO 2012 Jan Gold] Bovine Alliance【巧妙】
传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=111 传送门2:http://www.lydsy.com/JudgeOn ...
- [USACO 2011 Dec Gold] Cow Calisthenics【二分】
Problem 1: Cow Calisthenics [Michael Cohen, 2010] Farmer John continues his never-ending quest to ke ...
- [USACO 2011 Nov Gold] Cow Steeplechase【二分图】
传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=93 很容易发现,这是一个二分图的模型.竖直线是X集,水平线是Y集,若某条竖 ...
- [USACO 2012 Jan Silver] Bale Share【DP】
传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=107 没想到太不应该了,真的不应该啊! f[i][j][k]表示前i个包, ...
- [USACO 2012 Jan Silver] Delivery Route【拆点】
传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=106 这道题还真是完全没思路,真的不知道怎么做,但是看了题解后恍然大悟. ...
- USACO翻译:USACO 2012 JAN三题(2)
USACO 2012 JAN(题目二) 一.题目概览 中文题目名称 叠干草 分干草 奶牛联盟 英文题目名称 stacking baleshare cowrun 可执行文件名 stacking bale ...
- USACO翻译:USACO 2012 JAN三题(1)
USACO 2012 JAN(题目一) 一.题目概览 中文题目名称 礼物 配送路线 游戏组合技 英文题目名称 gifts delivery combos 可执行文件名 gifts delivery c ...
- [USACO 2018 Jan Gold] Tutorial
Link: USACO 2018 Jan Gold 传送门 A: 对于不同的$k$,发现限制就是小于$k$的边不能走 那么此时的答案就是由大于等于$k$的边形成的图中$v$所在的连通块除去$v$的大小 ...
随机推荐
- Office PDF如何旋转页面之后保存
直接视图-旋转视图-逆时针,是不行的,旋转之后无法保存,另存为之后也再打开也没有效果. 要点击视图-工具-页面 然后在右边的菜单中点击旋转,然后执行旋转,然后就可以保存了.
- Lync 2013 与Exchange 2013 UM&UC 集成!
设置好对应的拨号计划.我们设置分机号码为4位: 配置好接入号码为5000: 配置自己主动助理号码为6000: 改动UM拨号模式为双模式: Set-UMService -identity Exch ...
- 杭电1232畅通project
畅通project Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- SQLite Expert表分离和解决SQLite Expert删除表后大小不变的问题
最后要使用到号码归属地的查询,在网上找到一个数据库文件.大小有12M多,压缩成zip也有1.9M,这样对于一个apk的大小非常不利,后来看了一下数据库的内容,发现有非常多冗余.特别是中文字符占用非常大 ...
- 如何将Python的py程序打包成跨平台的exe文件
在编写了自己的第一个可以爬写网页源代码的程序之后,发现如果在没有安装了pythonLDLE程序的计算机上根本就跑不出来.所以开始寻找可以将程序打包成跨平台运行的exe文件. 经过自己费力的谷歌没有一个 ...
- LoadRunner 事务响应时间的组成
事务时间 一个事务的时间是指持续时间,事务会完全记录下从事务开始到事务结束之间的时间差,那么事务的时间能真实地反映业务操作的时间吗?不能,就好像人用手按秒表来记录短跑时间一样,得出的时间并不是完全准确 ...
- java实现从报文中获取投保单号
java实现从报文中获取投保单号 投保单号正则表达式: String regex = "<proposalNo>([0-9]+)</proposalNo>[\\s\\ ...
- codeforces 394E Lightbulb for Minister 简单几何
题目链接:点我点我 题意:给定n个点. 以下n行给出这n个点坐标. 给定m个点,以下m行给出这m个点坐标. 这m个点是一个凸包,顺时针给出的. 问:在凸包上随意找一个点(x, y) 使得这个点距离n个 ...
- 图像处理之基础---很好的一个快速比较两副图片是否相同的code 可用于公安鉴别
转自Codeproject http://www.codeproject.com/dotnet/comparingimages.asp Public Enum CompareResult ciComp ...
- ExtJs中多个form情况下指定某个form使能
采用extjs的时候,如果一个页面存在多个,那么提交之时,究竟是哪个form使能,就要指明.我今天就遇到了这种情况:明明页面已经有提交,为啥没有提交到内容?一查才知道,我的页面是有2个form,我本意 ...