原題鏈結
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
單組測試資料。output第一行有兩個整數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),表示每一條橋的長度。
如果能夠將n座島連線起來輸出yes,否則輸出no。input示例
4 4output示例1 47 8
9 10
12 14
4 5 3 8
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個數,如果有多個按照遞增序...