Distributing Parts

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\n");
56         for(int i=1;i<=n;++i)
57             printf("%d%c",ans[i],n==i?'\n':' ');
58     }else printf("NO\n");
59 }

 

posted @ 2016-08-16 20:15  barriery  阅读(246)  评论(0编辑  收藏  举报