[恢]hdu 1896

2011-12-24 21:46:41

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1896

题意:n个石头,每个在位置p,一个属性d。从最左边开始往右走,遇到一个石头,如果是第奇数次遇到,就把他往前仍d米,偶数次遇到就越过。问最后最远的石头距离起点多少米。

mark:10w个石头,如果不扔 第一次会越过5w个,还剩5w个。依次分析,最后其实总操作不到20w。用优先队列,O(nlgn)。

不会用STL,用手写堆实现了一个优先队列,居然1A。

代码:

# include <stdio.h>


typedef struct node{
int p, d ;
}node ;


node heap[200000] ;
int len = 1 ;


int isless(node a, node b)
{
if (a.p != b.p) return a.p < b.p ;
else return a.d < b.d ;
}


void enqueue(int p, int d)
{
int r ;
node t ;
heap[len].p = p, heap[len].d = d ;
r = len ++ ;
while (r != 1)
{
if (isless(heap[r], heap[r/2]))
t = heap[r], heap[r] = heap[r/2], heap[r/2] = t ;
else break ;
r /= 2 ;
}
}

void heapify(int r)
{
node t = heap[r] ;
if (r*2 < len && isless (heap[r*2], t))
t = heap[r*2] ;
if (r*2+1 < len && isless (heap[r*2+1], t))
t= heap[r*2+1] ;
if (t.p==heap[r].p && t.d == heap[r].d) return ;
if (t.p==heap[r*2].p && t.d == heap[r*2].d)
{
heap[r*2] = heap[r] ;
heap[r] = t ;
heapify(r*2) ;
}
else
{
heap[r*2+1] = heap[r] ;
heap[r] = t ;
heapify(r*2+1) ;
}
}


void dequeue(int *pp, int *pd)
{
node t ;
t = heap[1], heap[1] = heap[len-1], heap[len-1] = t ;
len-- ;
heapify(1) ;
*pp = t.p, *pd = t.d ;
}


int empty()
{
return (len == 1) ;
}


int max(int a, int b){return a>b?a:b;}


int main ()
{
int T, n, p, d, cnt, ans ;
scanf ("%d", &T) ;
while (T--)
{
scanf ("%d", &n) ;
while (n--)
{
scanf ("%d%d", &p, &d) ;
enqueue(p, d) ;
}
cnt = 1 ;
ans = 0 ;
while (!empty())
{
dequeue(&p, &d) ;
ans = max(ans, p) ;
if (cnt&1)
{
p+=d;
enqueue(p,d) ;
}
cnt++ ;
}
printf ("%d\n", ans) ;
}
}



原文地址:https://www.cnblogs.com/lzsz1212/p/2315340.html