結果
| 問題 |
No.15 カタログショッピング
|
| コンテスト | |
| ユーザー |
FF256grhy
|
| 提出日時 | 2016-09-03 18:46:17 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 16 ms / 5,000 ms |
| コード長 | 2,420 bytes |
| コンパイル時間 | 505 ms |
| コンパイル使用メモリ | 25,984 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-15 19:18:12 |
| 合計ジャッジ時間 | 924 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 10 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:78:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
78 | scanf("%d%d", &n, &s);
| ~~~~~^~~~~~~~~~~~~~~~
main.cpp:79:27: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
79 | INC0(i, n) { scanf("%d", &p[i]); }
| ~~~~~^~~~~~~~~~~~~
main.cpp: In member function ‘bool Bit::operator<=(const Bit&)’:
main.cpp:58:9: warning: control reaches end of non-void function [-Wreturn-type]
58 | }
| ^
ソースコード
#include <cstdio>
#define FOR(i, l, r) for(int i = (l) ; i < (r); i++)
#define REV(i, l, r) for(int i = (r) - 1; i >= (l); i--)
#define INC0(i, n) FOR(i, 0, n)
#define INC1(i, n) FOR(i, 1, (n) + 1)
#define DEC0(i, n) REV(i, 0, n)
#define DEC1(i, n) REV(i, 1, (n) + 1)
typedef long long signed int LL;
typedef long long unsigned int LU;
template<typename T> void m_sort_(T a[], T b[], int l, int r) {
if(r - l < 2) { return; }
int m = (l + r) / 2;
m_sort_(a, b, l, m);
m_sort_(a, b, m, r);
int ll = l, rr = m, bb = 0;
while(bb < r - l) {
bool flag;
if(rr == r || ll == m) { flag = (rr == r); }
else { flag = (a[ll] <= a[rr]); }
if(flag) { b[bb++] = a[ll++]; }
else { b[bb++] = a[rr++]; }
}
FOR(i, l, r) { a[i] = b[i - l]; }
return;
}
template<typename T> void m_sort(T a[], int l, int r) {
T* b = new T[r - l];
m_sort_(a, b, l, r);
delete[] b;
return;
}
struct KV {
int k, v;
bool operator<=(const KV& obj) { return this -> k <= obj.k; }
};
struct Bit {
int v;
bool operator<=(const Bit& obj) {
if(this -> v == obj.v) { return true; }
INC0(i, 31) {
if( ((this -> v) ^ obj.v) & (1 << i) ) {
return ((this -> v) & (1 << i));
}
}
}
void print(int n) {
bool flag = false;
INC0(j, n) {
if(v & (1 << j)) {
printf("%s%d", flag ? " " : "", j + 1);
flag = true;
}
}
printf("\n");
}
};
int n, s, p[31];
KV kv1[1 << 15];
KV kv2[1 << 16];
Bit ans[49]; int cnt;
int main() {
scanf("%d%d", &n, &s);
INC0(i, n) { scanf("%d", &p[i]); }
int m = n / 2;
INC0(i, 1 << m) {
int sum = 0;
FOR(j, 0, m) {
if(i & (1 << j)) { sum += p[j]; }
}
kv1[i].k = sum;
kv1[i].v = i;
}
INC0(i, 1 << (n - m)) {
int sum = 0;
FOR(j, 0, n - m) {
if(i & (1 << j)) { sum += p[m + j]; }
}
kv2[i].k = sum;
kv2[i].v = i;
}
m_sort(kv1, 0, 1 << m);
m_sort(kv2, 0, 1 << (n - m));
int a = 0, b = (1 << (n - m)) - 1;
while(a < (1 << m) && b >= 0) {
int ka = kv1[a].k;
int kb = kv2[b].k;
int sum = ka + kb;
if(sum == s) {
int aa = a, bb = b;
while(aa < (1 << m) && kv1[aa].k == ka) { aa++; }
while(bb >= 0 && kv2[bb].k == kb) { bb--; }
FOR(aaa, a, aa) {
FOR(bbb, bb + 1, b + 1) {
ans[cnt++].v = kv1[aaa].v + (kv2[bbb].v << m);
}
}
a = aa;
b = bb;
}
if(sum < s) { a++; }
if(sum > s) { b--; }
}
m_sort(ans, 0, cnt);
INC0(i, cnt) { ans[i].print(n); }
return 0;
}
FF256grhy