Codeforces 496E

貪心 二分查找 因爲要不斷地刪除 用set容器

#include <cstdio>
#include <cstring>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cmath>
#include <set>
#include <map>
using namespace std;

const int N=100005;
struct node{
	int d,k,id;
	bool operator<(const node& tmp)const{
		return d<tmp.d;
	}
};
multiset<node> st;
multiset<node> :: iterator it;
struct node1{
	int a, b, id;
	bool operator < (const node1& rhy) const {
        return a < rhy.a;
	}
} a[N];
struct node2{
	int c, d, k, id;
	bool operator < (const node2& rhy) const {
        return c < rhy.c;
	}
} b[N];

int ans[N];
int main()
{
	int n, m;
	scanf("%d", &n);
	for(int i = 0; i < n; ++ i)
		scanf("%d%d", &a[i].a, &a[i].b), a[i].id = i;
	scanf("%d", &m);
	for(int i = 0; i < m; ++ i)
		scanf("%d%d%d", &b[i].c, &b[i].d, &b[i].k), b[i].id = i;
	sort(a,a+n);
	sort(b,b+m);
	int j = 0, flag = 0;
	for(int i = 0; i < n; ++ i)	{
		node tmp;
		while(j < m && b[j].c <= a[i].a) {
			tmp.d = b[j].d, tmp.k = b[j].k, tmp.id = b[j].id;
			st.insert(tmp);
			j++;
		}
		if(st.empty()) {
			flag=1;
			break;
		}
		tmp.d = a[i].b, tmp.k = 0, tmp.id = 0;
		it=st.lower_bound(tmp);
		if(it == st.end()) {
			flag = 1;
			break;
		}
		tmp = *it;
		st.erase(it);
		ans[a[i].id] = tmp.id;
		if(tmp.k>1) tmp.k--, st.insert(tmp);
	}
	if(flag == 1) printf("NO\n");
	else
	{
		puts("YES");
		for(int i = 0; i < n; ++ i)
			printf("%d ",ans[i]+1);
		puts("");
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章