记录编号 422339 评测结果 AAAAAAAAAA
题目名称 [HNOI 2004] 宠物收养所 最终得分 100
用户昵称 GravatarHeHe 是否通过 通过
代码语言 C++ 运行时间 0.069 s
提交时间 2017-07-09 16:38:32 内存使用 0.82 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

namespace IO{ 
    inline char getc(void);
    inline int in(void);
    inline void write(int x);
    inline void write_all(void);

    char ops[1 << 18], *opt = ops, *const opt_end = ops + (1 << 18);

    inline char getc(void) { 
        static char buf[1 << 18], *fs, *ft;
        return (fs == ft && (ft = (fs = buf) + fread(buf, 1, 1 << 18, stdin)), fs == ft) ? EOF : *fs++;
    }

    inline int in(void) { 
        register char tmp = getc();
        register int res = 0;
        register bool f = true;

        while(!isdigit(tmp) && tmp ^ '-') tmp = getc();
        if(tmp == '-') f = false, tmp = getc();
        while(isdigit(tmp))
            res = ((res + (res << 2)) << 1) + (tmp ^ 48),
            tmp = getc();
        if(f) return res;
        return ~res + 1;
    }

    inline void write(int x) { 
        static char *p = new char[20]();
        if(x & 0x80000000) { 
            *(opt++) = '-';
            if(opt == opt_end) write_all();
            x = -x;
        }

        do{ 
            *(++p) = (x % 10) | 0x30;
            x /= 10;
        }while(x);

        while(*p) { 
            *(opt++) = *(p--);
            if(opt == opt_end) write_all();
        }

        *(opt++) = ' ';
        if(opt == opt_end) write_all();
        return ;
    }

    inline void write_all(void) { 
        fwrite(ops, 1, opt - ops, stdout);
        opt = ops;
        return ;
    }
}
using namespace IO;

const int INF = 0x6fffffff;
const int MOD = 1e6;

struct NODE{ 
    int s;
    int height, size;
    NODE *ls, *rs;

    NODE() { ;}
    NODE(int x) { 
        s = x;
        height = size = 1;
        ls = rs = NULL;
    }

    int hgt(void) { 
        if(this) return height;
        return 0;
    }

    int siz(void) { 
        if(this) return size;
        return 0;
    }

    void update(void) { 
        height = max(ls->hgt(), rs->hgt()) + 1;
        size = ls->siz() + rs->siz() + 1;
    }
};

inline int Abs(int x);
inline void Left(NODE *&k2);
inline void Right(NODE *&k2);
void Insert(NODE *&node, int x);
void Delete(NODE *&node, int x);
inline int lower_bound(NODE *node, int x);
inline int upper_bound(NODE *node, int x);

NODE *root0, *root1;
int N, arg, temp1, temp2, ANS;

int main() { 
#ifndef LOCAL
    freopen("pet.in", "r", stdin);
    freopen("pet.out", "w", stdout);
#endif
    N = in();

    for(int i = 1; i <= N; ++i) { 
        if(in()) { 
            arg = in();
            if(root0) { 
                temp1 = lower_bound(root0, arg);
                temp2 = upper_bound(root0, arg);
                if(arg - temp1 <= temp2 - arg) { 
                    Delete(root0, temp1);
                    (ANS += arg - temp1) %= MOD;
                } else { 
                    Delete(root0, temp2);
                    (ANS += temp2 - arg) %= MOD;
                }
            } else Insert(root1, arg);
        } else { 
            arg = in();
            if(root1) { 
                temp1 = lower_bound(root1, arg);
                temp2 = upper_bound(root1, arg);
                if(arg - temp1 <= temp2 - arg) { 
                    Delete(root1, temp1);
                    (ANS += arg - temp1) %= MOD;
                } else { 
                    Delete(root1, temp2);
                    (ANS += temp2 - arg) %= MOD;
                }
            } else Insert(root0, arg);
        }
    }

    printf("%d", ANS);
    return 0;
}

inline void Left(NODE *&k2) { 
    register NODE *k1 = k2->ls;
    k2->ls = k1->rs;
    k1->rs = k2;

    k2->update(); k1->update();
    k2 = k1;
    return ;
}

inline void Right(NODE *&k2) { 
    register NODE *k1 = k2->rs;
    k2->rs = k1->ls;
    k1->ls = k2;

    k2->update(); k1->update();
    k2 = k1;
    return ;
}

inline int Abs(int x) { 
    if(x & 0x80000000) return ~x + 1;
    return x;
}

void Insert(NODE *&node, int x) { 
    if(node) { 
        if(x < node->s) { 
            Insert(node->ls, x);
            if(node->ls->hgt() - node->rs->hgt() == 2) { 
                if(node->ls->rs->hgt() > node->ls->ls->hgt()) Right(node->ls);
                Left(node);
            } else node->update();
        } else { 
            Insert(node->rs, x);
            if(node->rs->hgt() - node->ls->hgt() == 2) { 
                if(node->rs->ls->hgt() > node->rs->rs->hgt()) Left(node->rs);
                Right(node);
            } else node->update();
        }
    } else node = new NODE(x);
    return ;
}

void Delete(NODE *&node, int x) { 
    if(x ^ node->s) { 
        if(x < node->s) { 
            Delete(node->ls, x);
            if(node->rs->hgt() - node->ls->hgt() == 2) { 
                if(node->rs->ls->hgt() > node->rs->rs->hgt()) Left(node->rs);
                Right(node);
            } else node->update();
        } else { 
            Delete(node->rs, x);
            if(node->ls->hgt() - node->rs->hgt() == 2) { 
                if(node->ls->rs->hgt() > node->ls->ls->hgt()) Right(node->ls);
                Left(node);
            } else node->update();
        }
    } else { 
        if(node->ls && node->rs) { 
            register NODE *temp = node->rs;
            while(temp->ls) temp = temp->ls;
            node->s = temp->s;
            Delete(node->rs, node->s);
            
            if(node->ls->hgt() - node->rs->hgt() == 2) { 
                if(node->ls->rs->hgt() > node->ls->ls->hgt()) Right(node->ls);
                Left(node);
            } else node->update();
        } else { 
            register NODE *temp = node;
            if(node->ls) node = node->ls;
            else node = node->rs;
            delete temp;
        }
    }
    return ;
}

inline int lower_bound(NODE *node, int x) { 
    register int res = -INF;

    while(node) { 
        if(x == node->s) return x;
        else if(x < node->s) node = node->ls;
        else { 
            res = node->s;
            node = node->rs;
        }
    }

    return res;
}

inline int upper_bound(NODE *node, int x) { 
    register int res = INF;

    while(node) { 
        if(x == node->s) return x;
        else if(x > node->s) node = node->rs;
        else { 
            res = node->s;
            node = node->ls;
        }
    }

    return res;
}