CDQZ Challenge 8
                                            
 10635 단어  OI-데이터 구조
                    
(1) 숫자 를 삽입 합 니 다. 존재 하면 무시 합 니 다.
(2) 하나의 수 를 삭제 하고 존재 하지 않 으 면 무시 합 니 다.
(3) 수열 중 임의의 두 수의 차 절대 치 의 최소 치 를 구한다.
첫 줄 의 정수 N 과 M 두 개 를 입력 하 십시오.두 번 째 줄 N 의 정 수 는 이 수열 을 나타 낸다.중복 되 는 숫자 가 있 으 면 하나 로 간주 하도록 주의 하 세 요.다음 M 줄 은 줄 마다 시작 하 는 문자 입 니 다. 이 문자 가 'I' 라면 삽입 동작 을 표시 하고 다음 정수 x 는 숫자 x 를 삽입 하 는 것 을 표시 합 니 다.이 문자 가 'D' 이면 삭제 동작 을 표시 하고 다음 정수 x 는 숫자 x 를 삭제 하 는 것 을 표시 합 니 다.이 문자 가 'Q' 라면 질문 동작 을 표시 합 니 다. 수열 에 있 는 임의의 두 수의 차 이 를 구 하 는 절대 값 의 최소 값 입 니 다. 최소 두 개의 숫자 가 존재 하지 않 으 면 출력 - 1.출력 은 모든 질문 동작 에 대해 한 줄 을 따로 출력 하여 답 을 표시 합 니 다.샘플 입력 5 3 1 9 3 7 5 Q I 2 Q 샘플 출력 2 1 알림 1 < = N < = 10 ^ 5, 1 < = M < = 10 ^ 5, 입력 보증 합 법 적 이 며 모든 정 수 는 기호 32 비트 정형 으로 저장 할 수 있 습 니 다.
문제 풀이: treap / splay + 더미, treap 에 하나의 수 를 추가 할 때마다 더미 에 두 개의 요 소 를 추가 합 니 다. 현재 수 - 전구, 후계 - 현재 수, 하나의 요 소 를 삭제 합 니 다: 후계 - 전구;삭제 하면 거꾸로.쌓 기 우선 대기 열 로 이 루어 집 니 다. 삭제 할 수 없습니다. 맵 으로 표시 할 수 있 습 니 다. 질문 할 때 판단 하면 됩 니 다.
메모: 원래 수열 뒤에 새로운 요 소 를 삽입 하려 면 배열 을 많이 열 어야 합 니 다. 그렇지 않 으 면 오전 에 orz 가 없습니다.
#includereturn t;
    }
    else {
        int t=Insert(node[k].l,x);
        if (node[node[k].l].rndreturn t;
    }
}
bool del(int &k,int x) {
    if (k==0) return false;
    if (x==node[k].v) {
        bool j=true;
        if (!node[k].l||!node[k].r) k=node[k].l+node[k].r;
        else if (node[node[k].l].rndelse lturn(k),j=del(k,x);
        return j;
    }
    else if (x>node[k].v) return del(node[k].r,x);
    else return del(node[k].l,x);
}
inline void pro(int k,int x) {
    while (k) {
        if (node[k].velse k=node[k].l;
    }
}
inline void sub(int k,int x) {
    while (k) {
        if (node[k].v>x) suc=k,k=node[k].l;
        else k=node[k].r;
    }
}
inline void update1(int val) {
    pre=0,suc=0;
    pro(root,val),sub(root,val);
    if (pre) q.push(val-node[pre].v);
    if (suc) q.push(node[suc].v-val);
    if (pre&&suc) ++d[node[suc].v-node[pre].v];
}
inline void update2(int val) {
    pre=0,suc=0;
    pro(root,val),sub(root,val);
    if (pre) ++d[val-node[pre].v];
    if (suc) ++d[node[suc].v-val];
    if (pre&&suc) q.push(node[suc].v-node[pre].v);
}
inline void mt() {
    while (1) {
        if (q.empty()) {puts("-1");return ;}
        int t=q.top();
        if (d[t])
            while (d[t]) q.pop(),--d[t];//delete
        if (q.empty()) {puts("-1");return ;}
        if (t==q.top()) {printf("%d
",t);return ;}
    }
}
int main() {
//  freopen("C8.in","r",stdin);
    n=read(),m=read();
    tim=0,root=0,d.clear();
    for (register int i=1;i<=n;++i) {
        int val=read();
        bool j=Insert(root,val);
        if (j) update1(val);
    }
    for (register int i=1;i<=m;++i) {
        char ss;
        while (!isalpha(ss=getchar()));
        if (ss=='I') {
            int val=read();
            bool j=Insert(root,val);
            if (j) update1(val);
        }
        else if (ss=='D') {
            int val=read();
            bool j=del(root,val);
            if (j) update2(val);
        }
        else mt();
    }
    return 0;
}    이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
CDQZ Challenge 20인터넷 주 소 를 제출 할 때 필요 하 다 면 개인 편지 본 을 보 내 주세요.1020: Challenge 20 보기 제출 통계 질문 총 시간 제한: 10000 ms 단일 테스트 포인트 시간 제한: 1500 ms 메...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.