結果

問題 No.2161 Black Market
ユーザー lddlinan
提出日時 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]);
      |                         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~

ソースコード

diff #

#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;
}
0