题意:给出一串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. 【原创】大叔问题定位分享(31)hive metastore报错

    hive metastore在建表时报错 [pool-5-thread-2]: MetaException(message:Got exception: java.net.ConnectExcepti ...

  2. Codeforces 1093E Intersection of Permutations [CDQ分治]

    洛谷 Codeforces 思路 一开始想到莫队+bitset,发现要T. 再想到分块+bitset,脑子一抽竟然直接开始写了,当然也T了. 最后发现这就是个裸的CDQ分治-- 发现\(a\)不变,可 ...

  3. STM32应用实例十四:利用光敏二极管实现光度测量

    最近我们在开发臭氧发生器时,需要监测生成的臭氧的浓度,于是想到使用光度计来测量.因为不同浓度的臭氧对管的吸收作用是不相同的,于是检测光照强度的变化就可以得到相应的浓度数据. 1.硬件设计 此次光照度检 ...

  4. Mysql8.0安装步骤

    Mysql8.0安装步骤 2018年05月10日 14:39:05 93年的香槟 阅读数:19628 标签: mysql 更多 个人分类: 数据库   版权声明:本文为博主原创文章,未经博主允许不得转 ...

  5. CentOS 7 安装JDK环境

    1.JDK下载地址:https://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html ...

  6. 【python】声明编码的格式

    来自:http://www.xuebuyuan.com/975181.html 编码声明必须在第一行或者第二行,且要符合正则表达式 "coding[:=]\s*([-\w.]+)" ...

  7. Ubuntu 安装google 拼音

    一.安装fcitx apt-get install fcitx 二.安装google pinyin sudo apt install fcitx-googlepinyin 三. 安装 fcitx-co ...

  8. python(8):面向对象编程

    有三种程序类型: (1)面向过程:按照一定的逻辑顺序,一步步垒代码 (2)面向函数:对用常用的计算,建立函数避免重复 (3)面向对象: 函数的集合,对函数进行分类和封装 (一) 抽象 抽象: 哈巴狗, ...

  9. 古代猪文:数论大集合:欧拉定理,exgcd,china,逆元,Lucas定理应用

    /* 古代猪文:Lucas定理+中国剩余定理 999911658=2*3*4679*35617 Lucas定理:(m,n)=(sp,tp)(r,q) %p 中国剩余定理:x=sum{si*Mi*ti} ...

  10. Java+selenium之WebDriver的抛出异常分析(七)

    NoSuchElementException 1.检查元素的定位器是否正确 2.如果定位器正确,增加休眠时间 3.等待了足够的时间依然找不到的话,更换定位器的定位方式 NoSuchWindowExce ...