bzoj4143
记录每天最早开始和最晚结束的就ok了
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<ctime> 5 #include<cstdlib> 6 #include<iostream> 7 #include<algorithm> 8 #define clr(a,x) memset(a,x,sizeof(a)) 9 #define rep(i,l,r) for(int i=l;i<r;i++) 10 typedef long long ll; 11 using namespace std; 12 int read() 13 { 14 char c=getchar(); 15 int ans=0,f=1; 16 while(!isdigit(c)){ 17 if(c=='-') f=-1; 18 c=getchar(); 19 } 20 while(isdigit(c)){ 21 ans=ans*10+c-'0'; 22 c=getchar(); 23 } 24 return ans*f; 25 } 26 const int maxn=500050,maxm=25; 27 int n,m,l[maxn],r[maxn],last[maxm],first[maxm],t; 28 int main() 29 { 30 n=read(),m=read(); 31 rep(i,1,n+1){ 32 l[i]=read();r[i]=read();t=read(); 33 if(!last[t]||l[last[t]]<l[i]) last[t]=i; 34 if(!first[t]||r[first[t]]>r[i]) first[t]=i; 35 } 36 rep(i,1,m+1){ 37 if(!first[i]||l[last[i]]<=r[first[i]]) printf("NIE\n"); 38 else printf("TAK %d %d\n",first[i],last[i]); 39 } 40 return 0; 41 }
4143: [AMPPZ2014]The Lawyer
Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 167 Solved: 127
[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
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
NIE
NIE