【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1501
dp求出环状不连续的前缀和,剩下东西都可以算出来,比较繁琐。
时间复杂度\(O(n+m)\)。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 500003;
int a[N], b[N], n, m, f[N][3], id[N];
ll k, win = 0, los = 0;
int gcd(int a, int b) {return b == 0 ? a : gcd(b, a % b);}
int main() {
scanf("%d%d%lld", &n, &m, &k);
for (int i = 0; i < n; ++i)
scanf("%d", a + i);
for (int i = 0; i < m; ++i)
scanf("%d", b + i);
int ret = 0;
if (n > m) {
swap(a, b);
swap(n, m);
ret ^= 1;
}
int g = gcd(n, m), delta = n, tmp, tot = 0;
for (int i = 0; i < g; ++i)
for (int j = 0; j < 3; ++j)
f[i][j] = (b[i] == j), id[i] = ++tot;
tmp = 0;
int tms = m / g;
for (int i = 1; i < tms; ++i) {
tmp = (tmp + delta) % m;
for (int j = tmp; j < tmp + g; id[j] = ++tot, ++j)
for (int k = 0; k < 3; ++k)
f[j][k] = f[(j - delta + m) % m][k] + (b[j] == k);
}
int pos, beat, lose, end;
for (int i = 0; i < n; ++i) {
pos = tmp + i % g;
beat = (a[i] + 1) % 3;
lose = (a[i] - 1 + 3) % 3;
win += f[pos][beat];
los += f[pos][lose];
}
end = tmp;
ll lun = 1ll * n * m / g;
win = win * (k / lun);
los = los * (k / lun);
k = k % lun;
for (int i = 0; i < n; ++i) {
if (i + 1 <= k)
tms = (k - i - 1) / n + 1;
else
continue;
pos = i; tmp = (int) ((1ll * delta * (tms - 1) % m + pos) % m);
beat = (a[i] + 1) % 3;
lose = (a[i] - 1 + 3) % 3;
if ((tmp + delta) % m == pos) {
win += f[end + i % g][beat];
los += f[end + i % g][lose];
} else if (pos < g) {
win += f[tmp][beat];
los += f[tmp][lose];
} else
if (id[pos] <= id[tmp]) {
win += f[tmp][beat] - f[(pos - delta + m) % m][beat];
los += f[tmp][lose] - f[(pos - delta + m) % m][lose];
} else {
win += f[tmp][beat] + f[end + i % g][beat] - f[(pos - delta + m) % m][beat];
los += f[tmp][lose] + f[end + i % g][lose] - f[(pos - delta + m) % m][lose];
}
}
if (ret) swap(win, los);
printf("%lld %lld\n", win, los);
return 0;
}
【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版的更多相关文章
- 随便玩玩系列之一:SPOJ-RNG+51nod 算法马拉松17F+51nod 1034 骨牌覆盖v3
先说说前面的SPOJ-RNG吧,题意就是给n个数,x1,x2,...,xn 每次可以生成[-x1,x1]范围的浮点数,把n次这种操作生成的数之和加起来,为s,求s在[A,B]内的概率 连续形的概率 假 ...
- 51NOD 算法马拉松8
题目戳这里:51NOD算法马拉松8 某天晚上kpm在玩OSU!之余让我看一下B题...然后我就被坑进了51Nod... A.还是01串 水题..怎么乱写应该都可以.记个前缀和然后枚举就行了.时间复杂度 ...
- 51nod 算法马拉松 34 Problem D 区间求和2 (FFT加速卷积)
题目链接 51nod 算法马拉松 34 Problem D 在这个题中$2$这个质数比较特殊,所以我们先特判$2$的情况,然后仅考虑大于等于$3$的奇数即可. 首先考虑任意一个点对$(i, j)$ ...
- 51Nod 算法马拉松21(迎新年)
这次打算法马拉松是在星期五的晚上,发挥还算正常(废话,剩下的题都不会= =). 讲讲比赛经过吧. 8:00准时发题,拿到之后第一时间开始读. A配对,看上去像是二分图最大权匹配,一看范围吓傻了,先跳过 ...
- 推荐一个算法编程学习中文社区-51NOD【算法分级,支持多语言,可在线编译】
最近偶尔发现一个算法编程学习的论坛,刚开始有点好奇,也只是注册了一下.最近有时间好好研究了一下,的确非常赞,所以推荐给大家.功能和介绍看下面介绍吧.首页的标题很给劲,很纯粹的Coding社区....虽 ...
- 51Nod 算法马拉松15 记一次悲壮而又开心的骗分比赛
OwO 故事的起源大概是zcg前天发现51Nod晚上有场马拉松,然后他就很开心的过去打了 神奇的故事就开始了: 晚上的时候我当时貌似正在写线段树?然后看见zcg一脸激动告诉我第一题有九个点直接输出B就 ...
- 51Nod 算法马拉松23 开黑记
惨啊……虽然开了半天黑,但是还是被dalao们踩了…… 第二次开黑,还是被卡在rank20了,我好菜啊……= = 写一写比赛经过吧…… 看到题之后习惯性都打开,A~D看上去似乎并没有什么思路,F应该是 ...
- 51Nod 算法马拉松22 开黑记
这是一场惨烈的开黑大战,始于全机房开黑指望刷进rank前十拿钱的壮志,终于被各路神犇怒踩成rank20,差点200点头盾不保的落魄,想起将近一年前ad和zcg等学长挤进rank10的壮举,不由得唏嘘, ...
- 【51Nod 1622】【算法马拉松 19C】集合对
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1622 简单题..直接暴力快速幂 #include<cstdio&g ...
随机推荐
- TouchDevelop [Mobile App]
TouchDevelop是一个全新的Windows Phone软件开发环境,是第一个可以使用手机编程的应用. 所用语言看上去有点像BASIC,也有Scratch和AppInventor那样的色块拖拽环 ...
- iOS之2016面试题三
1.OC内存管理机制 1).当你使用new,alloc和copy方法创建一个对象时,该对象的保留计数器值为 1.当你不再使用该对象时,你要负责向该对象发送一条release或autorelease消息 ...
- IOS开发基础知识--碎片20
1:view中的clipsTobounds属性 iew2添加view1到中,如果view2大于view1,或者view2的坐标不全在view1的范围内,view2是盖着view1的,意思就是超出的部份 ...
- oc 中组合排序算法
- (NSMutableArray *)zuHeSuanFa:(NSMutableArray *)array chooseCount:(int)m { int n = (int)[array coun ...
- Vs2013 html5开发WP8.1 APP之alert
Js的alert不被支持 使用 navigator.notification.alert 需要在CONFIG中增加 示例 <script type="text/javasc ...
- php设计模式 装饰器模式
装饰器模式,可以动态地添加修改类的功能. 一个类提供了一项功能,如果要修改并添加额外的功能,传统的编程模式需要写一个子类继承它,并重新实现类的方法.使用装饰器模式,仅需要在运行时添加一个装饰器对象即可 ...
- 下一代Asp.net开发规范OWIN(2)—— Katana介绍以及使用
接上篇OWIN产生的背景以及简单介绍,在了解了OWIN规范的来龙去脉后,接下来看一下Katana这个OWIN规范的实现,并看看如何使用在我们的Web开发中. 阅读目录: 一. Katana项目的结构和 ...
- YourSQLDba版本升级总结
在使用YourSQLDba做数据库备份.维护时,像其它软件一样,版本升级是不可避免的.因为YourSQLDba一直在不停更新版本.扩展功能.下面介绍一下升级YourSQLDba时的具体步骤和一些注意事 ...
- SQL SERVER 重组含有特殊字符的索引时遇到“关键字 'with' 附近有语法错误.”
案例描述 这是在索引重组过程中遇到的有意思的错误案例,搜索了一下也没有看到相关资料,估计我第一个碰到这类错误的人(It's just a joke).具体情况是YourSQLDba在做维护数据库索引时 ...
- JVM之ParNew收集器
新生代收集器,CMS默认搭配,Serial的多线程版本. -XX:UseParNewGC:指定使用ParNew收集器. -XX:ParalletGCThreads:指定限制垃圾收收集的线程数量. 默认 ...