【AMPPZ2014】【BZOJ4143】The Lawyer

来源:互联网 发布:上班记录软件 编辑:程序博客网 时间:2024/06/05 21:01

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 0x7fffffffusing 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);    }}
0 0