您的位置:首页 > 理论基础 > 计算机网络

Hdu 5493 合肥网络赛 1010 Queue

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

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <set>
#define inf 1000000007
#define maxn 100002

using namespace std;

int n;
int seq[maxn];

struct peo
{
int h,x;
friend bool operator <(peo a, peo b)
{
return a.h<b.h;
}
}a[maxn];

struct bit
{
int b[maxn];
int num;
void add(int x,int z)
{
for (int i=x;i<=num;i+=(i&-i)) b[i]+=z;
}
int ask(int x)
{
int tmp=0;
for (int i=x;i;i-=(i&-i)) tmp+=b[i];
return tmp;
}
void init(int n)
{
num=n;
memset(b,0,sizeof(b));
}
}s;

int main()
{
int Case;
scanf("%d",&Case);
for (int o=1;o<=Case;o++)
{
int flag=1;
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d%d",&a[i].h,&a[i].x);
sort(a+1,a+n+1);
s.init(n);
for (int i=1;i<=n;i++) s.add(i,1);

for (int i=1;i<=n;i++)
{
int tmp=inf, k=a[i].x;
if (1<=k+1 && k+1<=n-i+1) tmp=min(tmp,k+1);
if (1<=n-i-k+1 && n-i-k+1<=n-i+1) tmp=min(tmp,n-i-k+1);
if (tmp==inf)
{
flag=0;
break;
}
int l=1,r=n, now;
while (l<=r)
{
int mid=(l+r)>>1;
if (s.ask(mid)>=tmp)
{
now=mid;
r=mid-1;
}
else
l=mid+1;
}
seq[now]=a[i].h;
s.add(now,-1);
}
printf("Case #%d: ",o);
if (!flag) printf("impossible\n");
else
for (int i=1;i<=n;i++)
if (i<n) printf("%d ",seq[i]);
else printf("%d\n",seq[i]);
}
return 0;
}


queue
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: