题意 :有n种舞台,每个舞台需要演员的音调能涵盖[l,r]
有m种演员,音调为[li,ri],每种演员有ci个。
问,能否将演员分配满足各舞台的要求。
(1 ≤ n ,m≤ 105).
策略:
首先将舞台按照l值l排序。
然后我们观察演员。
假设排序后第一个舞台需要的音调为[3,5]
现在我们拥有演员[2,6],[1,7],[3,4]这与这三种,不管他们的最低音调有多低,<=3效果都是与3相同的,所以我们能够将所有l值<=舞台l值得的演员的r值放入某种数据结构,然后再找到>=舞台r值的第一个数,然后将对应演员数减一。这样我们每次贪心的选择都是代价最小的。
在查找上希望的复杂度是O(logm)如果每次遍历查找,那么最坏可能会达到nm的复杂度。
这时候set能满足我们的要求。每次插入和取出都是logm 。
//Author:Wenjun Shi
//on 2016/7/14
#include <iostream>
#include <set>
#include <utility>
#include <vector>
#include <algorithm>
#define MAX_N 100005
#define mp make_pair
using namespace std;
typedef pair<pair<int,int>,int> p;
int cnt[MAX_N],ans[MAX_N];
set<pair<int,int> > s;
p st[MAX_N],pe[MAX_N];
int main()
{
int n,m;
cin>>n;
for(int i=1;i<=n;i++){
cin>>st[i].first.first>>st[i].first.second;
st[i].second=i;
}
sort(st+1,st+1+n);
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>pe[i].first.first>>pe[i].first.second>>cnt[i];
pe[i].second=i;
}
sort(pe+1,pe+1+m);
int j=1;
for(int i=1;i<=n;i++)
{
while(j<=m&&pe[j].first.first<=st[i].first.first)
{
s.insert(mp(pe[j].first.second,pe[j].second));
j++;
}
set<pair<int,int> >::iterator it=s.lower_bound(mp(st[i].first.second,0));
if(it==s.end()) {cout<<"NO"<<endl;return 0;}
cnt[it->second]--;
ans[st[i].second]=it->second;
if(cnt[it->second]==0) s.erase(it);
}
cout<<"YES"<<endl;
for(int i=1;i<=n;i++)
cout<<ans[i]<<' ';
return 0;
}