zoukankan      html  css  js  c++  java
  • Hdu 5493 合肥网络赛 1010 Queue

    在线求第k大,第一次用二分+树状数组写。。。比赛的时候分治啊,splay啊,主席树啊换来换去,然而以前为什么不知道可以这么写。。。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <cstring>
     5 #include <cmath>
     6 #include <vector>
     7 #include <set>
     8 #define inf 1000000007
     9 #define maxn 100002
    10 
    11 using namespace std;
    12 
    13 int n;
    14 int seq[maxn];
    15 
    16 struct peo
    17 {
    18     int h,x;
    19     friend bool operator <(peo a, peo b)
    20     {
    21         return a.h<b.h;
    22     }
    23 }a[maxn];
    24 
    25 struct bit
    26 {
    27     int b[maxn];
    28     int num;
    29     void add(int x,int z)
    30     {
    31         for (int i=x;i<=num;i+=(i&-i)) b[i]+=z;
    32     }
    33     int ask(int x)
    34     {
    35         int tmp=0;
    36         for (int i=x;i;i-=(i&-i)) tmp+=b[i];
    37         return tmp;
    38     }
    39     void init(int n)
    40     {
    41         num=n;
    42         memset(b,0,sizeof(b));
    43     }
    44 }s;
    45 
    46 int main()
    47 {
    48     int Case;
    49     scanf("%d",&Case);
    50     for (int o=1;o<=Case;o++)
    51     {
    52         int flag=1;
    53         scanf("%d",&n);
    54         for (int i=1;i<=n;i++)
    55             scanf("%d%d",&a[i].h,&a[i].x);
    56         sort(a+1,a+n+1);
    57         s.init(n);
    58         for (int i=1;i<=n;i++) s.add(i,1);
    59 
    60         for (int i=1;i<=n;i++)
    61         {
    62             int tmp=inf, k=a[i].x;
    63             if (1<=k+1 && k+1<=n-i+1) tmp=min(tmp,k+1);
    64             if (1<=n-i-k+1 && n-i-k+1<=n-i+1) tmp=min(tmp,n-i-k+1);
    65             if (tmp==inf)
    66             {
    67                 flag=0;
    68                 break;
    69             }
    70             int l=1,r=n, now;
    71             while (l<=r)
    72             {
    73                 int mid=(l+r)>>1;
    74                 if (s.ask(mid)>=tmp)
    75                 {
    76                     now=mid;
    77                     r=mid-1;
    78                 }
    79                 else
    80                     l=mid+1;
    81             }
    82             seq[now]=a[i].h;
    83             s.add(now,-1);
    84         }
    85         printf("Case #%d: ",o);
    86         if (!flag) printf("impossible
    ");
    87         else
    88             for (int i=1;i<=n;i++)
    89                 if (i<n) printf("%d ",seq[i]);
    90                 else printf("%d
    ",seq[i]);
    91     }
    92     return 0;
    93 }
    queue
  • 相关阅读:
    bzoj3786 星系探索
    [JSOI2008]火星人
    [NOI2005]维护数列
    [POI2008]砖块Klo
    郁闷的出纳员
    [HNOI2002]营业额统计
    [BZOJ1651][Usaco2006 Feb]Stall Reservations 专用牛棚
    [BZOJ2124]等差子序列
    [BZOJ3038]上帝造题的七分钟2
    [BZOJ1711][Usaco2007 Open]Dining吃饭
  • 原文地址:https://www.cnblogs.com/zig-zag/p/4852574.html
Copyright © 2011-2022 走看看