BZOJ4995-[Usaco2017 Feb]Why Did the Cow Cross the Road
考虑将线段按照右端点递增的顺序排列相同情况下按照左端点排列
每次贪心将距离这个线段左端点最近的鸡给它
网上的题解都用了指针之类的东西,让我难以理解,所以特地写了一份基础代码。
时间复杂度有点难看。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=20005; 4 int n,m,t[N],ans,b[N],nxt[N],pre[N]; 5 struct node 6 { 7 int l,r; 8 }a[N]; 9 int cmp(node x,node y) 10 { 11 if(x.r==y.r)return x.l<y.l; 12 return x.r<y.r; 13 } 14 int main() 15 { 16 scanf("%d%d",&n,&m); 17 for(int i=1;i<=n;i++)scanf("%d",&t[i]),nxt[i]=i+1,pre[i]=i-1; 18 for(int i=1;i<=m;i++)scanf("%d%d",&a[i].l,&a[i].r); 19 sort(t+1,t+n+1); 20 sort(a+1,a+m+1,cmp); 21 memset(b,0,sizeof(b)); 22 for(int i=1;i<=m;i++) 23 { 24 int l=1,r=n; 25 while(l<r) 26 { 27 int mid=(l+r)>>1; 28 if(t[mid]>=a[i].l)r=mid;else l=mid+1; 29 } 30 if(!b[l]&&t[l]>=a[i].l&&t[l]<=a[i].r)b[l]=1;else 31 { 32 while(b[l]&&l<=n&&t[l]<=a[i].r)l++; 33 if(t[l]>a[i].r||l>n||t[l]<a[i].l)continue; 34 b[l]=1; 35 } 36 } 37 int ans=0; 38 for(int i=1;i<=n;i++)if(b[i])ans++; 39 printf("%d\n",ans); 40 return 0; 41 }