标签:blog http ar sp for on 2014 art log
题目链接:点击打开链接
题意:
给定n个任务
下面[l, r]是n个任务需要占用的时间。
m个人
下面是m个人的空闲时间以及这个人至多能做的任务个数(一个人同一时刻只能做一个任务,即人是单线程的)
[l, r] num
问:
若任务不能被全部完成则输出NO
否则输出YES
输出每个任务是谁完成的。
思路:
把人和任务放一起按右端点排序。
若遇到了任务则把任务的左端点放到set里。
若遇到了人,则把set中>=人的左端点的 num个数删掉。
c:
#include <bits/stdc++.h>
template <class T>
inline bool rd(T &ret) {
char c; int sgn;
if(c=getchar(),c==EOF) return 0;
while(c!='-'&&(c<'0'||c>'9')) c=getchar();
sgn=(c=='-')?-1:1;
ret=(c=='-')?0:(c-'0');
while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
ret*=sgn;
return 1;
}
template <class T>
inline void pt(T x) {
if (x <0) {
putchar('-');
x = -x;
}
if(x>9) pt(x/10);
putchar(x%10+'0');
}
using namespace std;
typedef long long ll;
#define int ll
const int N = 200050;
int n, m;
struct node{
int op, l, r, num, id;
}a[N*2];
bool cmp(node x, node y){
if(x.r != y.r)
return x.r<y.r;
if(x.op!=y.op)
return x.op<y.op;
}
int top, b[N];
void input(){
top = 0;
for(int i = 1; i <= n; i++){
rd(a[top].l); rd(a[top].r);
a[top].op = 0;
a[top].id = i;
top++;
}
rd(m);
for(int i = 1; i <= m; i++){
rd(a[top].l); rd(a[top].r); rd(a[top].num);
a[top].op = 1;
a[top].id = i;
top++;
}
sort(a, a+top, cmp);
}
struct Edge{
int id, l;
bool operator<(const Edge&e)const{
if(e.l!=l)return e.l>l;
return e.id>id;
}
Edge(int a=0,int b=0):id(a),l(b){}
}tmp;
set<Edge>s;
set<Edge>::iterator p;
#undef int
int main(){
#define int ll
while(cin>>n){
input();
int ans = 0;
s.clear();
for(int i = 0; i < top; i++){
if(a[i].op){
while(s.size() && a[i].num--)
{
p = s.lower_bound(Edge(0, a[i].l));
if(p == s.end())break;
tmp = *p;
b[tmp.id] = a[i].id;
s.erase(p);
ans++;
}
}
else {
s.insert(Edge(a[i].id, a[i].l));
}
}
if(ans == n)
{
puts("YES");
for(int i = 1; i <= n; i++){pt(b[i]); putchar(' ');}
}
else puts("NO");
}
return 0;
}Codeforces 497C Distributing Parts set+贪心
标签:blog http ar sp for on 2014 art log
原文地址:http://blog.csdn.net/qq574857122/article/details/42011825