zoukankan      html  css  js  c++  java
  • 【set】【Splay】【pb_ds】bzoj1208 [HNOI2004]宠物收养所

    每次来的如果是人,且宠物数不为零,就从宠物中选出一个与其差距最小的,累加答案;若为零,就把他放入另一个集合里。

    如果是宠物,则同上。
    各种平衡树都可过,我蛋疼地用了pb_ds。
    Code:
     1 #include<cstdio>
     2 #include<ext/pb_ds/assoc_container.hpp>
     3 #include<ext/pb_ds/tree_policy.hpp>
     4 using namespace std;
     5 using namespace __gnu_cxx;
     6 using namespace __gnu_pbds;
     7 tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> T[2];
     8 typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>::iterator ITER;
     9 int n,op,a,ans;
    10 inline bool empty(const int &x){return T[x].lower_bound(-2147483647)==T[x].end() ? true : false;}
    11 inline int Abs(const int &x){return x<0 ? (-x) : x;}
    12 int main()
    13 {
    14     scanf("%d",&n);
    15     for(int i=1;i<=n;i++)
    16       {
    17           scanf("%d%d",&op,&a);
    18           if(empty(op^1))
    19             T[op].insert(a);
    20           else
    21             {
    22                 ITER it=T[op^1].lower_bound(a);
    23                 if((*it)==a)
    24                   T[op^1].erase(it);
    25                 else
    26                   {
    27                       ITER it2=T[op^1].upper_bound(a);
    28                       if(it==T[op^1].begin())
    29                         {
    30                             ans=(ans+Abs(a-(*it2)))%1000000;
    31                             T[op^1].erase(it2);
    32                             continue;
    33                         }
    34                       it--;
    35                       if(it2==T[op^1].end())
    36                         {
    37                             ans=(ans+Abs(a-(*it)))%1000000;
    38                             T[op^1].erase(it);
    39                             continue;
    40                         }
    41                       if(Abs(a-(*it2))<Abs(a-(*it)))
    42                         {
    43                             ans=(ans+Abs(a-(*it2)))%1000000;
    44                             T[op^1].erase(it2);
    45                             continue;
    46                         }
    47                       else
    48                         {
    49                             ans=(ans+Abs(a-(*it)))%1000000;
    50                             T[op^1].erase(it);
    51                         }
    52                   }
    53             }
    54       }
    55     printf("%d
    ",ans);
    56     return 0;
    57 }
    ——The Solution By AutSky_JadeK From UESTC 转载请注明出处:http://www.cnblogs.com/autsky-jadek/
  • 相关阅读:
    printf语句中%p ,%#x区别
    Ant执行一个含有main方法的class文件
    aix 扩展文件系统
    ORA-01653:表空间扩展失败的问题(开启表空间自动扩展)
    oracle创建表空间语句分解
    Oracle10g/11g 在SUSE/RHEL上的安装与配置
    15个实用的Linux find命令示例
    suse安装软件命令
    如何把.rar文件隐藏在一个图片内
    windows 7 中将“我的电脑”锁定到任务栏
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/3959452.html
Copyright © 2011-2022 走看看