題意:描述的比較清楚,就不翻譯了。
思路:根據題意我們發現是關於快排的時間複雜度的問題,我們定義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的整數倍。因為在這之後另乙個人無論說幾...