【PAT甲级】1095 Cars on Campus (30 分)
题意:
输入两个正整数N和K(N<=1e4,K<=8e4),接着输入N行数据每行包括三个字符串表示车牌号,当前时间,进入或离开的状态。接着输入K次询问,输出当下停留在学校里的车辆数量。最后一行输出总计停留时间最长的车牌号(字典序升序输出)和停留总时。
AAAAAccepted code:
//因为一天只有86400秒,所以可以用一个car数组在统计车辆停留时间时在进入时间+1,离开时间-1。再用一个sum数组扫一遍,sum[i]=sum[i-1]+car[i],即可表示当下时间有多少辆车还在停留在校园内。
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 map<string,int>mp; 5 vector<pair<string,int> >v[10007]; 6 int sum[100007],car[100007]; 7 int t[10007]; 8 map<int,string>id; 9 vector<string>name; 10 int a[17]; 11 void clear(string&s){ 12 string ss; 13 swap(s,ss); 14 } 15 int main(){ 16 ios::sync_with_stdio(false); 17 cin.tie(NULL); 18 cout.tie(NULL); 19 int n,k; 20 cin>>n>>k; 21 int cnt=0; 22 for(int i=1;i<=n;++i){ 23 string s; 24 cin>>s; 25 string t; 26 cin>>t; 27 string f; 28 cin>>f; 29 if(!mp[s]) 30 mp[s]=++cnt; 31 id[mp[s]]=s; 32 int flag=0; 33 if(f[0]=='i') 34 flag=1; 35 v[mp[s]].push_back({t,flag}); 36 } 37 for(int i=1;i<=cnt;++i){ 38 sort(v[i].begin(),v[i].end()); 39 string now; 40 int flag=0; 41 for(int j=0;j<v[i].size();++j){ 42 if(v[i][j].second==1){ 43 now=v[i][j].first; 44 flag=1; 45 } 46 else{ 47 if(flag){ 48 string tamp=v[i][j].first; 49 int start=(now[0]-'0')*36000+(now[1]-'0')*3600+(now[3]-'0')*600+(now[4]-'0')*60+(now[6]-'0')*10+(now[7]-'0'); 50 int over=(tamp[0]-'0')*36000+(tamp[1]-'0')*3600+(tamp[3]-'0')*600+(tamp[4]-'0')*60+(tamp[6]-'0')*10+(tamp[7]-'0'); 51 ++car[start]; 52 --car[over]; 53 flag=0; 54 clear(now); 55 t[i]+=over-start; 56 } 57 } 58 } 59 } 60 sum[0]+=car[0]; 61 for(int i=0;i<86400;++i) 62 sum[i]=sum[i-1]+car[i]; 63 for(int i=1;i<=k;++i){ 64 string tamp; 65 cin>>tamp; 66 int tt=(tamp[0]-'0')*36000+(tamp[1]-'0')*3600+(tamp[3]-'0')*600+(tamp[4]-'0')*60+(tamp[6]-'0')*10+(tamp[7]-'0'); 67 cout<<sum[tt]<<" "; 68 } 69 int mx=0; 70 for(int i=1;i<=cnt;++i) 71 mx=max(mx,t[i]); 72 for(int i=1;i<=cnt;++i) 73 if(mx==t[i]) 74 name.push_back(id[i]); 75 sort(name.begin(),name.end()); 76 for(int i=0;i<name.size();++i) 77 cout<<name[i]<<" "; 78 a[1]=mx/36000; 79 mx%=36000; 80 a[2]=mx/3600; 81 mx%=3600; 82 a[3]=mx/600; 83 mx%=600; 84 a[4]=mx/60; 85 mx%=60; 86 a[5]=mx/10; 87 mx%=10; 88 a[6]=mx; 89 cout<<a[1]<<a[2]<<":"<<a[3]<<a[4]<<":"<<a[5]<<a[6]; 90 return 0; 91 }