結果
問題 | No.2161 Black Market |
ユーザー |
|
提出日時 | 2023-03-24 20:42:47 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 357 ms / 7,000 ms |
コード長 | 2,776 bytes |
コンパイル時間 | 1,280 ms |
コンパイル使用メモリ | 96,068 KB |
最終ジャッジ日時 | 2025-02-11 16:52:31 |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 37 |
コンパイルメッセージ
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&&j<=m2) { 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; }