4927: 剩下的樹
阿新 • • 發佈:2018-12-14
題目大意:略。
解題思路:區間合併技巧:先按 L 升序,如果一樣,按 R 升序;排序完之後,從頭開始相鄰之間比較:如果 L2 在 (L1,R1) 內且 R2 大於 R1,則進行合併;否則進行計數並維護 L1、R1。
AC 程式碼
#include<bits/stdc++.h> #include<cmath> #define mem(a,b) memset(a,b,sizeof a) #define ssclr(ss) ss.clear(), ss.str("") #define INF 0x3f3f3f3f #define MOD 1000000007 using namespace std; typedef long long ll; struct node { int l,r; }nds[120]; int cmp(node n1,node n2) { return n1.l==n2.l?n1.r<n2.r:n1.l<n2.l; } int main() { int n,m,l1,r1,l2,r2,rs; while(~scanf("%d%d",&n,&m) && n && m) { rs=0; for(int i=0;i<m;i++) scanf("%d%d",&nds[i].l,&nds[i].r); sort(nds,nds+m,cmp); l1=nds[0].l, r1=nds[0].r; rs+=l1-0; for(int i=1;i<m;i++) { l2=nds[i].l, r2=nds[i].r; if(l2<=r1 && r2>r1) r1=r2; else if(l2>r1) { rs+=l2-r1-1; l1=l2; r1=r2; } } rs+=n-r1; printf("%d\n",rs); } return 0; }