Submission #8316658


Source Code Expand

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
#define REP(i,n) for(int i=0,_n=(int)(n);i<_n;++i)
#define ALL(v) (v).begin(),(v).end()
#define CLR(t,v) memset(t,(v),sizeof(t))
template<class T1,class T2>ostream& operator<<(ostream& os,const pair<T1,T2>&a){return os<<"("<<a.first<<","<<a.second<< ")";}
template<class T>void pv(T a,T b){for(T i=a;i!=b;++i)cout<<(*i)<<" ";cout<<endl;}
template<class T>void chmin(T&a,const T&b){if(a>b)a=b;}
template<class T>void chmax(T&a,const T&b){if(a<b)a=b;}

int nextInt() { int x; scanf("%d", &x); return x;}
ll nextLong() { ll x; scanf("%lld", &x); return x;}

struct BIT {
  using Val = int;
  int n;
  vector<Val> tree;
  BIT(int n):n(n),tree(n+1) {}
  void fill(Val val) {
    REP(i, n+1) tree[i] = (i&-i) * val;
  }
  void add(int idx, Val val) {
    for (int x=idx+1; x<=n; x+=x&-x) tree[x] += val;
  }
  // sum[0, idx]
  Val range(int idx) {
    Val sum=0;
    for (int x=idx+1; x>0; x-=x&-x) sum += tree[x];
    return sum;
  }
};

const int INF = 1001001001;
const int MAX_N = 2005;
int dp[MAX_N][MAX_N];
int idx_b[MAX_N];
int idx_w[MAX_N];
int bb[2*MAX_N][MAX_N]; // bb[i][j] := 元の列のi番目より左にある B のうち番号が j より大きいものの個数。
int ww[2*MAX_N][MAX_N];

int main2() {
  int N = nextInt();
  vector<char> c(2*N);
  vector<int> a(2*N);

  REP(i, 2*N) {
    cin >> c[i] >> a[i];
    if (c[i] == 'B') {
      idx_b[a[i]] = i;
    } else {
      idx_w[a[i]] = i;
    }
  }

  {
    CLR(bb, 0);
    BIT bit(2*N+10);
    int s = 0;
    REP(i, 2*N) {
      if (c[i] == 'B') {
        bit.add(a[i], 1);
        s++;
      }
      for (int j = 0; j <= N; j++) {
        bb[i][j] = s - bit.range(j);
      }
    }
  }
  {
    CLR(ww, 0);
    BIT bit(2*N+10);
    int s = 0;
    REP(i, 2*N) {
      if (c[i] == 'W') {
        bit.add(a[i], 1);
        s++;
      }
      for (int j = 0; j <= N; j++) {
        ww[i][j] = s - bit.range(j);
      }
    }
  }

  REP(i, MAX_N) REP(j, MAX_N) dp[i][j] = INF;
  dp[0][0] = 0;
  REP(w, N+1) REP(b, N+1) {
    if (w == 0 && b == 0) continue;
    int val = INF;
    if (w - 1 >= 0) {
      int i = idx_w[w];
      int cost = bb[i][b] + ww[i][w];
      chmin(val, dp[w-1][b] + cost);
    }
    if (b - 1 >= 0) {
      int i = idx_b[b];
      int cost = bb[i][b] + ww[i][w];
      chmin(val, dp[w][b-1] + cost);
    }
    dp[w][b] = val;
  }
  int ans = dp[N][N];
  cout << ans << endl;
  return 0;
}

int main() {

#ifdef LOCAL
  for (;!cin.eof();cin>>ws)
#endif
    main2();
  return 0;
}

Submission Info

Submission Time
Task E - Sorted and Sorted
User hs484
Language C++14 (GCC 5.4.1)
Score 600
Code Size 2650 Byte
Status AC
Exec Time 132 ms
Memory 78848 KB

Compile Error

./Main.cpp: In function ‘int nextInt()’:
./Main.cpp:13:39: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
 int nextInt() { int x; scanf("%d", &x); return x;}
                                       ^
./Main.cpp: In function ‘ll nextLong()’:
./Main.cpp:14:40: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
 ll nextLong() { ll x; scanf("%lld", &x); return x;}
                                        ^

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status
AC × 3
AC × 36
Set Name Test Cases
Sample 0_000.txt, 0_001.txt, 0_002.txt
All 0_000.txt, 0_001.txt, 0_002.txt, 1_003.txt, 1_004.txt, 1_005.txt, 1_006.txt, 1_007.txt, 1_008.txt, 1_009.txt, 1_010.txt, 1_011.txt, 1_012.txt, 1_013.txt, 1_014.txt, 1_015.txt, 1_016.txt, 1_017.txt, 1_018.txt, 1_019.txt, 1_020.txt, 1_021.txt, 1_022.txt, 1_023.txt, 1_024.txt, 1_025.txt, 1_026.txt, 1_027.txt, 1_028.txt, 1_029.txt, 1_030.txt, 1_031.txt, 1_032.txt, 1_033.txt, 1_034.txt, 1_035.txt
Case Name Status Exec Time Memory
0_000.txt AC 22 ms 78720 KB
0_001.txt AC 22 ms 78720 KB
0_002.txt AC 22 ms 78720 KB
1_003.txt AC 22 ms 78720 KB
1_004.txt AC 22 ms 78720 KB
1_005.txt AC 22 ms 78720 KB
1_006.txt AC 22 ms 78720 KB
1_007.txt AC 22 ms 78720 KB
1_008.txt AC 22 ms 78720 KB
1_009.txt AC 22 ms 78720 KB
1_010.txt AC 22 ms 78720 KB
1_011.txt AC 22 ms 78720 KB
1_012.txt AC 21 ms 78720 KB
1_013.txt AC 22 ms 78720 KB
1_014.txt AC 104 ms 78848 KB
1_015.txt AC 31 ms 78848 KB
1_016.txt AC 81 ms 78848 KB
1_017.txt AC 44 ms 78848 KB
1_018.txt AC 22 ms 78720 KB
1_019.txt AC 28 ms 78848 KB
1_020.txt AC 92 ms 78848 KB
1_021.txt AC 47 ms 78848 KB
1_022.txt AC 33 ms 78848 KB
1_023.txt AC 82 ms 78848 KB
1_024.txt AC 127 ms 78848 KB
1_025.txt AC 129 ms 78848 KB
1_026.txt AC 129 ms 78848 KB
1_027.txt AC 129 ms 78848 KB
1_028.txt AC 129 ms 78848 KB
1_029.txt AC 130 ms 78848 KB
1_030.txt AC 130 ms 78848 KB
1_031.txt AC 130 ms 78848 KB
1_032.txt AC 131 ms 78848 KB
1_033.txt AC 130 ms 78848 KB
1_034.txt AC 132 ms 78848 KB
1_035.txt AC 131 ms 78848 KB