結果
| 問題 |
No.1282 Display Elements
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-11-06 21:44:52 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 86 ms / 2,000 ms |
| コード長 | 5,792 bytes |
| コンパイル時間 | 1,809 ms |
| コンパイル使用メモリ | 176,888 KB |
| 実行使用メモリ | 9,472 KB |
| 最終ジャッジ日時 | 2024-07-22 12:34:39 |
| 合計ジャッジ時間 | 3,310 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 24 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#pragma region atcoder
/*#include <atcoder/all>
using namespace atcoder;*/
//using mint = modint998244353;
//using mint = modint1000000007;
#pragma endregion
#pragma region macros
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using vi = vector<int>;
using vs = vector<string>;
using vl = vector<ll>;
using vb = vector<bool>;
using vvi = vector<vector<int>>;
using vvl = vector<vector<ll>>;
#define rep(i, n) for(int i = 0; i < n; i++)
#define REP(i, a, b) for(int i = a; i < b; i++)
#define rrep(i, n) for(int i = n - 1; i >= 0; i--)
#define RREP(i, a, b) for(int i = b - 1; i >= a; i--)
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define sz(x) ((int)(x).size())
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define fi first
#define se second
#pragma endregion
#pragma region debug for var, v, vv
#define debug(var) do{std::cout << #var << " : ";view(var);}while(0)
template<typename T> void view(T e){std::cout << e << std::endl;}
template<typename T> void view(const std::vector<T>& v){for(const auto& e : v){ std::cout << e << " "; } std::cout << std::endl;}
template<typename T> void view(const std::vector<std::vector<T> >& vv){cout << endl;int cnt = 0;for(const auto& v : vv){cout << cnt << "th : "; view(v); cnt++;} cout << endl;}
#pragma endregion
#pragma region int128
std::ostream &operator<<(std::ostream &dest, __int128_t value) {
std::ostream::sentry s(dest);
if (s) {
__uint128_t tmp = value < 0 ? -value : value;
char buffer[128];
char *d = std::end(buffer);
do {
--d;
*d = "0123456789"[tmp % 10];
tmp /= 10;
} while (tmp != 0);
if (value < 0) {
--d;
*d = '-';
}
int len = std::end(buffer) - d;
if (dest.rdbuf()->sputn(d, len) != len) {
dest.setstate(std::ios_base::badbit);
}
}
return dest;
}
#pragma endregion
const ll mod = 1000000007;
const int inf = 1001001001;
const ll INF = 1001001001001001001;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
template<class T>bool chmax(T &a, const T b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T b) { if (b<a) { a=b; return 1; } return 0; }
ll rudiv(ll a, ll b) { return a/b+((a^b)>0&&a%b); } // 20 / 3 == 7
ll rddiv(ll a, ll b) { return a/b-((a^b)<0&&a%b); } // -20 / 3 == -7
ll power(ll a, ll p){ll ret = 1; while(p){if(p & 1){ret = ret * a;} a = a * a; p >>= 1;} return ret;}
ll modpow(ll a, ll p){ll ret = 1; while(p){if(p & 1){ret = ret * a % mod;} a = a * a % mod; p >>= 1;} return ret;}
/*--------------------------------------------------------------------------------------------------------------------------------*/
// 0-indexed
template<class T> struct BIT{
vector<T> data;
vector<vector<T>> data2;
int _n, _n1, _n2, cnt;
BIT(int n) : _n(n), data(n) {
cnt = 1;
while(cnt < n) cnt *= 2;
};
BIT(int n1, int n2) : _n1(n1), _n2(n2) {
data2.resize(_n1);
for(int i = 0; i < n1; i++) data2[i].resize(_n2, 0);
};
void add(int p, T x = 1){
assert(0 <= p && p < _n);
p++;
while(p <= _n){
data[p - 1] += x;
p += p & -p;
}
}
//[l, r)
T sum(int l, int r){
assert(0 <= l && l <= r && r <= _n);
return sum(r) - sum(l);
}
//[0, r)
T sum(int r){
T sum = 0;
while(r > 0){
sum += data[r - 1];
r -= r & -r;
}
return sum;
}
//V0 + V1 + ... + Vpos >= val の posを返す
int lower_bound(T val){
if(val <= 0) return 0;
int pos = 0;
for(int k = cnt; k > 0; k /= 2){
if(pos + k <= _n && data[pos + k - 1] < val){
val -= data[pos + k - 1];
pos += k;
}
}
return pos;
}
void add_2D(int x, int y, T val){
assert(0 <= x && x < _n1 && 0 <= y && y < _n2);
x++, y++;
for(int i = x; i <= _n1; i++){
for(int j = y; j <= _n2; j++){
data2[x - 1][y - 1] += val;
}
}
}
//[0, x][0, y]
T sum_2D(int x, int y){
assert(0 <= x && x < _n1 && 0 <= y && y < _n2);
T sum = 0;
x++, y++;
for(int i = x; i >= 0; i -= i & -i){
for(int j = y; j >= 0; j -= j & -j){
sum += data2[i][j];
}
}
return sum;
}
};
/**
* Coordinate Compresison
* O(nlogn) complexity
* In this function, X will be replaced by the compressed vector starting from 0
* you can get the original element using vector vals
**/
template <typename T>
vector<T> compress(vector<T> &X){
vector<T> vals = X;
// sort vals
sort(vals.begin(), vals.end());
// delete the adjacent repeating number and remove the garbage in the back.
vals.erase(unique(vals.begin(), vals.end()), vals.end());
// do binary search for each element and ask for the position of it
for(int i = 0; i < X.size(); i++){
X[i] = lower_bound(vals.begin(), vals.end(), X[i]) - vals.begin();
}
return vals;
}
int main() {
cin.tie(0);
ios::sync_with_stdio(false);
cout << fixed << setprecision(15);
int n; cin >> n;
BIT<ll> bit(2*n);
vl a(n), b(n);
rep(i,n) cin >> a[i];
rep(i,n) cin >> b[i];
vl tmp(2*n);
rep(i,n) tmp[i] = a[i];
REP(i,n,2*n) tmp[i] = b[i - n];
compress(tmp);
rep(i,n) a[i] = tmp[i];
sort(all(a));
ll ans = 0;
for(int i = 0; i < n; i++){
bit.add(tmp[i + n], 1);
ans += bit.sum(a[i]);
}
cout << ans << endl;
}
/*
* review you code when you get WA (typo? index?)
* int overflow, array bounds
* special cases (n=1?)
*/