link:
時間限制:
10000ms
單點時限:
1000ms
記憶體限制:
256mb
描述在上一回、上上回以及上上上回里我們知道nettle在玩《艦これ》。經過了一番苦戰之後,nettle又獲得了的很多很多的船。
這一天nettle在檢查自己的艦隊列表:
我們可以看到,船預設排序是以等級為引數。但實際上乙個船的火力值和等級的關係並不大,所以會存在a船比b船等級高,但是a船火力卻低於b船這樣的情況。比如上圖中77級的飛龍改二火力就小於55級的夕立改二。
現在nettle將按照等級高低的順序給出所有船的火力值,請你計算出一共有多少對船滿足上面提到的這種情況。
輸入第1行:1個整數n。n表示艦船數量, 1≤n≤100,000
第2行:n個整數,第i個數表示等級第i低的船的火力值a[i],1≤a[i]≤2^31-1。
輸出第1行:乙個整數,表示有多少對船滿足「a船比b船等級高,但是a船火力低於b船」。
樣例輸入
10樣例輸出1559614248 709366232 500801802 128741032 1669935692 1993231896 369000208 381379206 962247088 237855491
27樹狀陣列:
#include #include #include #define maxn 500005
using namespace std;
int n;
struct node
input[maxn]; //儲存輸入的陣列
int aa[maxn]; //儲存離散化操作後的結果
int cmp(const void* a, const void* b) //離散化操作時排序用
//標準的樹狀陣列的操作
///int c[maxn]; //這個就是樹狀陣列, 每次開始時都清零
int lowbit(int x)
void update(int n, int delta)
}int getsum(int n)
return result;
}int main()
qsort(&input[1], n, sizeof(node), cmp);
for(i = 1; i<= n; i++) aa[input[i].num] = i;
//運用樹狀陣列這個資料結構的操作來計算逆序數
for(i = 1; i<= n; i++)
c[i] = 0;
long long result = 0;
for(i = 1; i<= n; i++)
cout << result << endl;
}return 0;
}
歸併排序:
#include #include #include using namespace std;
const int n = 100010;
int a[n],tmp[n];
long long ans;
void merge(int l,int m,int r)
else
}while(i <= m) tmp[k++] = a[i++];
while(j <= r) tmp[k++] = a[j++];
for(int i=l;i<=r;i++)
a[i] = tmp[i];
}void merge_sort(int l,int r)
}int main()
{ //freopen("d:\\in.txt","r",stdin);
int n,t,tt=1;
// scanf("%d",&t);
// while(t--)
//{while(~scanf("%d",&n))
{ for(int i=0;i
樹狀陣列模板 逆序對
顧名思義,lowbit這個函式的功能就是求某乙個數的二進位制表示中最低的一位1,舉個例子,x 6,它的二進位制為110,那麼lowbit x 就返回2,因為最後一位1表示2。求lowbit的兩種方法 int lowbit x int lowbit x c i 代表 子樹的葉子結點的權值之和 c 1 ...
求逆序對 樹狀陣列 歸併排序模板
ps 但資料大的時候,需要離散化陣列會多乙個排序的複雜的,其實還不如歸併找逆序對塊 歸併找逆序對也是o n logn 樹狀陣列 include include include include include include includeusing namespace std const int i...
樹狀陣列 模板3 求逆序對(非離散化)
離散化的樹狀陣列 這裡就提一下和普通樹狀陣列的區別,這裡是用要查詢的數當作下標,而普通樹狀陣列是直接順序下標放值,也就是說區別在於 updata函式,普通的是updata i,k 這裡的i就單純是區間下標 而求逆序對的時候是updata a i 1 我們每次都是在這個數字大小的位置上新增1,然後去更...