BZOJ 4143: [AMPPZ2014]The Lawyer( sort )

水题...

排序搞出每天的会议有哪些, 然后再按照会议的开始时间和结束时间排序, 最晚开始的和最早结束的会议不是同一场而且最晚开始的时间>最早结束的会议就有可能方案

----------------------------------------------------------------------------

#include<cstdio>

#include<cstring>

#include<algorithm>

#include<iostream>

#define rep(i, n) for(int i = 0; i < n; i++)

#define clr(x, c) memset(x, c, sizeof(x))

using namespace std;

const int maxn = 500009, maxm = 29;

int L[maxn], R[maxn], n, m, _L[maxm], _R[maxn];// [_L[i], _R[i])

struct mtg {

int l, r, day, pos;

inline void read(int p) {

scanf("%d%d%d", &l, &r, &day);

pos = ++p;

}

bool operator < (const mtg&t) const {

return day < t.day;

}

} M[maxn];

bool cmpL(const int i, const int j) {

return M[i].l > M[j].l;

}

bool cmpR(const int i, const int j) {

return M[i].r < M[j].r;

}

int main() {

freopen("test.in", "r", stdin);

cin >> n >> m;

rep(i, n) M[i].read(i);

sort(M, M + n);

clr(_L, -1);

rep(i, n) {

mtg*t = M + i;

if(_L[t->day] == -1) _L[t->day] = i;

_R[t->day] = i + 1;

L[i] = R[i] = i;

}

for(int i = 1; i <= m; ++i ) {

sort(L + _L[i], L + _R[i], cmpL);

sort(R + _L[i], R + _R[i], cmpR);

if(R[_L[i]] != L[_L[i]] && M[R[_L[i]]].r < M[L[_L[i]]].l)

printf("TAK %d %d\n", M[L[_L[i]]].pos, M[R[_L[i]]].pos);

else

puts("NIE");

}

return 0;

}

----------------------------------------------------------------------------

4143: [AMPPZ2014]The Lawyer

Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special Judge
Submit: 163  Solved: 123
[Submit][Status][Discuss]

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],d[i](1<=a[i]<b[i]<=80000000,1<=d[i]<=m),描述一场会议。

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上传

时间: 2024-10-07 19:11:15

BZOJ 4143: [AMPPZ2014]The Lawyer( sort )的相关文章

Bzoj 4143: [AMPPZ2014]The Lawyer

Bzoj 4143: [AMPPZ2014]The Lawyer 抱歉,水了这一片博客..( ~~ 为了凑出AMPPZ2014.... ~~ 显然记录最小的右端点,和最大的左端点即可. /*header*/ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <cmath> #d

bzoj4143: [AMPPZ2014]The Lawyer

4143: [AMPPZ2014]The Lawyer Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 462  Solved: 257[Submit][Status][Discuss] Description Byteasar要制订m天的会议计划,一共有n场会议,第i场会议开始于第d[i]天的第a[i]秒,结束于第d[i]天的第b[i]秒. 对于每一天,请找出这一天的两场会议i,j,使得它们不冲突,即不存在一个

Bzoj 4145: [AMPPZ2014]The Prices

Bzoj 4145: [AMPPZ2014]The Prices 状态压缩dp \(f[i][j]\)表示前i个商店 , 状态为j的最小花费. 考虑什么东西也不买和买了东西. 买了东西的话,就要到i地. 然后转移:\(f[i][j] = min(f[i][j] , f[i][j ^ (1 << k - 1)] + c[i][k])\) 不买东西 \(f[i][j] = f[i - 1][j]\) /*header*/ #include <iostream> #include <

BZOJ 4143 The Lawyer

       这道题看起来很吓人,但事实上看懂后会发现,其根本没有任何技术含量,做这道题其实要考虑的就是每天最早结束的一场的结束时间以及最晚开始的一场的开始时间,如果结束时间早于开始时间,那么OK就这两场,否则输出无解,要注意的是,如果想在传入时就把每天分开,记得标记每一场的序号.        代码如下: #include<cstdlib> #include<cstdio> #include<iostream> using namespace std; long lo

BZOJ 4144: [AMPPZ2014]Petrol

4144: [AMPPZ2014]Petrol Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 457  Solved: 170[Submit][Status][Discuss] Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满. q次询问,每次给出x,y,b,表示出发点是x,终点是y,油量上限为b,且保证x点和y点都是加油站,请回答能否从x走

循环队列+堆优化dijkstra最短路 BZOJ 4152: [AMPPZ2014]The Captain

循环队列基础知识 1.循环队列需要几个参数来确定 循环队列需要2个参数,front和rear 2.循环队列各个参数的含义 (1)队列初始化时,front和rear值都为零: (2)当队列不为空时,front指向队列的第一个元素,rear指向队列最后一个元素的下一个位置: (3)当队列为空时,front与rear的值相等,但不一定为零: 3.循环队列入队的伪算法 (1)把值存在rear所在的位置: (2)rear=(rear+1)%maxsize ,其中maxsize代表数组的长度: 4.循环队列

BZOJ 4152: [AMPPZ2014]The Captain( 最短路 )

先按x排序, 然后只有相邻节点的边才有用, 我们连起来, 再按y排序做相同操作...然后就dijkstra ------------------------------------------------------------------------ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include

BZOJ 4145: [AMPPZ2014]The Prices( 状压dp + 01背包 )

我自己只能想出O( n*3^m )的做法....肯定会T O( nm*2^m )做法: dp( x, s ) 表示考虑了前 x 个商店, 已买的东西的集合为s. 考虑转移 : 先假设我们到第x个商店去, so初始时 dp( x, s) = dp( x-1, s ) + d[x] 然后我们可以对第x个商店做01背包, dp(x, s + {h} ) = min( dp( x, s + {h} ) , dp( x, s) + c[x][h]) ) ( h ∉ s ). 之后我们再比较到第x个商店划不

BZOJ 1552/1506 [Cerc2007]robotic sort

AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1552 [分析] 这题哇!又有翻转操作...每次要输出第几个?是吧... 所以又要用Splay了. 可是这道题有创新的地方,因为又有数值上的有序[取最小值],又有位置上的有序[翻转和求第几个] 可是毕竟最小值的操作会简单很多...所以我们采用的是将位置作为Splay的节点信息. 那么怎么快速得到最小值的位置呢?当然就是常用的push_up了...向上更新就好了. 这里一定要注意题目所说:按