复习好无聊,忙里偷闲水一发。
贪心,让每个演唱家尽量发挥最大的作用。对于每个演唱家选择演唱的曲子时应满足,min( aj | bj <= di && ci <= aj ),显然在满足bj <= di 的j里二分ci即可。
将演唱家和曲子分别按d,b升序排序。
然后枚举演唱家i,将满足的dj <= bi的曲子丢到set里,然后再set里二分ci即可。
没怎么用过set,好水。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <ctime>
#include <iomanip>
#include <set>
#pragma comment(linker,"/STACK:1024000000");
#define EPS (1e-6)
#define _LL long long
#define ULL unsigned long long
#define LL __int64
#define INF 0x3f3f3f3f
#define Mod 1000000007
/** I/O Accelerator Interface .. **/
#define g (c=getchar())
#define d isdigit(g)
#define p x=x*10+c-'0'
#define n x=x*10+'0'-c
#define pp l/=10,p
#define nn l/=10,n
template<class T> inline T& RD(T &x)
{
char c;
while(!d);
x=c-'0';
while(d)p;
return x;
}
template<class T> inline T& RDD(T &x)
{
char c;
while(g,c!='-'&&!isdigit(c));
if (c=='-')
{
x='0'-g;
while(d)n;
}
else
{
x=c-'0';
while(d)p;
}
return x;
}
inline double& RF(double &x) //scanf("%lf", &x);
{
char c;
while(g,c!='-'&&c!='.'&&!isdigit(c));
if(c=='-')if(g=='.')
{
x=0;
double l=1;
while(d)nn;
x*=l;
}
else
{
x='0'-c;
while(d)n;
if(c=='.')
{
double l=1;
while(d)nn;
x*=l;
}
}
else if(c=='.')
{
x=0;
double l=1;
while(d)pp;
x*=l;
}
else
{
x=c-'0';
while(d)p;
if(c=='.')
{
double l=1;
while(d)pp;
x*=l;
}
}
return x;
}
#undef nn
#undef pp
#undef n
#undef p
#undef d
#undef g
using namespace std;
struct N
{
int a,b,k,id;
bool operator < (const N &t) const{
return b < t.b;
}
}A[100010],B[100010];
set< pair<int,int> > ms;
int sing[100010];
int main()
{
int n,m,i,j;
scanf("%d",&n);
for(i = 1;i <= n; ++i)
scanf("%d %d",&A[i].a,&A[i].b),A[i].id = i;
scanf("%d",&m);
for(i = 1;i <= m; ++i)
scanf("%d %d %d",&B[i].a,&B[i].b,&B[i].k),B[i].id = i;
sort(A+1,A+n+1);
sort(B+1,B+m+1);
set< pair<int,int> >::iterator it;
for(i = 1,j = 1;i <= m; ++i)
{
while(j <= n && A[j].b <= B[i].b)
{
ms.insert(pair<int,int>(A[j].a,A[j].id));
++j;
}
do
{
it = ms.lower_bound(pair<int,int>(B[i].a,-1));
if(it != ms.end())
{
sing[(*it).second] = B[i].id;
ms.erase(*it);
B[i].k--;
}
}while(B[i].k && it != ms.end());
}
if(ms.empty() == true && j > n)
{
printf("YES\n");
for(i = 1;i <= n; ++i)
printf("%d%c",sing[i],(i == n) ? '\n' : ' ');
}
else
{
printf("NO\n");
}
return 0;
}