• 【洛谷 2782】友好城市


    题目描述

    有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航道不相交的情况下,被批准的申请尽量多。
    输入输出格式
    输入格式:

    第1行,一个整数N,表示城市数。

    第2行到第n+1行,每行两个整数,中间用一个空格隔开,分别表示南岸和北岸的一对友好城市的坐标。

    输出格式:

    仅一行,输出一个整数,表示政府所能批准的最多申请数。

    输入输出样例
    输入样例#1: 复制

    7
    22 4
    2 6
    10 3
    15 12
    9 8
    17 17
    4 2

    输出样例#1: 复制

    4

    说明

    50% 1<=N<=5000,0<=xi<=10000

    100% 1<=N<=2e5,0<=xi<=1e6



    题解:优化版LIS。先按照一边排序,就没另一边啥事了。若果可以插入队尾。则更新最新的、否则二分查找,找到可以替换的,替换即可。最后输出队列长度。优化LIS【因为无重复数据,所以upper_bound和lower_bound都可以】

    #include<bits/stdc++.h>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<cstdio>
    using namespace std;
    const int N=200005;
    struct node{
        int x;
        int y;
    }a[N];
    int n,k,s[N];
    bool cmp(node p,node q)
        { return p.x<q.x; }
    int main(){
        freopen("2782.in","r",stdin);
        freopen("2782.out","w",stdout);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d %d",&a[i].x,&a[i].y);
        sort(a+1,a+n+1,cmp);
        for(int i=1;i<=n;i++){
            if(a[i].y>=s[k]) s[++k]=a[i].y;
            else s[lower_bound(s,s+k,a[i].y)-s]=a[i].y;
        }
        cout<<k;
        return 0;
    }
  • 相关阅读:
    【leetcode】Pascal's Triangle
    [bxd学习java基本点]10.set元素不重复,取元素顺序会变的。TreeSet取值时,是安顺序来的。
    cocos2dx 学习点滴(4) cocos2dx 架构和引擎目录
    VC 2008编译libxml22.7.6
    程序猿的九重天
    使用批处理文件设置环境变量
    删除指定目录下除开指定文件外所有文件的批处理命令
    关于永动机的思考
    程序员的九阳真经
    上帝的归上帝,程序的归程序 (卓有成效的程序员)
  • 原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11139623.html
Copyright © 2020-2023  润新知