2020寒假【gmoj1504】【城市連接】【最長不下降子序列】

題目描述

現在,OI界出現了一位來無影去無蹤的怪盜,那就是基德!曾經他盜竊了著名的Paris Sunshine,各位大牛爲之震驚!所以,在這之後,許多大牛都廢寢忘食,研究對付基德的有效辦法,在這期間,爲了防止基德再次來盜竊,OI總司令就決定派出OIER,來保護OI總部。現在你擔任OI防禦大隊大隊長,需要在OI總部裏安排儘可能多的OI特製陷阱!原來OI總部是完全分離的兩部分需要鋪設特殊的管道才能到達OI總部。現在,OIER爲了保衛總部,設計了許多許多的陷阱,讓基德自投羅網。

現在有一份超級無敵大牛提供的寶貴規劃資料,需要讓你來部署。你的任務就是編寫一個程序來實現這次規劃。

輸入

輸入文件中的第一行爲兩個整數x,y(10<=x<=6000000000000,10<=y<=1000000000000000),其中:x表示OI總部間隔帶的長度,而y表示寬。 第二行中爲一個整數N(1<=N<=500000),表示分佈在間隔帶的陷阱對數。 接下來的N行,每行有兩個正數C,D(0<C,D<=x),描述了每一對陷阱沿着間隔帶與西邊境線的距離。其中:C表示北邊間隔帶陷阱的距離而D表示南邊陷阱的距離。在間隔帶的同一邊,任何兩個陷阱的位置都是不同的。

輸出

輸出文件中僅一行爲一個整數,即在互不干擾的情況下所能佈置的最多陷阱數目。

樣例輸入

10 4
2
1 2
2 1

樣例輸出

1

分析

出題人的語文一言難盡…
這題題意很難理解,直接導致了我比賽掛掉。。。其實現在我也不是很明白題意。
那說說做法吧:輸入完後,以左邊的一列數爲關鍵字排序(當然快排廢話ing )。
然後用右邊一列數做最長不下降子序列。完成。。
爽快

上代碼

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a,b,n,ans[500001],sum;
struct node
{
	int x,y;
}f[500001];
int cmp(node l,node r)
{
	return l.x<r.x;
}
int main()
{
	freopen("save.in","r",stdin);
	freopen("save.out","w",stdout);
	cin>>a>>b;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>f[i].x>>f[i].y;
	}
	sort(f,f+n+1,cmp);
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=i-1;j++)
		{
			if(f[i].y>f[j].y)
			{
				ans[i]=max(ans[i],ans[j]+1);
			}
		}
	} 
	for(int i=1;i<=n;i++)
	{
		sum=max(sum,ans[i]);
	}
	cout<<sum;
	fclose(stdin);
	fclose(stdout);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章