51nod 1460 連線小島

2021-07-24 11:08:39 字數 1614 閱讀 7055

原題鏈結

1460 連線小島

codeforces

基準時間限制:1.5 秒 空間限制:131072 kb 分值: 40 

難度:4級演算法題

有n個小島,每乙個小島是直線型的,他們不相互相交,第i個小島所佔的區間是[li, ri],而且, ri <  li

+1對於所有的 1 ≤ i ≤ n-1。現在要將相鄰的小島用橋連線起來。現在有一條橋的長度是a,第i個島和第i+1個島能夠連線的條件是,存在x,y使得 li ≤ x ≤ ri,  li

+1≤y

≤ri+

1

且 y - x = a成立。

現在有m條橋,每條橋最多被使用一次,問能否把這些島連線起來。

樣例解釋:在這個樣例中,把第2條橋兩個端點放在3和8,把第三條橋兩個端點放在7和10,把第一條橋的端點放在10和14。

input

單組測試資料。

第一行有兩個整數n (2 ≤ n ≤ 2*10^5) 和 m (1 ≤ m ≤ 2*10^5),表示島的數目和橋的數目。

接下來n行,每行有兩個整數 li 和 ri (1 ≤ li ≤ ri ≤ 10^18),表示島的兩個端點。

接下來一行有m個整數 a1, a2, ..., am (1 ≤ ai ≤ 10^18),表示每一條橋的長度。

output

如果能夠將n座島連線起來輸出yes,否則輸出no。
input示例

4 4

1 47 8

9 10

12 14

4 5 3 8

output示例

yes
對輸入的相鄰的兩個島嶼,l1, r1, l2,r2生成乙個線段[l2-r1, r2-l1]因為有n個島嶼,所以有n-1個線段.先再就是為每個線段配一座橋.

把線段按照右端點從小到達排序,從小到大遍歷每個線段l, r, 找到一座橋,其長度》= l && <= r, 並且離l最近,那麼就是這個線段的橋

#include #define mod 1000000007

#define maxn 200005

using namespace std;

typedef long long ll;

struct node

node(ll a, ll b)

friend bool operator < (const node&a, const node&b)

ll l, r;

}node[maxn];

multisets;

int main()

sort(node, node+n-1);

for(int i = 0; i < m; i++)

multiset::iterator iter;

for(int i = 0; i < n - 1; i++)

iter = s.lower_bound(node[i].l);

if(iter == s.end() || *iter > node[i].r)

s.erase(iter);

} puts("yes");

return 0;

}

51Nod1810 連續區間

區間內所有元素排序後,任意相鄰兩個元素值差為1的區間稱為 連續區間 如 3,1,2是連續區間,但3,1,4不是連續區間 給出乙個1 n的排列,求出有多少個連續區間 input 乙個數n n 1,000,000 第二行n個數,表示乙個1 n的排列 output 乙個數,表示有多少個連續區間 input...

51nod 1810 連續區間

區間內所有元素排序後,任意相鄰兩個元素值差為1的區間稱為 連續區間 如 3,1,2是連續區間,但3,1,4不是連續區間 給出乙個1 n的排列,求出有多少個連續區間 乙個數n n 1,000,000 第二行n個數,表示乙個1 n的排列 乙個數,表示有多少個連續區間 5 2 1 5 3 4 考慮分治,每...

51nod 1138 連續整數的和

給出乙個正整數n,將n寫為若干個連續數字和的形式 長度 2 例如n 15,可以寫為1 2 3 4 5,也可以寫為4 5 6,或7 8。如果不能寫為若干個連續整數的和,則輸出no solution。input 輸入1個數n 3 n 10 9 output 輸出連續整數中的第1個數,如果有多個按照遞增序...