Bzoj 3126[Usaco2013 Open]Photo 题解
3126: [Usaco2013 Open]Photo
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 335 Solved: 169
[Submit][Status][Discuss]
Description
Farmer John has decided to assemble a panoramic photo of a lineup of his N cows (1 <= N <= 200,000), which, as always, are conveniently numbered from 1..N. Accordingly, he snapped M (1 <= M <= 100,000) photos, each covering a contiguous range of cows: photo i contains cows a_i through b_i inclusive. The photos collectively may not necessarily cover every single cow. After taking his photos, FJ notices a very interesting phenomenon: each photo he took contains exactly one cow with spots! FJ was aware that he had some number of spotted cows in his herd, but he had never actually counted them. Based on his photos, please determine the maximum possible number of spotted cows that could exist in his herd. Output -1 if there is no possible assignment of spots to cows consistent with FJ's photographic results.
给你一个n长度的数轴和m个区间,每个区间里有且仅有一个点,问能有多少个点
Input
* Line 1: Two integers N and M.
* Lines 2..M+1: Line i+1 contains a_i and b_i.
Output
* Line 1: The maximum possible number of spotted cows on FJ's farm, or -1 if there is no possible solution.
Sample Input
1 4
2 5
3 4
INPUT DETAILS: There are 5 cows and 3 photos. The first photo contains cows 1 through 4, etc.
Sample Output
OUTPUT DETAILS: From the last photo, we know that either cow 3 or cow 4 must be spotted. By choosing either of these, we satisfy the first two photos as well
1 #pragma GCC optimze("O3") 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstdio> 5 #include<cstring> 6 #include<queue> 7 #include<algorithm> 8 #include<cmath> 9 #include<map> 10 #include<vector> 11 #define N 200005 12 using namespace std; 13 int n,m,r[N],l[N],q[N*2],en,hea=1,f[N]; 14 int main() 15 { 16 scanf("%d%d",&n,&m); 17 for(int i=1;i<=n+1;i++) 18 r[i]=i-1; 19 for(int i=1;i<=m;i++) 20 { 21 int x,y; 22 scanf("%d%d",&x,&y); 23 l[y+1]=max(l[y+1],x); 24 r[y]=min(r[y],x-1); 25 } 26 for(int i=2;i<=n+1;i++) 27 l[i]=max(l[i],l[i-1]); 28 for(int i=n;i>0;i--) 29 r[i]=min(r[i],r[i+1]); 30 en++; 31 q[en]=0; 32 for(int i=1;i<=n+1;i++) 33 { 34 for(int j=r[i-1]+1;j<=r[i];j++) 35 { 36 while(hea<=en&&f[q[en]]<f[j])en--; 37 en++; 38 q[en]=j; 39 } 40 while(hea<=en&&q[hea]<l[i])hea++; 41 if(hea>en) 42 f[i]=-0x7ffffff; 43 else 44 f[i]=f[q[hea]]+1; 45 } 46 if(f[n+1]>=0)printf("%d\n",f[n+1]-1); 47 else 48 printf("-1\n"); 49 return 0; 50 }