Distributing Parts
题目链接:http://codeforces.com/problemset/problem/496/E
贪心
将音乐和人都以低音升序排序,贪心处理低音更低的音乐,找出低音小于等于它的歌手,二分查找高音与它最近的人。因为剩下的人的低音一定小于后面的歌的低音,而我们选择出了满足条件的高音的最小的人,让后面的歌尽有可能的有人唱。然而不知道为什么我用lower_bound(s.begin(),s.end(),modle)会TLE,而用s.lower_bound(modle)就能过,这两者实现不同吗?
代码如下:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #include<set> 6 #define N 100005 7 using namespace std; 8 struct nod{ 9 int l,r,num,index; 10 }musics[N],men[N]; 11 int k[N],ans[N]; 12 bool cmp(nod a,nod b){ 13 if(a.l==b.l)return a.r<b.r; 14 return a.l<b.l; 15 } 16 int n,m; 17 int main(void){ 18 scanf("%d",&n); 19 for(int i=1;i<=n;++i){ 20 musics[i].num=i; 21 scanf("%d%d",&musics[i].l,&musics[i].r); 22 } 23 sort(musics+1,musics+1+n,cmp); 24 scanf("%d",&m); 25 for(int i=1;i<=m;++i){ 26 men[i].num=i; 27 scanf("%d%d%d",&men[i].l,&men[i].r,&k[i]); 28 } 29 sort(men+1,men+1+m,cmp); 30 bool flag=1; 31 int tt=1; 32 set<pair<int,int> >s; 33 for(int i=1;i<=n;++i){ 34 while(tt<=m&&men[tt].l<=musics[i].l){ 35 s.insert(make_pair(men[tt].r,men[tt].num)); 36 tt++; 37 } 38 set<pair<int,int> >::iterator it; 39 it=s.lower_bound(make_pair(musics[i].r,0)); 40 if(it==s.end()){ 41 flag=0; 42 break; 43 } 44 if(musics[i].r<=it->first){ 45 ans[musics[i].num]=it->second; 46 k[it->second]--; 47 if(k[it->second]==0) 48 s.erase(*it); 49 }else{ 50 flag=0; 51 break; 52 } 53 } 54 if(flag){ 55 printf("YES "); 56 for(int i=1;i<=n;++i) 57 printf("%d%c",ans[i],n==i?' ':' '); 58 }else printf("NO "); 59 }