自己熬出来的代码。。。不知道如何修改
//初涉队列的年氢人
//2022.8.21这道题留着等能下载数据再说
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
typedef long long ll;
struct person{
int nation;
int time;
};
//如何确定队列:分人
queue<person>n;
ll national[114514119] = {0};
ll limit_time = 86400;
ll sum_time = 0;
ll ans = 0;
ll time_cache[114514];
//既然一船好几个人,我们能不能把时间平分 ?不能
//但是我们可以搞一搞。。。伪动态的数组
int index_1[114514] = {0}; //该数组用来存储某艘船的k1
int cache = 0;
void work (person aa[],int k1){
//记录时间并加以比较
ll sum_time_1 = aa[0].time;
// cout << "sum_time_1="<<sum_time_1<<endl;
if(sum_time_1 + sum_time - time_cache[cache] >= limit_time){ // 准备弹出##这里如果去掉等号OJ也是40但是样例2过不了
// cout << "当前总时间为"<<sum_time+sum_time_1<<" 准备弹出第"<<cache+1<<"艘船"<<endl;
person y[index_1[cache]]; //我们要弹出的是最先进入队列的一个数组
int k2 = index_1[cache]; //把这个数组的长度提取出来
for(int i = 0; i< k2;i++){
y[i] = n.front(); //提取
n.pop(); //连续执行k2次
}
//将时间减掉
sum_time -= y[0].time; //数组每个结构体时间一样
//开始执行各项操作
for(int i = 0; i < k2;i++){ //循环k2次
national[y[i].nation] --; //减去国籍人数
if(national[y[i].nation] == 0){ //判断是否减没了一个国家[doge]
// cout << "当前" << y[i].nation << " 号国籍为0,答案减一" <<endl;
ans--; //答案减一
// cout << "当前答案为:" << ans << endl;
}
}
cache ++; //下次就是第二艘船了嘿嘿嘿
}
sum_time += sum_time_1;
// cout << "当前总时间为" <<sum_time << endl;
// cout << "进入"<<endl;
for(int i = 0; i< k1;i++){
n.push(aa[i]);
// cout <<"第"<< i<<"个人入队完毕"<<endl;
if(national[aa[i].nation] == 0){
ans++;
national[aa[i].nation]++;
// cout<<"当前"<<aa[i].nation<< "号国籍人数为:"<< national[aa[i].nation]<<endl;
// cout << "答案增加,现在答案为"<< ans <<endl;
}else{
// cout<<"当前"<<aa[i].nation<< "号国籍人数为:"<< national[aa[i].nation]<<endl;
national[aa[i].nation]++;
}
}
// cout <<"结束"<<endl;
return;
}
int N;
int ti,ki;
int main()
{
cin >> N;
int temp_time;
for(int i = 0; i< N;i++){
cin >> ti >> ki;
person aa[ki];
index_1[i] = ki; //记录当前ki
for(int j = 0; j < ki;j++){
cin >> aa[j].nation;
aa[j].time = ti-temp_time;
temp_time = ti;
time_cache[i] = ti;
}
work(aa,ki);
cout << ans<<endl;
}
return 0;
}