結果
| 問題 |
No.15 カタログショッピング
|
| コンテスト | |
| ユーザー |
k82b
|
| 提出日時 | 2023-10-10 20:48:30 |
| 言語 | D (dmd 2.109.1) |
| 結果 |
AC
|
| 実行時間 | 46 ms / 5,000 ms |
| コード長 | 1,705 bytes |
| コンパイル時間 | 2,933 ms |
| コンパイル使用メモリ | 229,460 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-09-13 00:18:10 |
| 合計ジャッジ時間 | 3,971 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 |
ソースコード
void main()
{
alias Entry = Tuple!(int, "x", int, "y");
const N = readInt;
const S = readInt;
auto P = new int[N];
int n = N / 2, m = N - N / 2;
auto A = new int[n];
auto B = new int[m];
foreach (i; 0 .. n) A[i] = readInt;
foreach (i; 0 .. m) B[i] = readInt;
Entry[] C, D;
foreach (i; 0 .. 1 << n) {
int now, b;
foreach (j; 0 .. n) if (i >> j & 1) {
now += A[j];
b |= 1 << j;
}
C ~= Entry(now, b);
}
foreach (i; 0 .. 1 << m) {
int now, b;
foreach (j; 0 .. m) if (i >> j & 1) {
now += B[j];
b |= 1 << (n + j);
}
D ~= Entry(now, b);
}
D.sort;
int[][] ans;
foreach (i; 0 .. cast(int)(C.length)) {
int l = lowerBound(D, Entry(S - C[i].x, 0));
int r = lowerBound(D, Entry(S - C[i].x + 1, 0));
if (l != cast(int)(D.length) && D[l].x == S - C[i].x) {
foreach (j; l .. r) {
int[] a;
foreach (k; 0 .. N) {
if (C[i].y >> k & 1 || D[j].y >> k & 1) {
a ~= k + 1;
}
}
ans ~= a;
}
}
}
ans.sort;
writefln("%(%(%s %)\n%)", ans);
}
import std,core.bitop;
string[]_R;
string readString(){while(_R.empty){_R=readln.chomp.split;}auto ret=_R.front;_R.popFront;return ret;}
int readInt(){return readString.to!int;}
long readLong(){return readString.to!long;}
ulong readULong(){return readString.to!ulong;}
real readReal(){return readString.to!real;}
bool chmin(T)(ref T A,T B){if(A>B){A=B;return true;}else{return false;}}
bool chmax(T)(ref T A,T B){if(A<B){A=B;return true;}else{return false;}}
int lowerBound(T)(T[]A,T x){int L=-1,R=cast(int)A.length;while(R-L>1){int mid=(L+R)/2;(A[mid]<x?L:R)=mid;}return R;}
int upperBound(T)(T[]A,T x){int L=-1,R=cast(int)A.length;while(R-L>1){int mid=(L+R)/2;(A[mid]<=x?L:R)=mid;}return R;}
k82b