前言

传送门

正文

参考题解

#include<iostream>
#include<cstring>
#include<algorithm>
#include<map> 
using namespace std;

/* 题意: 输入n条车辆记录,k次查询,每条记录包括车牌号码、当前时间、进/出学校 每次查询给定一个时间,要求输出查询结果,每个查询结果表示该时间下在 校园内的车辆数量,最后输出当天停留在校园内时长最长的车辆号码及停留 时间,若有多辆车辆同时满足停留时间最长,则按照车辆号码升序排序 注意点: 1、对于hh:mm:ss格式的时间,首先应该统一化成以s为单位 ,简化操作 2、本题中注意in和out表示车辆进出校园,对于同一辆车,将其所有进出记录 按照时间顺序升序排序后,需要注意in和out必须配对,即若当前记录为in,则 下一条记录必须为out,否则当前记录无效。 3、一个车可能出入校园好多次,停车的时间应该取之和 解题步骤: 1、排序题首先搞清楚结构体中存放哪些信息,根据题意可知应该有车牌号plate,时间time,进出的状态status。 这里对于结构体Car设置两个数组all和valid分别存放所有的车辆记录和有效的车辆记录。 排序规则:首先以车牌号升序排序,相同的车牌号则以时间进行排序 2、由于需要将车辆id和停留时间绑定到一起,故需要使用一个map来记录每辆车当天总共的停留时间,map底层就是使用红黑树实现 其中的元素默认按照键值升序排序,也就是车辆号码升序排序。 */
const int N=1e4+10;
int n,k;
map<string,int>mp;
struct Car{
	char id[10];
	int time;
	char staus[5];
}all[N],valid[N]; 

int getTime(int hh,int mm,int ss){
	return hh*3600+mm*60+ss;
}

bool cmpByIdAndTime(Car a,Car b){
	if(strcmp(a.id,b.id))return strcmp(a.id,b.id)<0;
	else return a.time<b.time;
}

bool cmpByTime(Car a,Car b){
	return a.time<b.time;
} 

int main(){
	scanf("%d %d",&n,&k);
	int hh,mm,ss;
	for(int i=0;i<n;i++){
		scanf("%s %d:%d:%d %s",all[i].id,&hh,&mm,&ss,all[i].staus);
		all[i].time=getTime(hh,mm,ss);
	}
// 排序 
	sort(all,all+n,cmpByIdAndTime);
	
// 遍历所有记录,获取有效记录
	int num=0,maxTime=-1;//有效记录的条数及车辆停留的最长时间 
	for(int i=0;i<n-1;i++){
		if(!strcmp(all[i].id,all[i+1].id)&&!strcmp(all[i].staus,"in")&&!strcmp(all[i+1].staus,"out")){//是有效记录 
			valid[num++]=all[i];
			valid[num++]=all[i+1];
			int stayTime=all[i+1].time-all[i].time;
			if(mp.find(all[i].id)==mp.end()) mp[all[i].id]=0;//mp中还没有该车牌号,停留时间清0 
			mp[all[i].id]+=stayTime;
			maxTime=max(maxTime,mp[all[i].id]);//更新最长的停留时间 
		} 
	} 
	sort(valid,valid+num,cmpByTime);//将有效记录按照时间顺序升序排序,因为k次查询也是按照时间升序 
	
// k次查询
	int carIndex=0,carNum=0;//分别表示当前车辆的下标以及停车数量 (利用到查询也是按照时间升序的,故对有效记录进行时间排序后可避免多次查询) 
	for(int i=0;i<k;i++){
		scanf("%d:%d:%d",&hh,&mm,&ss);
		int time=getTime(hh,mm,ss);
		while(carIndex<num&&valid[carIndex].time<=time){
			if(!strcmp(valid[carIndex].staus,"in"))carNum++;
			if(!strcmp(valid[carIndex].staus,"out"))carNum--;
			carIndex++;
		}
		printf("%d\n",carNum); 	 
	} 
// 输出停留最长时间的车辆
	map<string,int>::iterator it;
	for(it=mp.begin();it!=mp.end();it++){
		if(it->second==maxTime)printf("%s ",it->first.c_str());//因为mp的key为string类型,故使用%s输出时需要调用c_str() 
	} 
	printf("%02d:%02d:%02d\n",maxTime/3600,maxTime%3600/60,maxTime%60);
	return 0;
}