CodeForces 879D Teams Formation
题意
将一个长度为\(n\)的数组重复\(m\)遍得到一个长度为\(n \times m\)的新序列,然后消掉新序列中连续\(k\)个相同的元素,不断重复这一过程,求最后剩下的序列的长度
分析
首先可以明确一件事就是消除的顺序是任意的,最终得到的序列是相同的
消除的块有两种情况:
- 块在序列内部
- 块在序列交界处
首先可以消掉每个序列内部可以消去的块,然后再考虑第二部分
两个序列首位相接,每遇到\(k\)个连续的相同颜色的块就消去(注意消去的总长度不超过\(n\)),最终将一个序列分为左中右三部分
这样就是前一个序列的右部分和后一个序列的左部分进行消去,\(m\)个序列进行消去后就变成了:
左部分+中间部分重复\(m\)次+右部分
然后再分成三种情况讨论:
- 重复\(m\)次的中间部分是同一种颜色且是\(k\)的倍数,那么最终消去了所有元素
- 重复\(m\)次的中间部分是同一种颜色但不能全部消去,那么答案就是消去中间能消的再加上两端
- 中间部分有两种颜色或以上说明已经没有可消去的块了
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
#define MP make_pair
#define PB push_back
#define REP(i, a, b) for(int i = a; i < b; i++)
#define PER(i, a, b) for(int i = b - 1; i >= a; i--)
const int maxn = 100000 + 10;
int n, m, k;
int a[maxn], S[maxn], cnt[maxn], top;
int main() {
bool single_color = true;
scanf("%d%d%d", &n, &k, &m);
REP(i, 0, n) scanf("%d", a + i);
REP(i, 1, n) if(a[i] != a[i - 1]) { single_color = false; break; }
if(single_color) {
printf("%I64d\n", (LL)n * m % k);
return 0;
}
REP(i, 0, n) {
S[++top] = a[i];
if(top > 1 && S[top] == S[top-1]) cnt[top] = cnt[top-1] + 1;
else cnt[top] = 1;
if(cnt[top] >= k) top -= k;
}
int L = 1, R = top;
LL t = 0;
while(S[L] == S[R] && L < R) {
int l = L, r = R, cnt = 0;
while(S[l] == S[L] && l < r && cnt < k) { cnt++; l++; }
while(S[r] == S[L] && l < r && cnt < k) { cnt++; r--; }
if(cnt == k) { L = l; R = r; t += k; }
else break;
}
single_color = true;
REP(i, L, R) if(S[i] != S[i+1]) { single_color = false; break; }
if(single_color) {
LL mid = (LL)(R-L+1)*m%k;
if(mid) printf("%lld\n", mid + t);
else printf("0\n");
} else {
printf("%lld\n", (LL)(R-L+1)*m + t);
}
return 0;
}
CodeForces 879D Teams Formation的更多相关文章
- 【Codeforces】879D. Teams Formation 思维+模拟
题意 给定$n$个数,重复拼接$m$次,相邻$k$个重复的可消除,问最后序列中有多少个数 首先可以发现当$k>=n$时,如果要使$n$个数可以被消除,那么$n$个数必须一样,否则$n$个数不能被 ...
- Codeforces Round #443 (Div. 1) B. Teams Formation
B. Teams Formation link http://codeforces.com/contest/878/problem/B describe This time the Berland T ...
- cf 443 D. Teams Formation](细节模拟题)
cf 443 D. Teams Formation(细节模拟题) 题意: 给出一个长为\(n\)的序列,重复\(m\)次形成一个新的序列,动态消除所有k个连续相同的数字,问最后会剩下多少个数(题目保证 ...
- codeforces 879 D. Teams Formation(思维)
题目链接:http://codeforces.com/contest/879/problem/D 题意:这题题意我反正是看了很久,可能是我的理解能力有点差,就是将一个数组倍增m倍然后将连续的相同的k个 ...
- 443 D. Teams Formation
http://codeforces.com/contest/879/problem/D This time the Berland Team Olympiad in Informatics is he ...
- Teams Formation
题意: 给定一长度为 n 的整数序列 $a$,将其复制m次,并接成一条链,每相邻K个相同的整数会消除,然后其他的整数继续结成一条链,直到不能消除为止,求问最终剩余多少个整数. 解法: 首先将长度为n的 ...
- Codeforces Round #443 (Div. 2) 【A、B、C、D】
Codeforces Round #443 (Div. 2) codeforces 879 A. Borya's Diagnosis[水题] #include<cstdio> #inclu ...
- codeforces 478B Random Teams
codeforces 478B Random Teams 解题报告 题目链接:cm.hust.edu.cn/vjudge/contest/view.action?cid=88890#probl ...
- Codeforces 552 E. Two Teams
E. Two Teams time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
随机推荐
- [原创]在Windows Server 2019上配置NAS
序言 此教程安装的都是最新版本的.由于是当NAS让它非常稳定的运行,所以能不安装的软件尽量不要安装. 一.准备工作 [更新系统] 没啥,就他喵想用个最新的. 右键点击开始键->设置->更新 ...
- Ubuntu、Windows 、Linux集合
一.Ubuntu/Windows双系统修复引导 首先说明:在Windows存在的前提下安装Ubuntu(或者Ubuntu系列)是不需要修复引导的.因为grub会自动搜索存在硬盘中的系统. 而在 ...
- 对react vd 性能的理解
相信大家都知道react vd的性能是很好的,速度挺快的,真实dom操作很慢的,但是结果完全相反: 后来我就做了个测试,从两个方面去测试,在页面初始渲染1w条数据,react渲染耗时超过了1秒 在12 ...
- HTML-JS-CSS基础
HTML-JS-CSS基础 1.html hyper text markup language,超文本标记语言,所见即所得.web开发中用于展示功能的部分,浏览器可对其进行渲染.产生各种可视化组件,比 ...
- tomcat8.5配置优化
1.应用程序安全&关闭自动部署 默认值: <Host name="localhost" appBase="webapps" unpackWARs= ...
- Tensorflow ValueError: Protocol message RewriterConfig has no "layout_optimizer" field
I changed models/research/object_detection/exporter.py line 71/72 from: rewrite_options = rewriter_c ...
- C4C Product Price List的模型中和有效期相关的两个字段
SAP C4C的price list实例可以在工作中心Products,视图Price Lists里看到. 我们点开第二个名为TEST的实例: 我写这篇文章的日期是2018年10月27日, 我现在把这 ...
- robotframework实战三--自定义关键字
在rf的实战1中,我的登录获取验证码就使用了自定义关键字,具体怎么做的,如下 1.新建文件夹 新建一个文件夹,我的MyLibrary,并且存放在site-packages下 2.编写代码 在pytho ...
- redis 对cmd的操作
这个是原子递增的知识点: 关于list部分: 利用lpush命令, rpush命令, lrange命令,对列表操作 此前 我已经 在列表(list)中 插入了 部分 元素了 关于集合set 部分 首先 ...
- e.preventdefault() 别滥用
有的时候我们会为事件回调函数添加一个参数(通常是e),并在函数中加入e.preventdefault():以取消默认行为.由于习惯,我顺手将它写到了一个checkbox的change事件中.由于不同的 ...