xsy1061 排列 樹狀陣列

2022-05-03 19:00:08 字數 794 閱讀 4535

題目大意:給你乙個$1$到$n$的排列,問是否存在一對數$a,b(1≤a,b≤n,a≠b)$滿足$a+b$為偶數且$(a+b)/2$在$a$和$b$之間。

資料範圍:$n≤3\times 10^$。

$xfz$智商$=-1$系列題目

考慮到此題並沒有問你存在多少對,而是是否存在,所以不要往統計有多少對上想!

我們考慮已經加入了前i個數,當前加入的數為x,下面我們需要判斷是否存在有一對$a$,$b$滿足$a+b=2x$的情況

令$m=min(n-x,x-1)$,顯然滿足a+b=2x的$(a,b)$的對數至多為$m$對

我們令$s1$表示前$i$個數,數值在區間$[x+1,x+m]$中的個數,$s2$表示前i個數,數值在$[x-m,x-1]$中的個數。

不難發現,若$s1

$s1>s2$的情況類似。

所以就可以用樹狀陣列來統計了。

時間複雜度:$o(n\log\ n)$。

1 #include2

#define m 300005

3#define lowbit(x) ((x)&(-x))

4using

namespace

std;

5int a[m]=,n;

6void add(int x,int k)

7int sum(int x)

8int

main()

21if(ok) printf("

yes\n");

22else printf("

no\n");

23}24 }

hoj 1061 排列樹問題

problem c 排列樹問題 time limit 5000ms memory limit 65536k total submit 55 accepted 3 description 試設計乙個用回溯法搜尋排列空間樹的函式。該函式的引數包括結點可行性判定函式和上界函式等必要的函式,並將此函式用於解...

hdu 1716 排列2 排列組合

問題描述 ray又對數字的列產生了興趣 現有四張卡片,用這四張卡片能排列出很多不同的4位數,要求按從小到大的順序輸出這些4位數 input 每組資料佔一行,代表四張卡片上的數字 0 數字 9 如果四張卡片都是0,則輸入結束。output 對每組卡片按從小到大的順序輸出所有能由這四張卡片組成的4位數,...

197 排列序號

是 這道題採取暴力解法會超時,應當對於原陣列的每乙個位置找到其後有多少個數比它小,然後再相加這些數與對應的權的成績。class solution long long ans 1,fac 1,cc 1 for int i len 2 i 0 i ans fac cc c i return ans 注意...