結果

問題 No.808 Kaiten Sushi?
ユーザー rickythetarickytheta
提出日時 2019-03-22 22:28:32
言語 C++11
(gcc 11.4.0)
結果
WA  
実行時間 -
コード長 3,078 bytes
コンパイル時間 1,968 ms
コンパイル使用メモリ 168,928 KB
実行使用メモリ 17,392 KB
最終ジャッジ日時 2023-10-19 09:47:26
合計ジャッジ時間 25,014 ms
ジャッジサーバーID
(参考情報)
judge11 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 WA -
testcase_01 AC 2 ms
4,348 KB
testcase_02 WA -
testcase_03 AC 1 ms
4,348 KB
testcase_04 AC 2 ms
4,348 KB
testcase_05 WA -
testcase_06 WA -
testcase_07 AC 7 ms
4,348 KB
testcase_08 AC 8 ms
4,348 KB
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 AC 53 ms
4,348 KB
testcase_18 AC 14 ms
4,348 KB
testcase_19 AC 4 ms
4,348 KB
testcase_20 AC 17 ms
4,348 KB
testcase_21 AC 5 ms
4,348 KB
testcase_22 AC 14 ms
4,348 KB
testcase_23 AC 346 ms
7,884 KB
testcase_24 AC 237 ms
7,084 KB
testcase_25 AC 287 ms
7,628 KB
testcase_26 AC 267 ms
7,420 KB
testcase_27 TLE -
testcase_28 WA -
testcase_29 TLE -
testcase_30 WA -
testcase_31 TLE -
testcase_32 TLE -
testcase_33 WA -
testcase_34 WA -
testcase_35 WA -
testcase_36 WA -
testcase_37 AC 2 ms
4,348 KB
testcase_38 AC 2 ms
4,348 KB
testcase_39 TLE -
testcase_40 -- -
testcase_41 -- -
testcase_42 -- -
testcase_43 -- -
testcase_44 -- -
testcase_45 -- -
testcase_46 -- -
testcase_47 -- -
testcase_48 -- -
testcase_49 -- -
testcase_50 -- -
testcase_51 -- -
testcase_52 -- -
testcase_53 -- -
testcase_54 -- -
testcase_55 -- -
testcase_56 -- -
testcase_57 -- -
testcase_58 -- -
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:131:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  131 |   scanf("%d%d",&n,&l);
      |   ~~~~~^~~~~~~~~~~~~~
main.cpp:132:16: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  132 |   REP(i,n)scanf("%d",x+i);
      |           ~~~~~^~~~~~~~~~
main.cpp:133:16: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  133 |   REP(i,n)scanf("%d",y+i);
      |           ~~~~~^~~~~~~~~~

ソースコード

diff #

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;

typedef int _loop_int;
#define REP(i,n) for(_loop_int i=0;i<(_loop_int)(n);++i)
#define FOR(i,a,b) for(_loop_int i=(_loop_int)(a);i<(_loop_int)(b);++i)
#define FORR(i,a,b) for(_loop_int i=(_loop_int)(b)-1;i>=(_loop_int)(a);--i)

#define DEBUG(x) cout<<#x<<": "<<x<<endl
#define DEBUG_VEC(v) cout<<#v<<":";REP(i,v.size())cout<<" "<<v[i];cout<<endl
#define ALL(a) (a).begin(),(a).end()

#define CHMIN(a,b) a=min((a),(b))
#define CHMAX(a,b) a=max((a),(b))

// mod
const ll MOD = 1000000007ll;
#define FIX(a) ((a)%MOD+MOD)%MOD

// floating
typedef double Real;
const Real EPS = 1e-11;
#define EQ0(x) (abs(x)<EPS)
#define EQ(a,b) (abs(a-b)<EPS)
typedef complex<Real> P;

int n,l;
int x[125252], y[125252];
int ps[252521];

ll f(int z){
  set<int> S,T;
  REP(i,n)S.insert(x[i]);
  REP(i,n)T.insert(y[i]);
  ll ans = z;
  int pos = z;

  REP(i,n){
    // ocha
    {
      auto it = T.upper_bound(pos);
      if(it == T.begin()){
        ans += l;
        pos = l;
        it = T.end();
      }
      it--;
      if(T.size() >= 2 && S.size() >= 1){
        auto its = S.upper_bound(*it);
        bool lop = false;
        if(its==S.begin()){
          its=S.end();
          lop = true;
        }
        its--;
        int lim = *its;
        auto it2 = it;
        bool loop = false;
        while(true){
          if(it2==T.begin()){
            loop = true;
            it2 = T.end();
          }
          it2--;
          if(!lop && loop)break;
          if((lop && !loop) || *it2 > lim){
            it = it2;
            if(loop){
              ans += l;
            }
          }else{
            break;
          }
        }
      }
      pos = *it; T.erase(it);
    }
    // sushi
    swap(S,T);
    {
      auto it = T.upper_bound(pos);
      if(it == T.begin()){
        ans += l;
        pos = l;
        it = T.end();
      }
      it--;
      if(T.size() >= 2 && S.size() >= 1){
        auto its = S.upper_bound(*it);
        bool lop = false;
        if(its==S.begin()){
          its=S.end();
          lop = true;
        }
        its--;
        int lim = *its;
        auto it2 = it;
        bool loop = false;
        while(true){
          if(it2==T.begin()){
            loop = true;
            it2 = T.end();
          }
          it2--;
          if(!lop && loop)break;
          if((lop && !loop) || *it2 > lim){
            it = it2;
            if(loop){
              ans += l;
            }
          }else{
            break;
          }
        }
      }
      pos = *it; T.erase(it);
    }
    swap(S,T);
  }
  return ans;
}

int main(){
  scanf("%d%d",&n,&l);
  REP(i,n)scanf("%d",x+i);
  REP(i,n)scanf("%d",y+i);
  REP(i,n)ps[i] = y[i];
  sort(ps,ps+n);
  int ok = n-1, ng = -1;
  ll v = f(ps[ok]);
  while(abs(ok-ng)>1){
    int m = (ok+ng)/2;
    ll w = f(ps[m]);
    if(w < v){
      ok = m;
      v = w;
    }else{
      ng = m;
    }
  }
  printf("%lld\n",v);
  return 0;
}
0