am1x icon

Untitled

am1x | PRO | 08/17/21 07:06:02 PM UTC | 0 ⭐ | 1504 👁️ | Never ⏰ | []
C++ |

1.64 KB

|

None

|

0 👍

/

0 👎

#include <stdio.h>
#include <assert.h>
#include <inttypes.h>
 
typedef unsigned int uint_t;
const uint_t N = 1000000, LK = 30, B = 100000000;
 
static uint_t read_uint()
{
    const uint_t D = 10;
    uint_t u = 0;
    do {
        int c = getchar_unlocked();
        assert (0 <= c);
        u = c - '0';
    } while (D <= u);
    
    for (;;) {
        uint_t v = getchar_unlocked() - '0';
        if (D <= v)
            break;
        u = u * D + v;
    }
    return u;
}
 
int main()
{
    uint_t ms[LK];
    uint64_t ss[LK];
    
    uint_t n = read_uint();
    assert (0 < n && n <= N);
    uint_t k = read_uint();
    assert ((k >> LK) == 0);
 
    uint_t m = 0;
    ms[m++] = k;
    {
        uint_t j = 0;
        while (k & (1U << j))
            j++;
        for (; j < LK; j++) {
            uint_t jm = (1U << j);
            if ((k & jm) == 0)
                continue;
            uint_t k1 = (k & ~(jm)) | (jm - 1);
            //fprintf(stderr, "adding k1=%u\n", k1);
            ms[m++] = k1;
        }
    }
    
    for (uint_t i = 0; i < m; i++)
        ss[i] = 0;
    
    for (uint_t i = 0; i < n; i++) {
        uint_t a = read_uint();
        assert ((a >> LK) == 0);
        uint_t b = read_uint();
        assert (0 < b && b <= B);
        //fprintf(stderr, "checking pair (%u, %u) \n", a, b);
        for (uint_t j = 0; j < m; j++) {
            if ((~ms[j] & a) == 0) {
                ss[j] += b;
                //fprintf(stderr, "it passed m=%u\n", ms[j]);
            }
        }
    }
 
    uint64_t res = ss[0];
    for (uint_t i = 1; i < m; i++) {
        if (res < ss[i])
            res = ss[i];
    }
    printf("%" PRIu64 "\n", res);
    return 0;
}
 

Comments