結果
| 問題 |
No.1209 XOR Into You
|
| コンテスト | |
| ユーザー |
polyomino_24
|
| 提出日時 | 2020-09-06 17:23:31 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 260 ms / 2,000 ms |
| コード長 | 3,276 bytes |
| コンパイル時間 | 1,588 ms |
| コンパイル使用メモリ | 135,076 KB |
| 最終ジャッジ日時 | 2025-01-14 07:55:02 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 37 |
ソースコード
#include <algorithm>
#include <cassert>
#include <cctype>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <vector>
#include <list>
#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
//#define cerr if(false) cerr
#ifdef DEBUG
#define show(...) cerr << #__VA_ARGS__ << " = ", debug(__VA_ARGS__);
#else
#define show(...) 42
#endif
using namespace std;
using ll = long long;
using pii = pair<int, int>;
template <typename T, typename S>
ostream& operator<<(ostream& os, pair<T, S> a) {
os << '(' << a.first << ',' << a.second << ')';
return os;
}
template <typename T>
ostream& operator<<(ostream& os, vector<T> v) {
for (auto x : v) os << x << ' ';
return os;
}
void debug() {
cerr << '\n';
}
template <typename H, typename... T>
void debug(H a, T... b) {
cerr << a;
if (sizeof...(b)) cerr << ", ";
debug(b...);
}
template<typename T> class BIT {
private:
int n;
vector<T> bit;
public:
// 0_indexed で i 番目の要素に x を加える
void add(int i, T x){
i++;
while(i < n){
bit[i] += x, i += i & -i;
}
}
// 0_indexed で [0,i] の要素の和(両閉区間!!)
T sum(int i){
i++;
T s = 0;
while(i > 0){
s += bit[i], i -= i & -i;
}
return s;
}
BIT(){}
//初期値がすべて0の場合
BIT(int sz) : n(sz+1), bit(n, 0){}
BIT(const vector<T>& v) : n((int)v.size()+1), bit(n, 0){
for(int i = 0; i < n-1; i++){
add(i,v[i]);
}
}
void print(){
for(int i = 0; i < n-1; i++){
cout << sum(i) - sum(i-1) << " ";
}
cout << "\n";
}
//-1スタート
void print_sum(){
for(int i = 0; i < n; i++){
cout << sum(i-1) << " ";
}
cout << "\n";
}
};
// u を昇順にソートするのに必要な交換回数(転倒数) (u は {0,..., n-1} からなる重複を許した長さ n の数列)
long long inv_count(const vector<int>& u)
{
int n = (int)u.size();
BIT<int> bt(n);
long long ans = 0;
for(int i = 0; i < n; i++){
ans += i - bt.sum(u[i]);
bt.add(u[i], 1);
}
return ans;
}
int main(){
int n;
cin >> n;
vector<int>a(n);
vector<int>b(n);
rep(i,n)cin >> a[i];
rep(i,n)cin >> b[i];
if(a[0] != b[0] or a[n-1] != b[n-1]){
cout << -1 << endl;
return 0;
}
vector<int>c(n-1);
vector<int>d(n-1);
rep(i,n-1){
c[i] = a[i] ^ a[i+1];
d[i] = b[i] ^ b[i+1];
}
{
auto cc = c;
auto dd = d;
sort(cc.begin(), cc.end());
sort(dd.begin(), dd.end());
if(cc != dd){
cout << -1 << endl;
return 0;
}
}
vector<int> e(n-1);
map<int,vector<int>>mp;
rep(i,n-1){
mp[c[i]].push_back(i);
}
for(int i = n - 2; i >= 0; i--){
e[i] = mp[d[i]].back();
mp[d[i]].pop_back();
}
cout << inv_count(e) << endl;
}
polyomino_24