有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的 N N N 个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航道不相交的情况下,被批准的申请尽量多。
输入格式
第一行,一个整数 N N N ,表示城市数。
第二行到第 N + 1 N+1 N + 1 行,每行两个整数,中间用一个空格隔开,分别表示南岸和北岸的一对友好城市的坐标。
输出格式
仅一行,输出一个整数,表示政府所能批准的最多申请数。
输入输出样例 #1
输入 #1
1 2 3 4 5 6 7 8 7 22 4 2 6 10 3 15 12 9 8 17 17 4 2
输出 #1
说明/提示
数据规模与约定
对于 50 % 50\% 5 0 % 的数据,1 ≤ N ≤ 5000 1 \leq N \leq 5000 1 ≤ N ≤ 5 0 0 0 ,0 ≤ x i ≤ 10000 0 \leq x _ i \leq 10000 0 ≤ x i ≤ 1 0 0 0 0 。
对于 100 % 100\% 1 0 0 % 的数据,1 ≤ N ≤ 2 × 1 0 5 1 \leq N \leq 2 \times 10 ^ 5 1 ≤ N ≤ 2 × 1 0 5 ,0 ≤ x i ≤ 1 0 6 0 \leq x _ i \leq 10 ^ 6 0 ≤ x i ≤ 1 0 6 。
题解
我还真第一次见动态规划比较慢的题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 #include <bits/stdc++.h> using namespace std;int main () { vector< pair<int , int > > cities; int n; cin >> n; cities.reserve (n); for (int i=0 ;i<n;i++){ int s, n; cin >> s >> n; cities.emplace_back (s, n); } sort (cities.begin (), cities.end ()); vector<int > tails; tails.reserve (n); for (auto &x : cities){ int lb = distance (tails.begin (), lower_bound (tails.begin (), tails.end (), x.second)); if (lb == (int )tails.size ()) tails.emplace_back (x.second); else tails[lb] = x.second; } cout << tails.size (); return 0 ; }