ディレクトリ
トピック名:テクノロジー
出典:展望オンライン査定
リンク
ブログのリンク
トピックリンク
タイトル内容
タイトル説明
マンディとXiaoyanは良い友達のペアです。
彼らは、Minecraftのと呼ばれる素晴らしいゲームをプレイしています。
彼らは今の正方形で作られた長い手工芸品を行います。しかし、今のボックスは混乱で、なぜなら機械の要件を、彼らは右端には、この手工芸品の左端のボックスを行うことができます。
彼らはこの1回のだけの操作で、最も美しい工芸品をより美しくすることができ、欲しいです。
二つの美しい工芸先頭から比較方法、それは比較I + 1つの正方形を継続する場合と同じように小さな欠陥度ではありませんブロックのi番目の位置は、その後、さらに美しいある場合。同じ美しい上のすべて同じ、2つの工芸品の場合。
効果の対象に
数字の文字列を考えると、最小の図を見つけます。
フォーマット
エントリー
nは二つの整数の最初の行は、ブロックの数を表します。
第二行nは整数、左から右に不良ブロックの出力値の各整数。
輸出
左から右へ、代表から最も審美的な欠陥の工芸nは整数行の値。
データ
サンプル
エントリー
10
10 9 8 7 6 5 4 3 2 1
輸出
1 10 9 8 7 6 5 4 3 2
データ範囲
データの20%を、N <= 1000
データの40%を、N <= 10000
データ100%、N <= 300000
問題の解決策
40ポイント
最小暴力が言った検索時間の複雑\(Oは(^ N-2)\) 。
100ポイント
最小表現裸のタイトル。
//C++
#include<bits/locale_facets.h>
#include<stdio.h>
using namespace std;
void output(long long o);
int flaw[300001];
template<typename name>name* expression(name* l,name* r);
long long input();
int main()
{
int n=input();
for(int i=1;i<=n;i++)flaw[i]=input();
int answer=expression<int>(flaw+1,flaw+n)-flaw;
for(int i=answer;i<=n;i++)output(flaw[i]),putchar(' ');
for(int i=1;i<answer-1;i++)output(flaw[i]),putchar(' ');
output(flaw[answer-1]),putchar('\n');
return 0;
}
void output(long long o)
{
if(o<0)putchar('-'),o=-o;
if(o>=10)output(o/10);
putchar(o%10+'0');
}
template<typename name>name* expression(name* l,name* r)
{
int n=r-l,i=0,j=1;
for(int k=0,I,J,bound;i<=n&&j<=n&&k<=n;)
{
I=(i+k-1)%n+1,J=(j+k-1)%n+1;
if(l[I]==l[J])k++;
else
{
if(l[I]<l[J])swap(i,j);
bound=max(i+k,j-1);
if(i<j)j=bound+2;
i=bound+1,k=0;
}
}
return l+min(i,j);
}
long long input()
{
bool positive=true;
char NUM=getchar();
long long i=0;
for(;!isdigit(NUM);NUM=getchar())
if(NUM=='-')positive=!positive;
for(;isdigit(NUM);NUM=getchar())i=(i<<3)+(i<<1)+NUM-'0';
return positive?i:-i;
}