【AMPPZ2014】【BZOJ4143】The Lawyer

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值