TZOJ 5371: C++实验:STL之priority_queue3 优先队列,重载运算符
描述
使用STL中的优先队列,将n个点按照横坐标从小到大顺序排序,如果横坐标相同,按照纵坐标从小到大排序。
部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码。
- C++
int main() { int n; cin>>n; while(n--) { Input(); while(!qu.empty()) { Point p = qu.top(); cout<<p.x<<" "<<p.y<<endl; qu.pop(); } } return 0; }
输入
输入数据有多组,第一行为t,接下来有t组数据。
每组的第一行为正整数n,接下来有n行,每行一个点,包含横坐标和纵坐标,均为整数。
输出
每组输出排序后的所有点,每行一个点。
样例输入
2
3
3 2
2 3
4 1
4
1 2
3 3
1 1
3 2
样例输出
2 3
3 2
4 1
1 1
1 2
3 2
3 3
AC感想:莫名其妙的就AC,先记录下,有很多不懂的地方,比如结构体里重载运算符friend bool operator <(Point a,Point b)改来改去发现这居然是个固定写法,就里面friend删不掉,重载的<也不能用大于号或者空括号代替,具体原因请大佬指教
学到了一点,定义结构体队列priority_queue<Point> qu;,只需要在<>里写结构体名称即可,push的时候也push个结构体进去就行;这么多题队列做下来,感觉对于队列的定义才是最重要的,入队出队之类的方法反而是次要的。
#include<bits/stdc++.h> using namespace std; struct Point{ int x,y; friend bool operator <(Point a,Point b)//好像是固定写法? { if(a.x==b.x)return a.y>b.y;//因为重载运算符operator那里是固定的就只能修改这里的大小于号了 else return a.x>b.x; } }a; priority_queue<Point> qu; void Input() { int m; cin>>m; for(int i=1;i<=m;i++) { cin>>a.x>>a.y; qu.push(a); } } int main() { int n; cin>>n; while(n--) { Input(); while(!qu.empty()) { Point p = qu.top(); cout<<p.x<<" "<<p.y<<endl; qu.pop(); } } return 0; }