提交记录 31323


用户 题目 状态 得分 用时 内存 语言 代码长度
saffah_dsh_260814 noi17a. 【NOI2017】整数 Time Limit Exceeded 56 2 s 3888 KB C 5.01 KB
提交时间 评测时间
2026-08-14 01:33:54 2026-08-14 01:34:29
#include <stdint.h>
#include <sys/auxv.h>
#include <unistd.h>

struct DuckInfo {
  uint64_t abi_version;
  const char *stdin_ptr; uint64_t stdin_size;
  char *stdout_ptr; uint64_t stdout_limit; uint64_t stdout_size;
  char *stderr_ptr; uint64_t stderr_limit; uint64_t stderr_size;
  const char *IB_ptr; uint64_t IB_limit;
  char *OB_ptr; uint64_t OB_limit;
  uint64_t tsc_frequency;
} __attribute__((packed));

#define NB 470000
#define NS ((NB+63)>>6)
#define FULL (~0ull)

static uint64_t block[NB];
static uint64_t ful[NS];   // bit=1 iff block is FULL
static uint64_t nz[NS];    // bit=1 iff block is nonzero

static const char *P;      // parse pointer
static uint64_t O;         // output index

static inline int ctzll_(uint64_t x){ return __builtin_ctzll(x); }

static inline int find_notfull(int p){
    int w = p >> 6;
    uint64_t m = ~ful[w] >> (p & 63);
    if (m) return p + ctzll_(m);
    while (ful[++w] == FULL) {}
    return (w << 6) + ctzll_(~ful[w]);
}

static inline int find_notzero(int p){
    int w = p >> 6;
    uint64_t m = nz[w] >> (p & 63);
    if (m) return p + ctzll_(m);
    while (nz[++w] == 0) {}
    return (w << 6) + ctzll_(nz[w]);
}

static inline void set_bit0(uint64_t *a, int i, int v){
    int w = i >> 6; uint64_t b = 1ull << (i & 63);
    if (v) a[w] |= b; else a[w] &= ~b;
}

// add v to block[i]; update bitsets; return overflow
static inline int add_block(int i, uint64_t v){
    uint64_t old = block[i];
    uint64_t nv = old + v;
    block[i] = nv;
    int w = i >> 6; uint64_t b = 1ull << (i & 63);
    if (nv) nz[w] |= b; else nz[w] &= ~b;
    if (nv == FULL) ful[w] |= b; else ful[w] &= ~b;
    return nv < old;
}

static inline int sub_block(int i, uint64_t v){
    uint64_t old = block[i];
    uint64_t nv = old - v;
    block[i] = nv;
    int w = i >> 6; uint64_t b = 1ull << (i & 63);
    if (nv) nz[w] |= b; else nz[w] &= ~b;
    if (nv == FULL) ful[w] |= b; else ful[w] &= ~b;
    return nv > old;
}

static inline void inc_block(int i){
    block[i] += 1;
    int w = i >> 6; uint64_t b = 1ull << (i & 63);
    nz[w] |= b;
    if (block[i] == FULL) ful[w] |= b;
    // else ful already 0 (was not full before, +1 only becomes full or stays not-full)
}

static inline void dec_block(int i){
    block[i] -= 1;
    int w = i >> 6; uint64_t b = 1ull << (i & 63);
    if (block[i]) nz[w] |= b; else nz[w] &= ~b;
    ful[w] &= ~b;
}

static inline void zero_range(int l, int r){
    for (int i = l; i <= r; i++){
        block[i] = 0;
        set_bit0(nz, i, 0);
        set_bit0(ful, i, 0);
    }
}

static inline void one_range(int l, int r){
    for (int i = l; i <= r; i++){
        block[i] = FULL;
        set_bit0(nz, i, 1);
        set_bit0(ful, i, 1);
    }
}

static inline void carry_add(int p){
    int j = find_notfull(p);
    zero_range(p, j-1);
    inc_block(j);
}

static inline void borrow_sub(int p){
    int j = find_notzero(p);
    one_range(p, j-1);
    dec_block(j);
}

static inline void add_val(int q, int r, uint64_t av){
    unsigned __int128 v = (unsigned __int128)av << r;
    uint64_t lo = (uint64_t)v;
    uint64_t hi = (uint64_t)(v >> 64);
    if (add_block(q, lo)) carry_add(q+1);
    if (add_block(q+1, hi)) carry_add(q+2);
}

static inline void sub_val(int q, int r, uint64_t av){
    unsigned __int128 v = (unsigned __int128)av << r;
    uint64_t lo = (uint64_t)v;
    uint64_t hi = (uint64_t)(v >> 64);
    if (sub_block(q, lo)) borrow_sub(q+1);
    if (sub_block(q+1, hi)) borrow_sub(q+2);
}

static inline int rd(){
    while (*P <= ' ') P++;
    int v = 0;
    while (*P > ' ') v = v*10 + (*P - '0'), P++;
    return v;
}
static inline int rds(){
    while (*P <= ' ') P++;
    int neg = 0;
    if (*P == '-'){ neg = 1; P++; }
    int v = 0;
    while (*P > ' ') v = v*10 + (*P - '0'), P++;
    return neg ? -v : v;
}

__attribute__((noreturn)) static void done(uint64_t olen, struct DuckInfo *di, char *out, int use_di){
    if (use_di) di->stdout_size = olen;
    else (void)!write(1, out, olen);
    asm volatile("mov $60, %%eax; xor %%edi, %%edi; syscall" ::: "rax","rdi","memory");
    __builtin_unreachable();
}

int main(){
    struct DuckInfo *di = (struct DuckInfo*)getauxval(0x6b637564);
    static char lbuf[1<<24];
    static char obuf[1<<22];
    char *out;
    int use_di = 0;
    if (di && di->abi_version >= 1 && di->stdin_ptr && di->stdout_ptr){
        P = di->stdin_ptr;
        out = di->stdout_ptr;
        use_di = 1;
    } else {
        long n2 = read(0, lbuf, sizeof(lbuf));
        lbuf[n2] = 0;
        P = lbuf;
        out = obuf;
    }

    int n = rd();
    rd(); rd(); rd(); // t1 t2 t3

    for (int i = 0; i < n; i++){
        int op = rd();
        if (op == 1){
            int a = rds();
            int b = rd();
            int q = b >> 6;
            int r = b & 63;
            if (a >= 0) add_val(q, r, (uint64_t)a);
            else sub_val(q, r, (uint64_t)(-(int64_t)a));
        } else {
            int k = rd();
            int bit = (int)((block[k>>6] >> (k & 63)) & 1);
            out[O++] = (char)('0' + bit);
            out[O++] = '\n';
        }
    }
    done(O, di, out, use_di);
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #16.85 us24 KBAcceptedScore: 4

Testcase #28.38 us24 KBAcceptedScore: 4

Testcase #341.2 us24 KBAcceptedScore: 4

Testcase #460.75 us24 KBAcceptedScore: 4

Testcase #5571.54 us24 KBAcceptedScore: 4

Testcase #6458.85 us28 KBAcceptedScore: 4

Testcase #724.52 ms60 KBAcceptedScore: 4

Testcase #81.21 ms32 KBAcceptedScore: 4

Testcase #9268.862 ms152 KBAcceptedScore: 4

Testcase #10936.514 ms236 KBAcceptedScore: 4

Testcase #1137.099 ms68 KBAcceptedScore: 4

Testcase #12631.144 ms304 KBAcceptedScore: 4

Testcase #131.462 s328 KBAcceptedScore: 4

Testcase #142 s800 KBTime Limit ExceededScore: 0

Testcase #152 s1 MB + 172 KBTime Limit ExceededScore: 0

Testcase #162 s1 MB + 548 KBTime Limit ExceededScore: 0

Testcase #172 s232 KBTime Limit ExceededScore: 0

Testcase #182 s2 MB + 300 KBTime Limit ExceededScore: 0

Testcase #192 s2 MB + 688 KBTime Limit ExceededScore: 0

Testcase #2017.972 ms3 MB + 752 KBAcceptedScore: 4

Testcase #212 s3 MB + 440 KBTime Limit ExceededScore: 0

Testcase #222 s284 KBTime Limit ExceededScore: 0

Testcase #232 s3 MB + 568 KBTime Limit ExceededScore: 0

Testcase #242 s292 KBTime Limit ExceededScore: 0

Testcase #252 s3 MB + 816 KBTime Limit ExceededScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2026-09-12 09:13:20 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠