結果
| 問題 |
No.2161 Black Market
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-03-24 20:35:49 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,769 bytes |
| コンパイル時間 | 1,324 ms |
| コンパイル使用メモリ | 95,676 KB |
| 最終ジャッジ日時 | 2025-02-11 16:52:24 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 29 WA * 8 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:50:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
50 | scanf("%d %d %d %d", &n, &k, &l, &p);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:51:30: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
51 | for (i=0; i<n; i++) scanf("%d %d", &as[i], &bs[i]);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <map>
#include <vector>
#include <queue>
#include <deque>
#include <set>
#include <stack>
#include <algorithm>
#include <array>
#include <unordered_set>
#include <unordered_map>
#include <string>
using namespace std;
bool rcmp(int a, int b) { return a>b; }
typedef long long LL;
class mypcmp {
public:
bool operator()(const int& a, const int& b) {
return a<b;
}
};
multiset<pair<LL, LL>> ss1[18];
multiset<pair<LL, LL>> ss2[18];
LL vv[1<<17];
int mx, ix[1<<19];
int as[64], bs[64];
void setv(int i, int v) {
i+=mx;
while(i) { ix[i]+=v; i>>=1; }
}
int count(int s, int e) {
int r=0;
s+=mx; e+=mx;
while(s<=e) {
if (s&1) { r+=ix[s]; s++; }
if ((e&1)==0) { r+=ix[e]; e--; }
s>>=1; e>>=1;
}
return r;
}
int main() {
int n, i, k, l, p, m, x, mm, m2, c, j, jj, ii;
LL a, b, r=0, xv;
multiset<pair<LL, LL>> ss;
scanf("%d %d %d %d", &n, &k, &l, &p);
for (i=0; i<n; i++) scanf("%d %d", &as[i], &bs[i]);
m = (n+1)/2;
mm = 1<<m;
for (x=1; x<mm; x++) {
c=0; a=b=0;
for (i=0; i<m; i++) if ((1<<i)&x) {
c++;
a+=as[i]; b+=bs[i];
}
if (a>l||c>k) continue;
ss1[c].insert({a, b});
if (b>=p) r++;
}
m2=n-m;
mm = 1<<(n-m);
for (x=1; x<mm; x++) {
c=0; a=b=0;
for (i=0; i<m2; i++) if ((1<<i)&x) {
c++;
a+=as[i+m]; b+=bs[i+m];
}
if (a>l||c>k) continue;
ss2[c].insert({a, b});
if (b>=p) r++;
}
i=k; if (i>m) i=m; j=0;
for (i=m; i>0; i--) {
if (ss1[i].size()==0) continue;
while(j+i<=k) {
for (auto x: ss2[j]) ss.insert(x);
j++;
}
if (ss.size()==0) continue;
// build seg
c=0; for (auto x: ss1[i]) {
vv[c++]=x.second;
} sort(vv, vv+c);
jj=0; for (ii=0; ii<c; ii++) {
if (ii&&vv[ii]==vv[ii-1]) continue;
vv[jj++]=vv[ii];
} c=jj;
// printf("%d:%d:", i, c); for (j=0; j<c; j++) printf(" %lld", vv[j]); printf("\n");
mx=1; while(mx<=c) mx<<=1; memset(ix, 0, sizeof(ix[0])*(mx+mx));
for (auto x: ss1[i]) {
setv(lower_bound(vv, vv+c, x.second)-vv, 1);
}
auto e = ss1[i].rbegin();
for (auto x: ss) {
while(e!=ss1[i].rend()) {
if (e->first+x.first<=l) break;
setv(lower_bound(vv, vv+c, e->second)-vv, -1);
e++;
}
if (e==ss1[i].rend()) break;
xv = p-x.second;
r+=count(lower_bound(vv, vv+c, xv)-vv, c);
}
}
printf("%lld\n", r);
return 0;
}