Codeforces 496E

来源:互联网 发布:山西九鼎软件记账 编辑:程序博客网 时间:2024/06/07 07:51

贪心 二分查找 因为要不断地删除 用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;}


0 0
原创粉丝点击