Codeforces 552 E. Two Teams
2 seconds
256 megabytes
standard input
standard output
There are nn students standing in a row. Two coaches are forming two teams — the first coach chooses the first team and the second coach chooses the second team.
The ii-th student has integer programming skill aiai. All programming skills are distinct and between 11 and nn, inclusive.
Firstly, the first coach will choose the student with maximum programming skill among all students not taken into any team, and kk closest students to the left of him and kk closest students to the right of him (if there are less than kk students to the left or to the right, all of them will be chosen). All students that are chosen leave the row and join the first team. Secondly, the second coach will make the same move (but all students chosen by him join the second team). Then again the first coach will make such move, and so on. This repeats until the row becomes empty (i. e. the process ends when each student becomes to some team).
Your problem is to determine which students will be taken into the first team and which students will be taken into the second team.
The first line of the input contains two integers nn and kk (1≤k≤n≤2⋅1051≤k≤n≤2⋅105) — the number of students and the value determining the range of chosen students during each move, respectively.
The second line of the input contains nn integers a1,a2,…,ana1,a2,…,an (1≤ai≤n1≤ai≤n), where aiai is the programming skill of the ii-th student. It is guaranteed that all programming skills are distinct.
Print a string of nn characters; ii-th character should be 1 if ii-th student joins the first team, or 2 otherwise.
5 2
2 4 5 3 1
11111
5 1
2 1 3 5 4
22111
7 1
7 2 1 3 5 4 6
1121122
5 1
2 4 5 3 1
21112
In the first example the first coach chooses the student on a position 33, and the row becomes empty (all students join the first team).
In the second example the first coach chooses the student on position 44, and the row becomes [2,1][2,1] (students with programming skills [3,4,5][3,4,5] join the first team). Then the second coach chooses the student on position 11, and the row becomes empty (and students with programming skills [1,2][1,2] join the second team).
In the third example the first coach chooses the student on position 11, and the row becomes [1,3,5,4,6][1,3,5,4,6] (students with programming skills [2,7][2,7] join the first team). Then the second coach chooses the student on position 55, and the row becomes [1,3,5][1,3,5] (students with programming skills [4,6][4,6] join the second team). Then the first coach chooses the student on position 33, and the row becomes [1][1] (students with programming skills [3,5][3,5] join the first team). And then the second coach chooses the remaining student (and the student with programming skill 11 joins the second team).
In the fourth example the first coach chooses the student on position 33, and the row becomes [2,1][2,1] (students with programming skills [3,4,5][3,4,5] join the first team). Then the second coach chooses the student on position 11, and the row becomes empty (and students with programming skills [1,2][1,2] join the second team).
题目链接 : http://codeforces.com/contest/1154/problem/E
题意 :
给你n个值(1~n且不重复),选中最大的数,并将它左边k个元素和右边k个元素(可能不足,不足的部分不考虑)选中标记为 1 ,这2*k+1个元素同时从数组中删除。重复操作,但是标记为2,结束一轮。
重复任意多轮,直至所有数都被标记(1 or 2)。
当时并没有好的思路,赛后看的别人的代码才会的。
大佬的AK日常: https://www.jianshu.com/p/fd764cf686e9
考虑到数据是1~n的全排列, 所以我们可以用数组来将元素的位置离散出来。
实现类似于双链表的数据结构,用于快速找到当前元素的左右相邻元素。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; const int maxn = 2e5+;
int n, k;
int sk[maxn], le[maxn], ri[maxn];
int arr[maxn], ans[maxn]; void remo(int ind){
le[ri[ind]] = le[ind];
ri[le[ind]] = ri[ind];
}
int main(){
memset(ans,,sizeof(ans));
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++){
scanf("%d",&arr[i]);
sk[arr[i]] = i;
le[i] = i-;
ri[i] = i+;
}
ans[] = ans[n+] = -;// 边界
int team = ;
for(int i=n;i>=;i--){
int index = sk[i];
if(ans[index])
continue;
remo(index);
ans[index] = team;
int l = le[index], r = ri[index];
for(int i=;i<k;i++,l=le[l]){
if(ans[l])
break;
remo(l);
ans[l] = team;
}
for(int i=;i<k;i++,r=ri[r]){
if(ans[r])
break;
remo(r);
ans[r] = team;
}
team = - team;
}
for(int i=;i<=n;i++)
printf("%d",ans[i]);
putchar('\n');
return ;
}
Codeforces 552 E. Two Teams的更多相关文章
- Codeforces 544E K Balanced Teams (DP)
题目: You are a coach at your local university. There are nn students under your supervision, the prog ...
- codeforces 1133E K Balanced Teams
题目链接:http://codeforces.com/contest/1133/problem/E 题目大意: 在n个人中找到k个队伍.每个队伍必须满足最大值减最小值不超过5.求满足条件k个队伍人数的 ...
- 【CODEFORCES】 B. Random Teams
B. Random Teams time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- Codeforces 1133E - K Balanced Teams - [DP]
题目链接:https://codeforces.com/contest/1133/problem/C 题意: 给出 $n$ 个数,选取其中若干个数分别组成 $k$ 组,要求每组内最大值与最小值的差值不 ...
- codeforces 552 E. Vanya and Brackets 表达式求值
题目链接 讲道理距离上一次写这种求值的题已经不知道多久了. 括号肯定是左括号在乘号的右边, 右括号在左边. 否则没有意义. 题目说乘号只有15个, 所以我们枚举就好了. #include <io ...
- codeforces#552 D. Vanya and Triangles(几何)
题意:给出n个不同的点,问能组成多少个不同的三角形 题解:对于每个点对,我们生成一个直线,用a*x+b=y表示,用map记录ab,这样就确定了一个直线,这样我们就能算出有多少点是共线的,这样复杂度就是 ...
- codeforces 552 C Vanya and Scales
这个题的意思就是给出一个数m.以及一个以1为首元素.w为比例常数的等比数列,数列长度为101,数列中每一个数字最多仅仅能用一次.问是否存在xa+wb+--=wc+wd+--+we+m. 非常显然,换句 ...
- 51nod 1596 搬货物【贪心/二进制】
1596 搬货物 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 取消关注 现在有n个货物,第i个货物的重量是 2wi ...
- Codeforces Round #552 (Div. 3) E. Two Teams (模拟,优先队列,双向链表)
题意:有\(n\)个队员站成一排,有两个教练分别选人,每次选当前剩余人中的能力值最大的那个以及他两边相邻的\(k\)个人,问最后每个人所在队伍情况. 题解:优先队列模拟,以及双向链表,先用结构体存入每 ...
随机推荐
- LeetCode29.两数相除 JavaScript
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输 ...
- 安装Oracle 18.4 RAC 遇到ORA-40238报错
场景: Aix 7.2 上安装Oracle 18.4 RAC 执行root.sh脚本,ASM failed to start !查看日志文件:ORA-40238: invalid linear alg ...
- 2019年,200道面试题打造最受企业欢迎的iOS程序猿!
在2018年底,小编混迹在各种iOS交流群中,整理出了将近两百道大厂最喜欢在面试问到的问题,今天在这里分享给大家[免费获取方式在最后]! 小编就不在 ...
- leyer不写content参数直接传递给子页面数据
function btnAddClickownfund(){ //获取数据 var actual = $("#actual_capitals").html().trim(); // ...
- 用js计算自己从出生到现在生活了多长时间(x天零x小时零x分钟零x秒) 初学者,大家多多包涵,有不足的地方请多包涵。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 需求:promise执行买菜做饭过程
需求:promise执行买菜做饭过程 1.买菜 2.洗菜 3.做饭 4.吃饭 <!DOCTYPE html> <html lang="en"> <he ...
- ElasticSearch优化系列二:机器设置(内存)
预留一半内存给Lucene使用 一个常见的问题是配置堆太大.你有一个64 GB的机器,觉得JVM内存越大越好,想给Elasticsearch所有64 GB的内存. 当然,内存对于Elasticsear ...
- mysql主键重复,不抱错,只更新的骚操作 (如果没有插入,如果有更新)
平时我们在设计数据库表的时候总会设计 unique 或者 给表加上 primary key 的限制条件. 此时 插入数据的时候 ,经常会有这样的情况: 我们想向数据库插入一条记录: 若数据表中存在以 ...
- 通过XShell实现windows文件上传到Linux服务器上
.XShell上传文件到Linux服务器上 在学习Linux过程中,我们常常需要将本地文件上传到Linux主机上,这里简单记录下使用Xsheel工具进行文件传输 1:首先连接上一台Linux主机 2: ...
- python学习_条件判断语句_if
#条件判断语句(if)#语法:if条件表达式:语句# 代码块#执行流程:if语句在执行时,会先对条件表达式进行求值判断#如果为True,则执行if后面的语句#如果为False,则不执行#默认情况下,i ...