题意:给出一串n个数   为1-n的乱序

一共有两个教练   教练一的队伍是1队  二是二队

教练一选择 当前队列中剩余人数的最大序号   将其和左边k个人 和右边k个人 变为一队

如此反复直到所有人都分好队伍

这题思路很巧妙

一开始以为要搜索最大值  时间效率肯定很低

但是可以对位置进行映射   避免了寻找最大值(1-n 的排序这一点非常适用)

一开始的代码: 仔细一想其实缺乏合理性

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
#define N 200000+5
int n,k;
int a[N];
int pos[N];
char ans[N];
int le[N];
int ri[N];
int d=; int main()
{ RII(n,k);
rep(i,,n)
{
RI(a[i]);
pos[ a[i] ]=i;
le[i]=i-;
ri[i]=i+;
} CLR(ans,);
repp(i,n,)
{
if( ans[ pos[i] ] )continue;
ans[ pos[i] ]=d+''; int L=pos[i],R=pos[i]; rep(j,,k)
{
L=le[L];
if(L>=)ans[L]=d+'';
R=ri[R];
if(R<=n)ans[R]=d+'';
}
L=le[L];R=ri[R];
le[R]=L;
ri[L]=R; d=-d;
}
puts(ans+); return ;
}

wa点:

删边有严格的前后之分!!!!  不然会wa

对比:

wa:

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
#define N 200000+5
int n,k;
int a[N];
int pos[N];
char ans[N];
int le[N];
int ri[N];
int d=; void del(int x)
{
ans[x]=d+'';
int L=le[x];
int R=ri[x];
le[R]=L;
ri[L]=R;
} int main()
{
RII(n,k);
rep(i,,n)
{
RI(a[i]);
pos[ a[i] ]=i;
le[i]=i-;
ri[i]=i+;
}
repp(i,n,)
{
if( ans[ pos[i] ] )continue; del(pos[i]);
int L=pos[i];
int R=pos[i];
rep(j,,k)
{
L=le[L];
if(L>=)del(L);
R=ri[R];
if(R<=n)del(R);
}
d=-d;
}
puts(ans+);
return ;
}

AC:

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
#define N 200000+5
int n,k;
int a[N];
int pos[N];
char ans[N];
int le[N];
int ri[N];
int d=; void del(int x)
{
ans[x]=d+'';
int L=le[x];
int R=ri[x];
le[R]=L;
ri[L]=R;
} int main()
{ RII(n,k);
rep(i,,n)
{
RI(a[i]);
pos[ a[i] ]=i;
le[i]=i-;
ri[i]=i+;
} repp(i,n,)
{
if( ans[ pos[i] ] )continue; del(pos[i]);
int L=le[pos[i]];
int R=ri[pos[i]];
rep(j,,k)
{ if(L>=)del(L),L=le[L]; if(R<=n)del(R),R=ri[R];
} d=-d;
}
puts(ans+); return ;
}

同时来也会出错!!!!!!

AC:

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
#define N 200000+5
int n,k;
int a[N];
int pos[N];
char ans[N];
int le[N];
int ri[N];
int d=; void del(int x)
{
ans[x]=d+'';
int L=le[x];
int R=ri[x];
le[R]=L;
ri[L]=R;
} int main()
{
RII(n,k);
rep(i,,n)
{
RI(a[i]);
pos[ a[i] ]=i;
le[i]=i-;
ri[i]=i+;
}
repp(i,n,)
{
if( ans[ pos[i] ] )continue; int L=pos[i];
int R=pos[i];
rep(j,,k)
{
L=le[L];
if(L==)break;
del(L);
}
rep(j,,k)
{
R=ri[R];
if(R>n)break;
del(R);
} del(pos[i]);
d=-d;
}
puts(ans+);
return ;
}

WA:

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
#define N 200000+5
int n,k;
int a[N];
int pos[N];
char ans[N];
int le[N];
int ri[N];
int d=; void del(int x)
{
ans[x]=d+'';
int L=le[x];
int R=ri[x];
le[R]=L;
ri[L]=R;
} int main()
{
RII(n,k);
rep(i,,n)
{
RI(a[i]);
pos[ a[i] ]=i;
le[i]=i-;
ri[i]=i+;
}
repp(i,n,)
{
if( ans[ pos[i] ] )continue; int L=pos[i];
int R=pos[i];
rep(j,,k)
{
L=le[L];
if(L>)
del(L);
R=ri[R];
if(R<=n)
del(R); } del(pos[i]);
d=-d;
}
puts(ans+);
return ;
}

这种的话并不是因为同时来!!是因为右边跳到左边了!!!!!!!!!!

AC:

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
#define N 200000+5
int n,k;
int a[N];
int pos[N];
char ans[N];
int le[N];
int ri[N];
int d=; void del(int x)
{
ans[x]=d+'';
int L=le[x];
int R=ri[x];
le[R]=L;
ri[L]=R;
} int main()
{
RII(n,k);
rep(i,,n)
{
RI(a[i]);
pos[ a[i] ]=i;
le[i]=i-;
ri[i]=i+;
}
ri[n+]=n+; repp(i,n,)
{
if( ans[ pos[i] ] )continue; int L=pos[i];
int R=pos[i];
rep(j,,k)
{
L=le[L];
if(L>)
del(L);
R=ri[R];
if(R<=n)
del(R); } del(pos[i]);
d=-d;
}
puts(ans+);
return ;
}

然后对上面进行调试也AC了

原来真wa点是ri数组QAQ!!!

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s);
#define ll long long
#define REP(i,N) for(int i=0;i<(N);i++)
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
#define N 200000+5
int n,k;
int a[N];
int pos[N];
char ans[N];
int le[N];
int ri[N];
int d=; void del(int x)
{
ans[x]=d+'';
int L=le[x];
int R=ri[x];
le[R]=L;
ri[L]=R;
} int main()
{
RII(n,k);
rep(i,,n)
{
RI(a[i]);
pos[ a[i] ]=i;
le[i]=i-;
ri[i]=i+;
}
ri[n+]=n+;
repp(i,n,)
{
if( ans[ pos[i] ] )continue; del(pos[i]);
int L=pos[i];
int R=pos[i];
rep(j,,k)
{
L=le[L];
if(L>=)del(L);
R=ri[R];
if(R<=n)del(R);
}
d=-d;
}
puts(ans+);
return ;
}

CF552 E. Two Teams的更多相关文章

  1. Rnadom Teams

    Rnadom  Teams 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.actioncid=88890#problem/B 题目: Descript ...

  2. URAL 1208 Legendary Teams Contest(DFS)

    Legendary Teams Contest Time limit: 1.0 secondMemory limit: 64 MB Nothing makes as old as years. A l ...

  3. timus 1106 Two Teams(二部图)

    Two Teams Time limit: 1.0 secondMemory limit: 64 MB The group of people consists of N members. Every ...

  4. CF478 B. Random Teams 组合数学 简单题

    n participants of the competition were split into m teams in some manner so that each team has at le ...

  5. UVA 11609 Teams 组合数学+快速幂

    In a galaxy far far away there is an ancient game played among the planets. The specialty of the gam ...

  6. SCAU 07校赛 10317 Fans of Footbal Teams

    10317 Fans of Footbal Teams 时间限制:1000MS  内存限制:65535K 题型: 编程题   语言: 无限制 Description Two famous footba ...

  7. "is not on any development teams " Xcode的账号错误问题

    "***@*** is not on any development teams " Xcode现在在"Accounts"中时不时会出现这个提示. 但其他按钮都 ...

  8. cf478B Random Teams

    B. Random Teams time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  9. uva 10911 - Forming Quiz Teams(记忆化搜索)

    题目链接:10911 - Forming Quiz Teams 题目大意:给出2 * n个选手的坐标, 要求将所有的选手分成n组, 每组两个人, 所有组的两个人之间的距离之和要最小, 输出最小值. 解 ...

随机推荐

  1. [JavaScript]为JS处理二进制数据提供可能性的WEB API

    写这篇博客的起源是在div.io上的一篇文章<你所不知道的JavaScript数组>by 小胡子哥下的评论中的讨论. 因为随着XHR2和现代浏览器的普及,在浏览器当中处理二进制不再向过去那 ...

  2. Day7--------------虚拟机网络服务

    1.桥接 连接到本地的网卡,把本机的网卡看作是虚拟交换机 ping ip地址 arping -i eth0 192.168.11.11 返回物理MAC地址             #可以检查是否有重复 ...

  3. 如果Android真的收费了,你怎么看?

    前言 今天突然看到一群里有人发了下面这样一张图片,然后群里又炸了!   于是又和同事讨论了android收费的问题,然后隔壁正在玩农药的UI妹子就笑了... 没错! 安卓可能要收费了!安卓可能要收费了 ...

  4. Confluence 6 配置 Office 连接器选项

    具有系统管理员权限的用户可以配置 Office 连接器的属性和相关表现. 希望设置 Office 连接器的配置属性: 进入  > 基本配置(General Configuration) > ...

  5. Confluence 6 与其他应用整合

    你可以使用 应用链接(Application Links)将 Confluence 与其他应用进行整合.应用链接允许你连接 Confluence 到其他的应用,例如 JIRA 软件或者 JIRA 服务 ...

  6. Confluence 6 为空白空间重置原始默认内容

    希望重置为原始的默认内容: 在屏幕的右上角单击 控制台按钮 ,然后选择 General Configuration 链接. 在左侧的面板中选择 全局模板和蓝图(Global Templates and ...

  7. 关于vue的基础概念

    vue-cli相当于脚手架 给你自动生成模板工程vue-router是 vue路由插件 支持你单页应用的vue-loader是webpack下loader插件 可以把.vue文件 输出成组件

  8. 2。创建第一个angular应用,已经开发前的一些配置

    现在我们开始新建一个angular5的脚手架  . 到想要建项目的目录下.比如我的 在  D:\JsProjects 进入cmd或者powershell cd 进入该文件夹下 然后开始新建,ng ne ...

  9. HTML&javaSkcript&CSS&jQuery&ajax(十)

    HTML 1.SVG直接嵌入HTML网页 ,SVG 是使用XML描述2D图像的语言,Canvas通过JavaScript来绘制2D <svg xmlns="http://www.w3. ...

  10. mysql 查看某个数据库中所有表的数据量

    1.登录mysql 2.使用命令:use information_schema; 3.使用命令:select table_name,table_rows from tables where TABLE ...