Description
Byteasar要制订m天的会议计划,一共有n场会议,第i场会议开始于第d[i]天的第a[i]秒,结束于第d[i]天的第b[i]秒。
对于每一天,请找出这一天的两场会议i,j,使得它们不冲突,即不存在一个数k同时满足a[i]<=k<=b[i]以及a[j]<=k<=b[j]。
Input
第一行包含两个正整数n,m(2<=n<=500000,1<=m<=20),表示会议的场数和天数。
接下来n行,每行包含三个正整数a[i],b[i],di,描述一场会议。
Output
输出m行。第i行输出第i天的答案,如果无解,输出NIE,否则输出TAK,然后输出这一天参加的两场会议的编号,
如有多组解,输出任意一组。
Sample Input
6 3
3 5 1
2 4 2
1 8 1
6 7 3
3 5 2
7 12 1
Sample Output
TAK 1 6
NIE
NIE
HINT
Source
鸣谢Claris上传
记录每天最早结束的和最晚开始的,这两个不相交就行.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAXN 500100
#define MAXINT 0x7fffffff
using namespace std;
int n,m;
struct task
{
int a,b,d;
bool operator <(const task& a)const
{
return d<a.d;
}
}s[MAXN],a[30],b[30];
void in(int &x)
{
char ch=getchar();x=0;int flag=1;
while (!(ch>='0'&&ch<='9')) flag=ch=='-'?-1:flag,ch=getchar();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();x*=flag;
}
int main()
{
in(n);in(m);
for (int i=1;i<=m;i++) a[i].b=MAXINT,b[i].a=-MAXINT;
for (int i=1;i<=n;i++)
{
in(s[i].a);in(s[i].b);in(s[i].d);
if (s[i].a>b[s[i].d].a) b[s[i].d]=s[i],b[s[i].d].d=i;
if (s[i].b<a[s[i].d].b) a[s[i].d]=s[i],a[s[i].d].d=i;
}
for (int i=1;i<=m;i++)
{
if (b[i].a<=a[i].b) puts("NIE");
else printf("TAK %d %d\n",a[i].d,b[i].d);
}
}