Codeforces Round #552 (Div. 3)-1154E-Two Teams-(模拟+双指针)
http://codeforces.com/contest/1154/problem/E
解题:
举例n=10,k=1
1,2,10,4,7,6,9,8,5,3
第一次,1队先挑2,10,4这三个人
1,2,10,4,7,6,9,8,5,3
第二次,2队挑6,9,8三个人
1,2,10,4,7,6,9,8,5,3
第三次,1队挑1,7,5三个人
1,2,10,4,7,6,9,8,5,3
第四次,2队挑3一个人
1,2,10,4,7,6,9,8,5,
显然需要实现的有两点
(1)挑完后的“连接”,比如
第一次挑完后需要把1和7“连接”起来
第二次挑完后需要把7和5“连接”起来
用l数组标记当前下标 左边相邻的数的下标
用r数组标记当前下标 右边相邻的数的下标
例如一开始:
r[1]=2,表示下标为1的人(1)的右边是下标为2那个人(2)
l[5]=4,表示下标为5的人(7)的左边是下标为3那个人(4)
第一次挑完之后
r[1]=5,表示下标为1的人(1)的右边是下标为5那个人(7)
l[5]=1,表示下标为5的人(7)的左边是下标为1那个人(1)
每次挑完人后把已经挑选的人“删掉”,左右扩散找人可以通过左右数组来找人,直接跳过被挑选过的人,实现“删掉”,
(2)快速找最大值,暴力寻找肯定会超时
一般遇到n个不同的数随机出现在数组里,可以用下标数组idx标记这个数出现的下标位置,直接查找。
dix[10]=3表示10这个数在原数组的下标位置是3
这里可以从n开始减小,一直减到1,时间复杂度O(n)
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<vector>
#include<iostream>
#include<cstring>
#include<set>
#include<queue>
#define inf 0x3f3f3f3f
#define ll long long
using namespace std; int n,k,maxxidx,maxx;
int a[];
int l[];///下标为i的人 的左边 下标是多少
int r[];///下标为i的人 的右边 下标是多少
int idx[];///标记原数组下标
int ans[]; void findmax()///找最大值,主要是改变全局变量maxxidx和maxx
{
while(maxx>=)
{
if( ans[ idx[maxx] ]== )
{
maxxidx=idx[ maxx ];
break;
}
maxx--;
}
} int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(a,,sizeof(a));
memset(l,,sizeof(l));
memset(r,,sizeof(r));
memset(idx,,sizeof(idx));
memset(ans,,sizeof(ans));
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
idx[ a[i] ]=i;
l[i]=i-;
r[i]=i+;
}
l[n+]=n;
r[]=;
maxxidx=idx[n];///初始化为最大的下标
maxx=n;
int now=;///当前已经选了多少人
int t=;///初始是1队先挑人
while(now<n)
{
findmax();
int i=maxxidx;///最大的那个人的下标
ans[i]=t;
now++;
int x=l[i];
int y=r[i];///中间向左右两边扩展
for(int j=;j<=k;j++)
{
if(x>= && x<=n)///如果x是0表明左边无人了
ans[x]=t,x=l[x],now++;///通过左右指针数组找下一个人
if(y>= && y<=n)
ans[y]=t,y=r[y],now++;
}
///挑完人就该改左右下标了
l[y]=x;
r[x]=y;
if(t==)
t=;
else
t=;
}
for(int i=;i<=n;i++)
printf("%d",ans[i]);
printf("\n");
}
return ;
}
Codeforces Round #552 (Div. 3)-1154E-Two Teams-(模拟+双指针)的更多相关文章
- Codeforces Round #552 (Div. 3) E. Two Teams (模拟,优先队列,双向链表)
题意:有\(n\)个队员站成一排,有两个教练分别选人,每次选当前剩余人中的能力值最大的那个以及他两边相邻的\(k\)个人,问最后每个人所在队伍情况. 题解:优先队列模拟,以及双向链表,先用结构体存入每 ...
- Codeforces Round #552 (Div. 3) 题解
Codeforces Round #552 (Div. 3) 题目链接 A. Restoring Three Numbers 给出 \(a+b\),\(b+c\),\(a+c\) 以及 \(a+b+c ...
- Codeforces Round #552 (Div. 3) A题
题目网址:http://codeforces.com/contest/1154/problem/ 题目意思:就是给你四个数,这四个数是a+b,a+c,b+c,a+b+c,次序未知要反求出a,b,c,d ...
- Codeforces Round #368 (Div. 2) B. Bakery (模拟)
Bakery 题目链接: http://codeforces.com/contest/707/problem/B Description Masha wants to open her own bak ...
- Codeforces Round #284 (Div. 2)A B C 模拟 数学
A. Watching a movie time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Codeforces Round #285 (Div. 2) A B C 模拟 stl 拓扑排序
A. Contest time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
- Codeforces Round #273 (Div. 2)-B. Random Teams
http://codeforces.com/contest/478/problem/B B. Random Teams time limit per test 1 second memory limi ...
- Codeforces Round #552 (Div. 3) F. Shovels Shop (前缀和预处理+贪心+dp)
题目:http://codeforces.com/contest/1154/problem/F 题意:给你n个商品,然后还有m个特价活动,你买满x件就把你当前的x件中最便宜的y件价格免费,问你买k件花 ...
- Codeforces Round #552 (Div. 3) F题
题目网址:http://codeforces.com/contest/1154/problem/F 题目大意:给出n,m,k,n是物体的个数,m是优惠方式的种数,k是需要购买的物体个数, 然后给出n个 ...
- Codeforces Round #552 (Div. 3) D题
题目网站:http://codeforces.com/contest/1154/problem/D 题目大意:给出n个数(0或1),还有a , b, a是蓄电池容量,b是电池容量,数为1时蓄电池可以充 ...
随机推荐
- Scala Operators, File & RegExp
Operators Thread.`yield`() 反引号除了用于命名标识符,还可以在调用方法时避免冲突(yield 为 Scala 关键字,但也是 Thread 的方法) 中缀运算符(infix ...
- Ubiq:A Scalable and Fault-tolerant Log Processing Infrastructure
Abstract 互联网应用通常会产生大量的时间日志需要进行分析和处理.本文介绍Ubiq的架构,它是一个分布式系统,用于处理不断增长的日志文件,具有可扩展性.高可用.低延迟的特性.Ubiq框架容忍基础 ...
- 『树上匹配 树形dp』
树上匹配 Description 懒惰的温温今天上班也在偷懒.盯着窗外发呆的温温发现,透过窗户正巧能看到一棵 n 个节点的树.一棵 n 个节点的树包含 n-1 条边,且 n 个节点是联通的.树上两点之 ...
- SQL系列(二)—— 查询(select)
在开始之前先了解下SQL中的操作分类.根据与数据库不同操作的交互,对数据不同的处理类型,可以将SQL分为四种:插入.删除.修改.查询.本篇文章中主要介绍查询操作.其实查询操作也是日常应用使用最为频繁且 ...
- Linux学习笔记之详解linux软连接和硬链接
0x00 链接文件 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [软连接] 另外一种连接称之为符 ...
- ad域的那些事儿
先附上参考链接,有空再来整理 基础知识:https://www.cnblogs.com/cnjavahome/p/9029665.html ad域的操作:https://www.cnblogs.com ...
- 用C#搭建WebSocket
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在 W ...
- linuxmint安装Tools找不到Tools的压缩包问题
安装Linuxmint之后按照惯例安装Tools,打开桌面上的Tools光盘之后找不到压缩包. PS:因为已经装好了,就不上图了,按照下面的步骤做就没有问题了. 1:找到vmware的安装目录下的li ...
- 18、git提交代码并将develop分支合并到master分支上
提交合并代码流程: git add .git commit -m ''git pushgit checkout mastergit merge develop //将develop 分支与master ...
- js中 json对象与json字符串相互转换的几种方式
以下总结js中 json对象与json字符串相互转换的几种方式: 一.JSON对象转化为JSON字符串 1.使用JSON.stringify()方法进行转换 该方法不支持较老版本的IE浏览器,比如:i ...