2013 ACM ICPC 長沙網路賽J題

2022-09-15 06:00:09 字數 2478 閱讀 9615

題意:乙個數列,給出這個數列中的某些位置的數,給出所有相鄰的三個數字的和,數列頭和尾處給出相鄰兩個數字的和。有若干次詢問,每次問某一位置的數字的最大值。

分析:設數列為a1~an。首先通過相鄰三個數字的和我們可以求出a3,a6,a9……是多少。a3=sum(a1,a2,a3)-sum(a1,a2)。a6=sum(a4,a5,a6)-sum(a3,a4,a5)。後面依次類推。

推到了數列的最右面,如果恰好知道了an或者a(n-1)中的乙個,那麼可以通過sum(an,a(n-1))減去它來求得另乙個。

這個題還有個性質就是,只要知道數列中連續的兩位就可以通過不斷向兩側延伸的方法得到整個數列。因為任意相鄰三個的和都知道,知道其中兩個數自然可以得到第三個。

所以我們如果知道了最後兩位則一定可以知道整個數列。同樣如果根據已知的數列中的數和推出的數能得知兩個已知的相鄰的數的話,也可推出整個數列。

唯一一種無法確定該數列的情況就是我們,沒有推出最後的兩個數(即n%3==2的情況),且數列中已知給出的數也沒有提供任何推出資訊以外的資訊。

這時我們就獲得了乙個不確定的數列,將數列中的數字ai按照i%3結果的不同分成三組,得0則已知。

得1的數之間互相是同增同減的,因為他們互相之間的差是一樣的。a1-a4=sum(a1,a2,a3)-sum(a2,a3,a4)。得2的同理。所以這些同增同減的數字會同時取得最大值或最小值。

得1和得2的之間是此消彼漲的,因為他們互相之間的和是一樣的。a1+a2=sum(a1,a2)    a2+a4=sum(a2,a3,a4)-a3    a4+a5=sum(a3,a4,a5)-a3 所以得1的取得最小值則得2的取得最大值,反之亦然。

在符合了這些和與差的條件之後,唯一會導致數列不合法的情況就是出現負數。我們只需要先對得1的隨意娶個值,並推出整個數列後,根據最小數值調整所有得1的取值,使最小的那個數恰好為0。

這樣就可以使得1的取最小值,即讓得2的取得最大值。

同理可以求得得1的最大值。

儲存好各種最大值之後按題目中的詢問輸出即可。計算最大值需要o(n),每次詢問需要o(1),共m次詢問,總複雜度為o(n + m)。

#include #include 

#include

using

namespace

std;

#define max_num 100005

intarray[max_num], array1[max_num], array2[max_num];

intsum[max_num];

intnum;

intquery_num;

bool

filled;

void cal_left(int pos, int

array)

void cal_right(int pos, int

array)

void

input()

for (int i = 1; i <= num; i++)

scanf("%d

", &sum[i]);

array[

0] = 0

;

for (int i = 3; i <= num; i += 3

) array[i] = sum[i - 1] - (sum[i - 2] - array[i - 3

]);

if (num % 3 == 2 && pos == -1

)

return

; filled = true

;

if (array[num] != -1

) array[num - 1] = sum[num] -array[num];

if (array[num - 1] != -1

) array[num] = sum[num] - array[num - 1

];

if (array[num] != -1

) cal_left(num, array);

array[num + 1] = 0

;

if (pos != -1

)

}void

work()

if (a % 3 == 1

) printf(

"%d\n

", array1[a]);

else

if (a % 3 == 2

) printf(

"%d\n

", array2[a]);

else

printf(

"%d\n

", array[a]);

}}void

make2()

void

make1()

intmain()

work();

}return0;

}

view code

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

題意 描述的比較清楚,就不翻譯了。思路 根據題意我們發現是關於快排的時間複雜度的問題,我們定義dpmn n 表示n個數的快排的最少的比較次數,定義dpmx n 表示n個數的快排的最多的比較次數。定義集合s n 為n個數的快排的比較次數的可能值是多少。很容易發現s 1 s 2 s 3 s 4 s 5 ...

2013 ACM ICPC 南京網路賽F題

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

2013 ACM ICPC 長春網路賽F題

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