输入:
循环输入,每次输入n,代表有几次输入,(1<=n<=100)
随后的一行p ,q 代表总的战争年代的长度(-6000000 <= p <= q <= 6000000)
随后输入n行 ai,bi,ni, p <= A, B <= q ,ai,bi是这次战争的时间范围,ni是这次战争的名称。
输出:
输出一个数字代表在p和q范围内没有战争的那一年,
如果不仅只有一年,则输出没有战争的最大年份。
如果每年都有战争,则输出“ Badly!”。
ll t,n,m,p,q;
struct node{
int l,r;
}a[maxn];
string s;
bool cmp(node x,node y){
if(x.r!=y.r) return x.r<y.r;
return x.l<y.l;
}
int main(){
while(~scanf("%lld",&n)){
ll maxx = -inf;
cin>>p>>q;
for(int i=0;i<n;i++){
cin>>a[i].l>>a[i].r;
getline(cin,s);
}
sort(a,a+n,cmp);
if(a[0].l>p) maxx=a[0].l-1;
for(int i=1;i<n;i++){
if(a[i].l-1 <= a[i-1].r){
a[i].l=a[i-1].r;
if(a[i-1].r>a[i].r) a[i].r=a[i-1].r;
}else maxx=a[i].l-1;
}
if(a[n-1].r<q) maxx=q;
if(maxx == -inf) cout<<"Badly!"<<endl;
else cout<<maxx<<endl;
}
return 0;
}
首先这个战争的名称其实没什么用,只要读进来就好了。
按照cmp排序,
如果两个时间段结束时间不同,就按照结束时间早的排在前面,
如果两个时间段结束时间相同,就按照开始时间早的排在前面,
排序后,如果第一个时间段开始的时间比p迟,那就先让最大年份=a[0].l-1;
然后for循环,如果这次的开始年份不早于上次的结束年份,那么这次的左边界=上次的右边界,
甚至如果上次的结束年份比这次的结束时间还要迟,那就然这次的右边界也等于上次的右边界。
否则,如果这次的左边界大于上次的右边界,那最大年份就等于这次的左边界-1;
最后如果最后一个时间段的右边界还是小于q的话,最大年份就等于q;