結果
| 問題 |
No.873 バイナリ、ヤバいなり!w
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-09-01 11:07:04 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,376 bytes |
| コンパイル時間 | 618 ms |
| コンパイル使用メモリ | 70,820 KB |
| 実行使用メモリ | 6,948 KB |
| 最終ジャッジ日時 | 2024-06-24 06:36:46 |
| 合計ジャッジ時間 | 3,394 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 21 WA * 15 |
ソースコード
#include<iostream>
#include<vector>
using namespace std;
const int INF = 1<<30;
// 0にくっつけるなら奇数長で短い順->偶数長で長い順(偶数長の最初の01列は1始まりなので)
// 1にくっつけるなら↑の逆が良い(偶数長で短い順->奇数長で長い順)
// 復元の際に、現時点で文字列の末尾が0か1かに応じてappendする01列を変えるために、
// 上の順序付けにおいて最大最小をそれぞれ記録しておく
const int siz = 3e5;
int main(){
auto f = [](int val)->int{
return val%2 == 1 ? val/2 : siz/2+(siz-val)/2;
};
int n;
cin >> n;
vector<int> dp(n+1, INF), mi(n+1, INF), ma(n+1, -INF);
dp[0] = 0;
for(int i = 0; i <= n; i++){
for(int j = 1; i+j*j <= n; j++){
if(dp[i+j*j] > dp[i]+j){
dp[i+j*j] = dp[i]+j;
mi[i+j*j] = ma[i+j*j] = j;
}else if(dp[i+j*j] == dp[i]+j){
if(f(mi[i]) > f(j)) mi[i+j*j] = j;
if(f(ma[i]) < f(j)) ma[i+j*j] = j;
}
}
}
int out = 0;
while(n){
int take;
if(out == 0) take = mi[n];
else take = ma[n];
n -= take*take;
while(take-- > 0){
cout << out;
out ^= 1;
}
out ^= 1;
}
cout << endl;
return 0;
}