# 資料結構題 - 低地距離 - APCS - by Peter Wang
## 題目資訊
此題為2020.10測驗中的題目3
###### tags: `APCS` `D&C` `BIT`
## 題目敘述
輸入一個長度為 2n 的陣列,其中 1 ~ n 的每個數字都剛好各 2 次。
i 的低窪值的定義是兩個數值為 i 的位置中間,有幾個小於 i 的的數字。
以 $[3, 1, 2, 1, 3, 2] 為例,1的低窪值為 0, 2 的低窪值值為 1, 3 的低窪值為 3。
請對於每個 1 ~ n 的數字都求其低窪值(兩個相同的數字之間有幾個數字比它小),輸出低窪值的總和,答案可能會超過 C++ int 的上限。
### 輸入:
第一行有一個正整數 n
第二行有 2n 個正整數,以空格分隔,保證 1 n 每個數字都恰好出現兩次。
### 輸出:
輸出 1 ~ n 每個數字的低窪值總和。
## 解題思路
## 程式碼
```clike=
#include <iostream>
using namespace std;
#define ll long long
const int N = 200005;
int bit[N];
void add(int pos , ll val){
while(pos<N){
bit[pos]+=val;
pos+=pos & (-pos);
}
}
ll sum(int pos){
ll ans=0;
while(pos>0){
ans+=bit[pos];
pos-=pos & (-pos);
}
return ans;
}
int l[N],r[N];
int main(){
int n;
while(cin>>n){
for(int i=1;i<=2*n;i++){
int x;
cin>>x;
if(l[x]==0){
l[x]=i;
}
else{
r[x]=i;
}
}
ll ans=0;
for(int i=1;i<=n;i++){
ans+=sum(r[i])-sum(l[i]);
add(r[i],1);
add(l[i],1);
}
cout<<ans<<endl;
}
}
```
## 資料來源
[Zerojudge](https://zerojudge.tw/)
[題目敘述](https://zerojudge.tw/ShowProblem?problemid=f315)
## 備註
>[name=PeterWang]
>[time=Sun, Jun 13, 2021 9:58 AM]