CODEFORCES, 496E Distributing Parts

题意 :有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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值