优先队列重载<运算符

https://vjudge.net/problem/POJ-3190

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
struct Node{
    int x, y;
    int id;
    bool operator<(const Node &a)const{
        return y > a.y;
    }
}node[50010];
int n, maxm = -INF, b[50010];
bool cmp(const Node a, const Node b)
{
    if(a.x != b.x)
        return a.x<b.x;
    return a.y<b.y;
}
int main()
{
    scanf("%d", &n);
    int ans = 1;
    for(int i = 0; i < n; i++){
        scanf("%d%d", &node[i].x, &node[i].y);
        node[i].id=i+1;
    }
    sort(node, node+n, cmp);
    priority_queue<Node> q;
    q.push(node[0]);
    b[node[0].id] = ans;
    for(int i = 1; i < n; i++){
        Node t = q.top();
        if(node[i].x <= t.y){
            q.push(node[i]);
            ans++;
            b[node[i].id] = ans;
            //maxm = max(maxm, ans);
        }
        else if(node[i].x > t.y){
            q.pop();
            q.push(node[i]);
            b[node[i].id] = b[t.id];
            //cout << b[t.id] << "t";
        }
    }
    printf("%d\n", ans);
    for(int i = 1; i <= n; i++){
        printf("%d\n", b[i]);
    }

    return 0;
} 

原文地址:https://www.cnblogs.com/Surprisezang/p/9000373.html

时间: 2024-10-17 00:54:03

优先队列重载<运算符的相关文章

优先队列重载运算符&lt; 以及初始化列表

优先队列定义 priority_queue<int, vector<int>, greater<int> >pq; 优先队列重载<运算符 在结构体中定义一个 friend bool operator<(node n1,node n2) return n1.elem>n2.elem; 这是根据node结构体中的elem升序构建的一个操作符 如果想要降序就把>换成< 初始化列表 struct heap { int id; int dist; h

简单重载运算符in priority_queue By cellur925

我们都知道priority_queue是大根堆. 一.变成小根堆 法一:把元素的相反数丢进堆中 法二 priority_queue<int,vector<int>,greater<int> >q; 二.重载运算符 有时候我们的优先队列中的元素可能是结构体类型的.这时候我们可能需要重载一下运算符. 比如这样 struct cellur{ int val,num; }; priority_queue<cellur>q; bool operator < (c

重载运算符语法讲解

重载运算符 这篇随笔我来讲解一下C++语言中重载运算符的相关知识. 一.重载运算符的用途 这是一个比较哲学的问题:我们为什么要重载运算符? 理由就是,我们C++语言中已经给出的运算符(包括算数运算符和逻辑运算符)只是针对C++语言中已经给定的数据类型进行运算,假如我们想要对我们的自定义数据类型进行运算的话,则需要重载运算符,我们可以把重载运算符理解成对已有的运算符的一种重新定义. 比如: double a,b,c; a=1/3; b=1/2; c=a+b; printf("%lf",c

C++学习之重载运算符1

C++除可重载函数之后,还允许定义已有的运算符,这样通过运算符重载可像处理数据使用它们. 先来个代码 1 #include<iostream> 2 using namespace std; 3 4 class num 5 { 6 public: 7 num(){n=1;} 8 ~num(){} 9 int get() const{return n;} 10 void set(int x){n=x;} 11 private: 12 int n; 13 }; 14 15 int main() 16

矩阵求和--重载运算符

C++习题 矩阵求和--重载运算符 [Submit][Status][Web Board] Description 有两个矩阵a和b,均为2行3列.求两个矩阵之和.重载运算符"+",使之能用于矩阵相加(如c=a+b). 重载流插入运算符"<<"和流提取运算符">>",使之能用于该矩阵的输入和输出. Input 两个2行3列矩阵 Output 矩阵之和 Sample Input 1 2 34 5 67 8 91 2 3 Sa

重载()运算符和重载强制类型转换

// 研究了半宿.最终弄清楚了 // 写了这段測试代码能够非常好的演示效果 class CConvert { public: CConvert(){m_nValue = 10;} // 重载()运算符 int operator ()(); // 重载int强制类型转换 operator int(); protected: private: int m_nValue; }; int CConvert::operator ()() { return m_nValue; } CConvert::ope

C++自学笔记_重载运算符_《C++ Primer》

#include <iostream> #include <stdexcept> using namespace std; class CheckedPtr{ public: CheckedPtr(int *b,int *e,int *c): beg(b),end(e),curr(c){ } CheckedPtr(const CheckedPtr &obj): //复制构造函数 beg(obj.beg),end(obj.end),curr(obj.curr){ } Chec

作为类的成员函数,重载运算符只能有一个参数

1 overload a operator of a class, you can only use one para., this pointer is automatically used. class Rational { public: //not correct since this ponit would be used automatically. //Rational operator+ (const Rational& lhs, const Rational& rhs);

C++习题 复数类--重载运算符+,-,*,/

Description 定义一个复数类Complex,重载运算符"+","-","*","/",使之能用于复数的加.减.乘.除.运算符重载函数作为Complex类的成员函数.编写程序,分别求两个复数之和.差.积和商. Input 两个复数 Output 两个复数之和.差.积和商 Sample Input 3 4 5 -10 Sample Output c1+c2=(8.00,-6.00i) c1-c2=(-2.00,14.00