题意:

给定一长度为 n 的整数序列 $a$,将其复制m次,并接成一条链,每相邻K个相同的整数会消除,然后其他的整数继续结成一条链,直到不能消除为止,求问最终剩余多少个整数。

解法:

首先将长度为n的序列消干净,然后接下来的消除操作必然是在两个序列相交处进行消除,对于接在中间的序列,原消法等价于序列的左侧和右侧不停消除直到无法继续。

分类讨论:

1.序列左右消干净了,这样答案为0

2.序列消得剩下一种元素,统计该元素的总个数,如果K|sum,则为0,不然为sum%K个加上左右侧剩余元素。

3.序列剩下一段元素:

考虑计算消除了多少个:

(1)首先剩余的元素拼在一起 如果有%K!=0的相同元素接在一起 将会消成sum%K

(2)其次中间序列左右消除的个数。

这样就解决了,效率$O(n)$

const int N = ;

int n,K,m,tot,a0[N],a[N],b[N];

int main() {
cin >> n >> K >> m;
int cnt = n;
FOR(i,,n) scanf("%d", &a0[i]);
b[] = -;
FOR(i, , n)
{
if(a0[i] == b[tot]) a[tot]++;
else
{
if(tot)
{
cnt -= a[tot]-a[tot]%K; a[tot] %= K;
if(a[tot]==) tot--;
}
if(!tot || a0[i] != b[tot]) a[++tot] = , b[tot] = a0[i];
else a[tot]++;
}
}
cnt -= a[tot]-a[tot]%K;
a[tot] %= K;
if(a[tot]==) tot--;
if(!tot)
{
cout << << endl;
return ;
}
// FOR(i,1,tot) cout<<a[i]<<'-'<<b[i]<<endl;
int l=, r=tot;
while(l<r)
{
if(b[l]!=b[r] || (a[l]+a[r])%K) break;
l++,r--;
}
// debug(l);
// debug(r);
// debug(cnt);
if(l>r)
{
cout << << endl;
return ;
}
else if(l==r)
{
if(1ll*a[l]*m%K==) cout << << endl;
else cout << cnt-a[l]+1ll*a[l]*m%K << endl;
}
else
{
LL ans = 1ll*m*cnt,tmp = cnt;
FOR(i,l,r) tmp -= a[i];
ans -= 1ll*(m-)*tmp;
if(b[l]==b[r]) ans -= 1ll*(m-)*((a[r]+a[l]) - (a[r]+a[l])%K);
cout << ans << endl;
}
return ;
}

Teams Formation的更多相关文章

  1. 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 ...

  2. cf 443 D. Teams Formation](细节模拟题)

    cf 443 D. Teams Formation(细节模拟题) 题意: 给出一个长为\(n\)的序列,重复\(m\)次形成一个新的序列,动态消除所有k个连续相同的数字,问最后会剩下多少个数(题目保证 ...

  3. 443 D. Teams Formation

    http://codeforces.com/contest/879/problem/D This time the Berland Team Olympiad in Informatics is he ...

  4. CodeForces 879D Teams Formation

    题意 将一个长度为\(n\)的数组重复\(m\)遍得到一个长度为\(n \times m\)的新序列,然后消掉新序列中连续\(k\)个相同的元素,不断重复这一过程,求最后剩下的序列的长度 分析 首先可 ...

  5. 【Codeforces】879D. Teams Formation 思维+模拟

    题意 给定$n$个数,重复拼接$m$次,相邻$k$个重复的可消除,问最后序列中有多少个数 首先可以发现当$k>=n$时,如果要使$n$个数可以被消除,那么$n$个数必须一样,否则$n$个数不能被 ...

  6. codeforces 879 D. Teams Formation(思维)

    题目链接:http://codeforces.com/contest/879/problem/D 题意:这题题意我反正是看了很久,可能是我的理解能力有点差,就是将一个数组倍增m倍然后将连续的相同的k个 ...

  7. Codeforces Round #443 (Div. 2) 【A、B、C、D】

    Codeforces Round #443 (Div. 2) codeforces 879 A. Borya's Diagnosis[水题] #include<cstdio> #inclu ...

  8. zoj The 12th Zhejiang Provincial Collegiate Programming Contest Team Formation

    http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5494 The 12th Zhejiang Provincial ...

  9. 第十二届浙江省大学生程序设计大赛-Team Formation 分类: 比赛 2015-06-26 14:22 50人阅读 评论(0) 收藏

    Team Formation Time Limit: 3 Seconds Memory Limit: 131072 KB For an upcoming programming contest, Ed ...

随机推荐

  1. 【转】php和java之间rsa加密互通

    以下是php封装好的类,引入即可使用 <?php /** * 作者:pjp * 邮箱:vippjp@163.com */ class RSA{ private $privateKey='';// ...

  2. tableView的cell显示不全的问题

    如果是最上面的cell没有显示完整 1.重新设置tableview的frame: 例如你的搜索框高度为50,那么设置self.tableview.frame= CGRectMake(0,50,self ...

  3. 九度OJ 1074:对称平方数 (数字特性)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4804 解决:2173 题目描述: 打印所有不超过n(n<256)的,其平方具有对称性质的数. 如11*11=121 输入: 无任何输 ...

  4. 九度OJ 1034:寻找大富翁 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5925 解决:2375 题目描述:     浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁. 输入:     输入包含多组测试用例.   ...

  5. new 和 make 均是用于分配内存

    the-way-to-go_ZH_CN/06.5.md at master · Unknwon/the-way-to-go_ZH_CN https://github.com/Unknwon/the-w ...

  6. BTC、BCH和BSV三者到底有什么区别?

    比特币发展到今天已经有10个年头了,在这十年的发展中,比特币一共经历了两次重要的分裂,现在变成了三种货币,第一种是目前继承了比特币绝大多数遗产的BTC:第二种是BCH:第三种是BSV.那这三种货币到底 ...

  7. 支付宝异步通知notify_url接收不了问题解决(转)

    此处return_url可以成功跳转回网站页面但notify_url却接收不到支付宝的异步通知.已保证notify_url是一个外网可以访问的网址 1.网站用的是ssh框架,当支付宝发通知到我这个ac ...

  8. JSP&Servlet(转)

    第一篇:Web应用基础1.概念:  1.1应用程序分类     a.桌面应用程序:一般是指采用client/server即客户机/服务器结构的应用程序.     b.web应用程序:一般是指采用Bro ...

  9. display:inline

    一.基本介绍 它可以让行内显示为块的元素,变为行内显示,例如 <div> DIV1 </div> <div> DIV2 </div> 这里DIV1和DI ...

  10. tmux基本使用方法

    tmux是一款优秀的终端复用软件.tmux采用C/S模型构建,输入tmux命令就相当于开启了一个服务器,此时默认将新建一个会话,然后会话中默认新建一个窗口,窗口中默认新建一个面板. 一个tmux se ...