hdu 5306 优先队列

用到优先队列

 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<queue>
 7 #define N 1000005
 8 using namespace std;
 9 struct Node
10 {
11     int r,l,id;
12     bool operator <(Node a) const{return l>a.l;}//为了优先队列的优先级的排列,>队列顶端是最小的,反之是最大的
13 }soda[N];
14 int cmp(Node a,Node b)
15 {
16     return a.r<b.r;
17 }
18 int vis[1000005];
19 vector<int> ans;
20 priority_queue<Node> que;
21 int main()
22 {
23     int t;
24     cin>>t;
25     while(t--)
26     {
27         int n;
28         cin>>n;
29         memset(vis,0,sizeof(vis));
30         ans.clear();
31         while(!que.empty()) que.pop();
32         for(int i=0;i<n;i++)
33         {
34             cin>>soda[i].r;
35             soda[i].id=i+1;
36         }
37         for(int i=0;i<n;i++) cin>>soda[i].l;
38         sort(soda,soda+n,cmp);
39         int num=0;
40         int id=0;
41         for(int i=0;i<n;i++)
42         {
43             while(id<n)
44             {
45                 if(soda[id].r<=num)
46                 {
47                     que.push(soda[id]);
48                     id++;
49                 }
50                 else break;
51             }
52             while(!que.empty())
53             {
54                 if(que.top().l>=num)
55                 {
56                     ans.push_back(que.top().id);
57                     vis[que.top().id]=1;
58                     que.pop();
59                     num++;
60                     break;
61                 }
62                 else que.pop();
63             }
64         }
65         int cnt = 0 ;
66         int i;
67         printf("%d\n", ans.size()) ;
68         for(i = 0 ; i < ans.size() ; i++)
69         {
70             cnt++ ;
71             if( cnt == n )
72                 printf("%d\n", ans[i]) ;
73             else
74                 printf("%d ", ans[i]) ;
75         }
76         for(i = 1 ; i <= n ; i++)
77         {
78             if( vis[i] ) continue ;
79             cnt++ ;
80             if( cnt == n )
81                 printf("%d\n", i) ;
82             else
83                 printf("%d ", i) ;
84         }
85     }
86     return 0;
87
88 }
时间: 2024-10-20 14:00:45

hdu 5306 优先队列的相关文章

hdu 5306 Gorgeous Sequence(区间最值更新+求和)

题目链接:hdu 5306 Gorgeous Sequence 题意: 给你一个序列,有三种操作. 0 x y t:将[x,y]的数取min(a[i],t) 1 x y:求[x,y]的最大值 2 x y:求[x,y]的区间和 题解: 吉老师的课件题:传送门 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;i++) 3 #define ls l,m,rt<<1 4 #define rs m+1,r,rt

hdu 5306 Gorgeous Sequence(线段树)

题目链接:hdu 5306 Gorgeous Sequence 和普通的线段树一样一个标记值T,然后另外加一个C值记录以u为根节点的子树下有多少个叶子节点被T值控制.每次修改时,dfs到叶子节点之后在修改该节点.维护sum值时只要额外加上T值控制下的节点.加了个输入外挂,时间少了将近1000ms. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const in

HDU 5700 优先队列(或者multiset) 或 线段树

题目大意:有n个区间,求k个区间,使得这k个区间相交的区间内数字之和最大.数列的数字均>=0 优先队列思路: 按照左端点sort,然后枚举左端点,假设他被覆盖过k次,然后用优先队列来维护最右端即可. //看看会不会爆int!数组会不会少了一维! //取物问题一定要小心先手胜利的条件 #include <bits/stdc++.h> using namespace std; #pragma comment(linker,"/STACK:102400000,102400000&qu

HDU 1058 优先队列or堆

本来应当是一道优先队列或者堆的题 因为每个数都应该是已经得到的数*2 *3 *5 *7而得到的 但是 2*7 大于 3*2 这就必须保证每次取得都是没有拿过的最小的数 但是它主动降低难度在样例里卖了个萌 n的范围是1~5842 而第5842在样例里给出了..所以我们在取出一个数 求出它的*2 *3 *5 *7的时候做一下判断 如果大于最后一位就直接break 因为相乘的顺序在 可以省一点时间 在判断某个数是否出现过的时候 开不出那么大的vis数组 所以直接for循环从ans数组中寻找 所幸没有超

hdu 5040 优先队列BFS+剪枝

(北京网络赛09题)题意:给一矩阵(图),里面有起点,终点,还有探照灯(每个有初始朝向,每秒顺时针转90度),前面有灯或者自己被灯照着,移动就要花3秒,求起点到终点最短时间. 用一个数组三维数组记录一下,用来当前位置当前时间%4有没有灯,然后优先队列(时间短的在前面),搜索即可.考虑到可以来回走或者原地等,不能简单判重剪枝:每个地方最多是4种状态!就是4秒之后就全图状态回到一样!所以若当前状态(时间%4)下来过就不用来了. #include<iostream> #include<vect

HDU 3619 优先队列+状压+bfs

Heroes of Might and Magic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 170    Accepted Submission(s): 74 Problem Description After a very long journey and uncountable number of uphill battles

HDU 4006 优先队列

The kth great number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)Total Submission(s): 10390    Accepted Submission(s): 4153 Problem Description Xiao Ming and Xiao Bao are playing a simple Numbers game. In a roun

hdu 5818 (优先队列) Joint Stacks

题目:这里 题意: 两个类似于栈的列表,栈a和栈b,n个操作,push a x表示把数x放进a栈的栈底,pop b 表示将栈b的栈顶元素取出输出,并释放这个栈顶元素,merge a b表示把后面的那个 栈里的元素全部压进前面的那个栈里面,并且压入后前面的栈的所有元素按其进栈顺序排列然后后面的栈变为了空. push和pop操作都还好,就是优先队列或者栈的操作,主要是merge操作,如果啊按照题目来模拟每次将后面的栈元素取出放入前面的栈,可能会超时,而超时的主要因素是每次都将 元素多的栈压入了元素少

hdu 1026(优先队列+路径输出)

Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 17171    Accepted Submission(s): 5495Special Judge Problem Description The Princess has been abducted by the BEelzebub