p2651.cpp
来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 43 行
CPP
43 行
#include <stdio.h>
#include <set>
#define MAXN 20001
#define Inf 0x0fffffff
using namespace std;
int N , A , B , Ord [MAXN] , Num [MAXN] , Deg [MAXN];
set <int> Deglist [3];
bool check ();
main ()
{
while ( scanf ( "%d%d%d", &N , &A , &B ) != EOF ) {
if ( !check () ) printf ( "No\n" );
}
}
bool check ()
{
if ( A == B && A < N ) return false;
set <int> :: iterator Iter , Iter2;
int S;
for ( int i = 0; i < 3; i ++ ) Deglist [i].clear ();
for ( int i = 0; i <= N; i ++ ) Deg [i] = ( i - B >= 0 ) + ( i + A <= N ) , Deglist [Deg [i]].insert ( i );
for ( int i = 0; i <= N; i ++ ) {
if ( Deglist [0].empty () ) return false;
Iter = Deglist [0].begin ();
S = *Iter , Deglist [0].erase ( Iter );
Ord [i] = S , Num [S] = i;
if ( S - A >= 0 ) Iter2 = Deglist [Deg [S - A]].find ( S - A ) , Deglist [Deg [S - A]].erase ( Iter2 ) , Deglist [-- Deg [S - A]].insert ( S - A );
if ( S + B <= N ) Iter2 = Deglist [Deg [S + B]].find ( S + B ) , Deglist [Deg [S + B]].erase ( Iter2 ) , Deglist [-- Deg [S + B]].insert ( S + B );
}
printf ( "Yes\n" );
for ( int i = 1; i <= N; i ++ )
if ( Num [i] > Num [i - 1] ) printf ( "Right %d\n" , Num [i] - Num [i - 1] );
else printf ( "Left %d\n" , Num [i - 1] - Num [i] );
return true;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?