解题报告:HDU_6136:Death Podracing (优先队列+循环链表)

题目链接

题意:

n个人以不同的速度在环上顺时针或逆时针移动,每次相遇,移除下标小的,问最后只剩下一个人的时间的分数形式


官方题解及思路:

解题报告:HDU_6136:Death Podracing (优先队列+循环链表)_第1张图片

也不是第一次写循环链表的题了,还是写了好久。。

注意维护循环链表时要同时更新左右指针

代码:

#include

const int N = 1e5+10;
using namespace std;


struct node{
   double val;
   int d,v,id,w,l;
   node(){val=0;}
   node(double a,int b,int c,int i=0,int _w=0,int _l=0){
      val = a;d = b;v = c;id = i;w = _w;l = _l;
   }bool operator <(const node& a)const {
      return val > a.val;
   }
}A[N];

bool cmp(node a,node b){
   return a.dQ;


node oper(int x,int y){
   if(x==y)return node(0,0,0,0,x,y);
   int d , v , w=A[x].id>A[y].id?x:y;
   if(A[x].v>0){
      if(A[y].v<=0){d = A[y].d - A[x].d;v = A[x].v - A[y].v;}
      else {
         if(A[y].v0){d = l + A[x].d - A[y].d;v = A[y].v - A[x].v;}
      else {//A[y].v<=0
         if(A[y].v>A[x].v){d = l + A[x].d - A[y].d;v = A[y].v - A[x].v;}
         else {d = A[y].d - A[x].d;v = A[x].v - A[y].v;}
      }
   }
   return node(1.0*d/v,d,v,0,w,x^y^w);
}

int main()
{
   //freopen("1004.in","r",stdin);
   //freopen("my_1004.out","w",stdout);
   int T;
   scanf("%d",&T);
   while(T--){
      while(!Q.empty())Q.pop();
      scanf("%d%d",&n,&l);
      memset(used,0,sizeof(used));
      for(int i=0;ians.val)ans = tmp;
         used[tmp.l]=true;
         int y,x=tmp.w;
         if(L[tmp.w]==tmp.l){
            y = L[x];
            while(used[y])y=L[y];
            L[x] = y;R[y] = x;
         }else if(R[tmp.w]==tmp.l){
            y = R[x];
            while(used[y])y=R[y];
            R[x] = y;L[y] = x;
         }if(x>y)swap(x,y);
         Q.push(oper(x,y));
      }int gcd = __gcd(ans.d,ans.v);
      printf("%d/%d\n",ans.d/gcd,ans.v/gcd);
   }return 0;
}


你可能感兴趣的:(贪心,数据结构)