HDU 5360 (优先队列)

  链接:http://acm.hdu.edu.cn/showproblem.php?pid=5360

 

  用优先队列进行处理,对于struct来讲,需要重载一下小于号。。。(又学到了新知识。)网上大神太多。

 

  

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <queue>
 5 using  namespace std;
 6 
 7 struct NODE
 8 {
 9     int x,y;
10     int num;
11     bool operator < (const NODE &a) const
12     {
13        return y>a.y;//最小值优先
14     }
15 }node[100005];
16 bool cmp(const NODE&a, const NODE&b)
17 {
18     if(a.x==b.x) return a.y<b.y;
19     else return a.x<b.x;
20 }
21 
22 
23 int n;
24 int ans[100005];
25 int vis[100005];
26 int main()
27 {
28     int t;
29     scanf ("%d",&t);
30     while (t--)
31     {
32         memset(ans,0,sizeof(ans));
33         memset(vis,0,sizeof(vis));
34         scanf ("%d",&n);
35         for(int i=1;i<=n;i++)
36         {
37             scanf ("%d",&node[i].x);
38             node[i].num=i;
39         }
40         for(int i=1;i<=n;i++)
41             scanf ("%d",&node[i].y);
42         sort(node+1,node+n+1,cmp);
43         int num=0;
44         if(node[1].x>0) {
45             printf("%d\n",num);;
46             for(int i=1;i<=n;i++)
47                 printf("%d ",i);
48             printf("\n");
49         }
50         else
51         {
52             priority_queue<NODE> q;
53             q.push(node[1]);
54             int i=2,k1=1,k2=n;
55             while (!q.empty())
56             {
57                 for(;i<=n&&node[i].x==num;i++)
58                     q.push(node[i]);
59                 while (!q.empty())
60                 {
61                     if(q.top().y>=num)
62                     {
63                         ans[k1++]=q.top().num;
64                         num++;
65                         q.pop();
66                         break;
67                     }
68                     else
69                         ans[k2--]=q.top().num;
70                     q.pop();
71                 }
72                 for(;i<=n&&node[i].x==num;i++)
73                     q.push(node[i]);
74             }
75             for(;i<=n;i++)
76                 ans[k2--]=node[i].num;
77             printf("%d\n",num);
78             for(int i=1;i<=n;i++)
79                 printf("%d%c",ans[i],i==n?'\n':' ');
80         }
81     }
82     return 0;
83 }

感谢queuelovestack

posted on 2015-08-10 12:45  Bei_insomia  阅读(101)  评论(0编辑  收藏  举报

导航