結果
| 問題 |
No.953 席
|
| コンテスト | |
| ユーザー |
ngtkana
|
| 提出日時 | 2020-04-12 00:10:25 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,190 bytes |
| コンパイル時間 | 2,756 ms |
| コンパイル使用メモリ | 214,436 KB |
| 最終ジャッジ日時 | 2025-01-09 17:30:50 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 7 WA * 18 |
ソースコード
#include<bits/stdc++.h>
#define ALL(v) std::begin(v),std::end(v)
using lint=long long;
using ld=long double;
int main(){
std::cin.tie(nullptr);std::ios_base::sync_with_stdio(false);
std::cout.setf(std::ios_base::fixed);std::cout.precision(15);
lint n,k0,k1,q;std::cin>>n>>k0>>k1>>q;k0--,k1--;
std::vector<std::tuple<lint,lint,lint>>events;
for(lint i=0;i<q;i++){
lint a,b;std::cin>>a>>b;
events.emplace_back(a+b,0,i);
events.emplace_back(a,1,i);
}
auto dist_to_exit=[&](lint x){return std::abs(3*x-(2*k0+k1));};
auto nearer=[&](lint x,lint y){return dist_to_exit(x)<dist_to_exit(y);};
using nearer_t=std::decay_t<decltype(nearer)>;
std::sort(ALL(events));
std::deque<lint>wait;
std::vector<lint>ans(q),ckd(n,-1);
std::array<std::set<lint,nearer_t>,2>sets{std::set<lint,nearer_t>(nearer),std::set<lint,nearer_t>(nearer)};
for(lint i=0;i<n;i++)sets.at(0).insert(i);
auto update=[&](lint i){
for(auto&&set:sets)if(auto f=set.find(i);f!=set.end())set.erase(f);
if(ckd.at(i)!=-1)return;
sets.at((i==0||ckd.at(i-1)==-1)&&(i==n-1||ckd.at(i+1)==-1)?0:1).insert(i);
};
auto update_three=[&](lint i){
if(i)update(i-1);
update(i);
if(i!=n-1)update(i+1);
};
for(lint l=0,r=0;l<2*q;l=r){
for(r=l;r<2*q&&std::get<0>(events.at(l))==std::get<0>(events.at(r));r++);
for(;l<r&&std::get<1>(events.at(l))==0;l++){
lint i=std::get<2>(events.at(l));
ckd.at(ans.at(i))=-1;
update_three(ans.at(i));
}
for(;l<r;l++){
lint i=std::get<2>(events.at(l));
wait.push_back(i);
}
while(!wait.empty()){
bool found=false;
for(auto&&set:sets){
if(set.empty())continue;
lint i=wait.front();wait.pop_front();
lint a=*set.begin();
set.erase(set.begin());
ans.at(i)=a;
ckd.at(a)=i;
update_three(ans.at(i));
found=true;
break;
}
if(!found)break;
}
}
for(lint x:ans){
std::cout<<x+1<<'\n';
}
}
/*
* ans[ 人 ] = 座った席です。
* ckd[ 席 ] = 人が座っていれば true です。
* set[ 0 ] = 両隣の空いている席の集合です。(入り口に近い順です。)
* set[ 1 ] = 隣に人が座っているけれども空いている席の集合です。
* wait = 待っている人の集合を、キューで管理です。
*
* * 退店
* まず、その人の席を特定です。
* ckd を更新し、両隣含めた 3 席の set を更新です。
* 待っている方がいらしても、まだお待ちいただきましょう。
*
* * 来店
* 空いていても問答無用で列に並んでいただきましょう。
*
* * 待ちの解消
* 待っている方がいらして、また席があいていれば埋めるをします。
* 具体的には、まず wait から人を pop します。
* 空いている席を探します。
* ckd を更新し、両隣含めた 3 席の set を更新です。
*
*/
ngtkana