2013 ACM ICPC 長沙網路賽B題解題報告

2021-06-18 11:35:15 字數 1454 閱讀 3117

題意:描述的比較清楚,就不翻譯了。

思路:根據題意我們發現是關於快排的時間複雜度的問題,我們定義dpmn(n)表示n個數的快排的最少的比較次數,定義dpmx(n)表示n個數的快排的最多的比較次數。定義集合s(n)為n個數的快排的比較次數的可能值是多少。

很容易發現s(1) = , s(2) = , s(3) = , s(4) = , s(5) = ... 通過觀察我們發現當n <= k 時s(n) = ( x 屬於整數)我們可以用數學歸納法容易的證明出當n = k + 1 是s(n)也滿足這個性質。

我們就能輕易的求出dpmn(n), dpmx(n)的值,根據上面的證明我們就能求出每個s(n)集合,也就是說n個數快排的比較次數的範圍了。

根據以上性質我們就可以用遞迴+二分的方法輕易的求出滿足要求的序列,或者直接求出不存在這樣的序列了。

**:

#pragma comment(linker, "/stack:1024000000,1024000000")

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

typedef pairpii;

typedef pairpll;

#define pb push_back

#define sz(x) ((x).size())

const int n = 100009;

const ll oo = 0x3f3f3f3f3f3f3f3fll;

int n, ex, a, b;

int dpmx[n], dpmn[n], a[n];

int dfsmx(int x)

int dfsmn(int x)

void print(int l, int r, int ex)

int k = (l * a + r * b) / (a + b);

int x = r - l;

ex -= x;

for(int i = 0; i <= x / 2; i++)

} if(ret == -1) continue;

print(l, l + i - 1, ret);

print(l + i + 1, r, ex - ret);

a[l + i] = l + i;

swap(a[l + i], a[r]);

if(k < i + l)

else

break; }}

int main()

print(0, n - 1, ex);

for(int i = 0; i < n; i++)

puts("");

} return 0;

}

2013 ACM ICPC 長沙網路賽J題

題意 乙個數列,給出這個數列中的某些位置的數,給出所有相鄰的三個數字的和,數列頭和尾處給出相鄰兩個數字的和。有若干次詢問,每次問某一位置的數字的最大值。分析 設數列為a1 an。首先通過相鄰三個數字的和我們可以求出a3,a6,a9 是多少。a3 sum a1,a2,a3 sum a1,a2 a6 s...

2013 ACM ICPC 南京網路賽F題

題意 給出乙個4 4的點陣,連線相鄰點可以構成乙個九宮格,每個小格邊長為1。從沒有邊的點陣開始,兩人輪流向點陣中加邊,如果加入的邊構成了新的邊長為1的小正方形,則加邊的人得分。構成幾個得幾分,最終完成九宮格時,誰的分高誰贏。現在給出兩人前若干步的操作,問接下來兩人都採取最優策略的情況下,誰贏。分析 ...

2013 ACM ICPC 長春網路賽F題

題意 兩個人輪流說數字,第乙個人可以說區間 1 k 中的乙個,之後每次每人都可以說乙個比前乙個人所說數字大一點的數字,相鄰兩次數字只差在區間 1 k 誰先 n,誰輸。問最後是第乙個人贏還是第二個人贏。第乙個人搶到n 1的方法,就是先說乙個數字與n 1的差是k 1的整數倍。因為在這之後另乙個人無論說幾...