题意:给出一串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. C# 防止content-type修改后上传恶意文件

    以图片为例子.在上传图片的时候,使用Fiddler抓取 通过js判断文件类型是不安全的,所以通过后台来判断,代码如下: ) { HttpPostedFile file0 = Request.Files ...

  2. Android启动模式之singleinstance的坑

    前言 在实际应用中,使用singleinstance启动模式时,会遇到一些奇奇怪怪的问题.Android有四种启动模式,分别是standard,singleTop,singleTask,singleI ...

  3. 洛谷P4827 [国家集训队] Crash 的文明世界 [斯特林数,组合数,DP]

    传送门 思路 又见到这个\(k\)次方啦!按照套路,我们将它搞成斯特林数: \[ ans_x=\sum_{i=0}^k i!S(k,i)\sum_y {dis(x,y) \choose i} \] 前 ...

  4. vue入手

    https://www.jianshu.com/p/dc5057e7ad0d    (最全入坑教程) http://doc.liangxinghua.com/vue-family/1.4.html(v ...

  5. Confluence 6 使用 Apache 和 mod_proxy 添加 SSL和其他

    添加 SSL 如果你计划在你的应用中启用 SSL ,请参考 Securing your Atlassian applications with Apache using SSL页面中的内容,并确定你在 ...

  6. VMware安装windows10系统

  7. 前端基础之初识HTML

    一.web服务的本质 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.b ...

  8. LeetCode(3):无重复字符的最大子串

    本内容是LeetCode第三道题目:无重复字符的最大子串 # -*- coding: utf-8 -*- """ Created on Sun Mar 10 20:14: ...

  9. java 关键字transient

    http://www.cnblogs.com/lanxuezaipiao/p/3369962.html 1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口 ...

  10. 攻击WordPress和其他程序

    1.SAAS服务(Software as a Service )管理其他作为内容管理的一个人框架的软件,http://www.turnkeylinx.org 上发布了很多测试应用的程序.WordPre ...