結果
| 問題 |
No.808 Kaiten Sushi?
|
| コンテスト | |
| ユーザー |
沙耶花
|
| 提出日時 | 2020-12-08 14:28:57 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 891 ms / 2,000 ms |
| コード長 | 1,603 bytes |
| コンパイル時間 | 2,456 ms |
| コンパイル使用メモリ | 206,788 KB |
| 最終ジャッジ日時 | 2025-01-16 19:41:32 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge6 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 56 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:27:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
27 | scanf("%lld",&V[i].first);
| ~~~~~^~~~~~~~~~~~~~~~~~~~
main.cpp:32:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
32 | scanf("%lld",&V[i+N].first);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include <bits/stdc++.h>
#include <atcoder/segtree>
using namespace atcoder;
using namespace std;
#define rep(i,n) for (int i = 0; i < (n); ++i)
#define Inf 1000000000000000000
array<int,2> op(array<int,2> a,array<int,2> b){
rep(i,2)a[i] = max(a[i],b[i]);
return a;
}
array<int,2> e(){
return array<int,2>{-1,-1};
}
int main(){
int N;
cin>>N;
long long L;
cin>>L;
vector<pair<long long,int>> V(2*N);
rep(i,N){
scanf("%lld",&V[i].first);
V[i].second = 0;
}
rep(i,N){
scanf("%lld",&V[i+N].first);
V[i+N].second = 1;
}
sort(V.begin(),V.end());
vector<array<int,2>> y(4*N,e());
rep(i,2*N){
y[i][V[i].second] = i;
y[i+2*N][V[i].second] = 2*N+i;
}
segtree<array<int,2>,op,e> seg(y);
vector<int> ans;
int now = 0;
while(ans.size()!=2*N){
int temp = 0;
if(ans.size()>0)temp = ans.back();
int ok = 4*N,ng = temp;
while(ok-ng>1){
int mid = (ok+ng)/2;
array<int,2> ret = seg.prod(temp,mid);
if(ret[now]==-1)ng = mid;
else ok = mid;
}
int x;
{
array<int,2> ret = seg.prod(temp,ok);
x = ret[now^1];
}
ok = temp,ng = 4*N;
while(ng-ok>1){
int mid = (ok+ng)/2;
array<int,2> ret = seg.prod(temp,mid);
if(ret[now^1]<=x)ok = mid;
else ng = mid;
}
array<int,2> ret = seg.prod(temp,ok);
x = ret[now]%(2*N);
ans.push_back(x);
seg.set(x,e());
seg.set(x+2*N,e());
now ^= 1;
}
long long Ans = 0LL;
rep(i,2*N){
if(i==0)Ans += V[ans[i]].first;
else{
long long temp = V[ans[i]].first - V[ans[i-1]].first;
if(temp<0)temp += L;
Ans += temp;
}
}
cout<<Ans<<endl;
return 0;
}
沙耶花