• bzoj3685


    权值线段树。。。。各种脑残错误

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<cmath>
      4 #include<ctime>
      5 #include<cstdlib>
      6 #include<iostream>
      7 #include<algorithm>
      8 #define l(a) ((a)<<1)
      9 #define r(a) (((a)<<1)+1)
     10 #define clr(a,x) memset(a,x,sizeof(a))
     11 #define rep(i,l,r) for(int i=l;i<r;i++)
     12 typedef long long ll;
     13 using namespace std;
     14 int read()
     15 {
     16     char c=getchar();
     17     int ans=0,f=1;
     18     while(!isdigit(c)){
     19         if(c=='-') f=-1;
     20         c=getchar();
     21     }
     22     while(isdigit(c)){
     23         ans=ans*10+c-'0';
     24         c=getchar();
     25     }
     26     return ans*f;
     27 }
     28 const int maxn=1000005,inf=0x3fffffff;
     29 struct node{
     30     int l,r,mx,mn;
     31     bool v;
     32 };
     33 node x[maxn<<2];
     34 int f[maxn];
     35 void maintain(int a)
     36 {    
     37     x[a].v=x[l(a)].v|x[r(a)].v;
     38     x[a].mx=max(x[l(a)].mx,x[r(a)].mx);
     39     x[a].mn=min(x[l(a)].mn,x[r(a)].mn);
     40 }
     41 void update(int a)
     42 {
     43     maintain(a);
     44     if(a!=1) update(a>>1);
     45 }
     46 void build(int a,int l,int r)
     47 {
     48     x[a].l=l,x[a].r=r,x[a].v=0,x[a].mx=0,x[a].mn=inf;
     49     if(l==r){
     50         f[l]=a;
     51         return;
     52     }
     53     int mid=(l+r)>>1;
     54     build(l(a),l,mid);
     55     build(r(a),mid+1,r);
     56 }
     57 int find(int k)
     58 {
     59     if(x[f[k]].v) return 1;
     60     return -1;
     61 }
     62 void insert(int k)
     63 {
     64     if(find(k)==-1){
     65         x[f[k]].v=1;
     66         x[f[k]].mx=x[f[k]].mn=k;
     67         update(f[k]>>1);
     68     }    
     69 }
     70 void del(int k)
     71 {
     72     if(find(k)==1){
     73         x[f[k]].v=0;
     74         x[f[k]].mx=0;
     75         x[f[k]].mn=inf;
     76         update(f[k]>>1);
     77     }
     78 }
     79 int pre(int a,int k)
     80 {    
     81     if(!x[a].v) return 0;
     82     if(x[a].l==x[a].r) return (x[a].l<k)?x[a].l:0;
     83     int mid=(x[a].l+x[a].r)>>1;
     84     if(mid>=k) return pre(l(a),k);     
     85     int ans=pre(r(a),k);
     86     return (!ans)?pre(l(a),k):ans; 
     87 }
     88 int suc(int a,int k)
     89 {    
     90     if(!x[a].v) return 0;
     91     if(x[a].l==x[a].r) return (x[a].l>k)?x[a].l:0;
     92     int mid=(x[a].l+x[a].r)>>1;
     93     if(k>=mid) return suc(r(a),k);     
     94     int ans=suc(l(a),k);
     95     return (!ans)?suc(r(a),k):ans; 
     96 }
     97 int main()
     98 {    
     99     int n=read(),m=read();
    100     build(1,1,n+1);
    101     while(m--){
    102         int opt=read(),t;
    103         switch(opt){
    104             case 1:t=read();insert(++t);break;
    105             case 2:t=read();del(++t);break;
    106             case 3:printf("%d
    ",(x[1].mn==inf)?-1:(x[1].mn-1));break;
    107             case 4:printf("%d
    ",x[1].mx-1);break;
    108             case 5:t=read();printf("%d
    ",pre(1,++t)-1);break;
    109             case 6:t=read();printf("%d
    ",suc(1,++t)-1);break;
    110             case 7:t=read();printf("%d
    ",find(++t));break;
    111         }
    112     }
    113     return 0;
    114 }
    View Code

    3685: 普通van Emde Boas树

    Time Limit: 9 Sec  Memory Limit: 128 MB
    Submit: 619  Solved: 217
    [Submit][Status][Discuss]

    Description

    设计数据结构支持:
    1 x  若x不存在,插入x
    2 x  若x存在,删除x
    3    输出当前最小值,若不存在输出-1
    4    输出当前最大值,若不存在输出-1
    5 x  输出x的前驱,若不存在输出-1
    6 x  输出x的后继,若不存在输出-1
    7 x  若x存在,输出1,否则输出-1

    Input

    第一行给出n,m 表示出现数的范围和操作个数
    接下来m行给出操作
    n<=10^6,m<=2*10^6,0<=x<n

    Output

     

    Sample Input

    10 11
    1 1
    1 2
    1 3
    7 1
    7 4
    2 1
    3
    2 3
    4
    5 3
    6 2


    Sample Output

    1
    -1
    2
    2
    2
    -1

    HINT

     

    Source

    [Submit][Status][Discuss]
  • 相关阅读:
    毕业设计:文献参考(六)
    毕业设计:文献参考(五)
    稀疏数组搜索(leetcode)
    寻找重复数(leetcode)
    联通网络的操作次数(leetcode)
    Flutter 混合开发基础
    浅谈 Serverless 开发和应用
    基于 Qt Quick Plugin 快速构建桌面端跨平台组件
    Android 设备音视频兼容性适配
    RTC 系统音频弱网对抗技术发展与实践
  • 原文地址:https://www.cnblogs.com/chensiang/p/4668317.html
Copyright © 2020-2023  润新知