20171018校內模擬賽

2022-09-18 09:00:59 字數 4145 閱讀 8156

評測機效率約為4e8,開啟o2優化,開大棧空間,t1 時限1s,t2/3 時限均為 2s,記憶體限制為128mb。

小z厭惡數學,他決定將數學課本切成一塊一塊的。他的課本是乙個n*m的矩形,小z決定切k刀,每刀他可以橫著切或者豎著切,但是切成的矩形的長和寬都必須是整數。當然,小z不會做出兩次相同的操作。

不巧的是,小z的數學老師知道了他這個行為,並且刁鑽的老師肯定會找到切出的矩形中面積最小的那一塊來d他,所以小z想知道最優情況下面積最小的那一塊面積最大能是多少?

輸入資料只包含一行三個整數n,m,k,含義如題目所述。

輸出乙個數字,表示答案。如果沒有合法的方案,輸出-1。

6 4 2

subtask1 (20 points) 滿足 \(n,m \leq 10\)

subtask2 (20 points) 滿足\(n,m \leq 5000\)

subtask3 (20 points) 滿足\(n,m \leq 10^7\)

subtask4 (40 points) 滿足\(n,m \leq 10^9\)

可以簡單的證明出,如果切割次數允許只在同乙個方向切,肯定是最優的,

否則,肯定是將長邊切滿之後再切短邊最優,因此只需要使得切的邊最小的盡可能大,所以要盡量等分,最後計算一下答案就好了。

時空複雜度均為\(o(1)\)

#include #define r register

#define ll long long

#define ak_titoly ditoly

#define max(a,b) ((a)>(b)?(a):(b))

#define file(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);

inline int read()

int n,m,k;

int main()

小z最喜歡陣列了,現在他得到了由n個正整數組成的陣列ai,他想構造乙個相同大小的正整數陣列bi滿足兩個陣列的差異度\(\sigma |ai -bi|\)最小。特殊的是,bi陣列的所有元素必須滿足兩兩互質。

第一行乙個數n,表示陣列大小。

接下來一行n個正整數ai,表示給定的陣列。

輸出一行n個正整數bi,表示答案。

輸出的數字必須滿足\(1 \leq bi \leq 10^9\)。如果有多個答案,你可以輸出任意乙個。

1 6 4 2 8

1 5 4 1 9

subtask1 (20points) 滿足$ n \leq 8 , 1 \leq ai \leq 5$

subtask2 (30points) 滿足$ n \leq 50 , 1 \leq ai \leq 15$

subtask3 (50points) 滿足$ n \leq 100 , 1 \leq ai \leq 30$

容易發現\(1 \leq bi \leq 58\),如果\(bi>58\) 可以證明用1替代是等價或更優的,顯然,58以內的所有質數只能在整個序列中作為最多乙個數的質因子出現,經計算的,58以內的質數個數為16個,故所有質數的狀態只有\(2^\)種情況,考慮狀態壓縮,預處理出1~58中每個數所擁有的質因子集合,使用狀態壓縮dp即可通過。狀態轉移方程為:$$f[i][s|set[j]]=f[i-1][s]+|ai-j|(1 \leq j \leq 58 \vee set[j]\cap s = \phi )$$

​ 其中\(set[j]\)表示j含有的質因數集合,\(f[i][s]\)表示前i個位置,質因數狀態為s的最優答案。

總複雜度為\(o(58n*2^)/o(n*2^)\)。

#include #include #define r register

#define mn 105

#define inf 0x3f3f3f3f

#define ak_titoly ditoly

#define file(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);

inline int read()

inline int abs(int x)

int a[mn],f[mn][1<<16],pre[mn][1<<16],set[mn],n,pn,ans=0,b[mn];

bool ud[mn];

void init()

l國包含n個城市和m條雙向道路,第i條道路連線ui,vi兩個城市,距離為ti,這些道路將所有n個城市連線在一起。明年,l國將會在首都,也就是1號城市舉辦一年一度的noi,所以l國的國王委託小z新建一些道路來減少一些城市到達首都的距離。小z很快修好了道路,但是他卻不是很滿意。他想知道最多可以少新建多少道路,滿足首都到所有城市的最短路長度和現在相同。

第一行讀入三個數字n,m,k,依次表示城市的數量,原有道路的數量和新建道路的數量。

接下來m行,每行三個數字ui,vi,ti,表示一條原有的道路

最後k行,每行兩個數字si,wi,表示一條新建的道路連線1和si,距離為wi。

輸出乙個整數,表示最多能少修建多少條新建的道路。

3 2 2

1 2 1

2 3 1

2 23 1

對於20%的資料,滿足\(n,m,k \leq 100\);

另有20%的資料,滿足\(k \leq 4\)

對於100%的資料,滿足\(n,k \leq 50000 , m \leq 200000 , 1 \leq ti,wi \leq 10^9 si \geq 2\)

考慮一條新建的邊一定會被修建的原因,顯然是因為2個原因:

1.從1號點到這條邊的另一端的最短路被修改了

2.最短路一定包含新的修建的邊

考慮如何維護上述兩種情況,顯然,只需要求一次原先的最短路,然後求一下現今的最短路,維護新最短路的前驅,並且判斷多條最短路時,前驅優先選擇非1號點的即可,事實上,由於我們在跑最短路時,1號點只會在開始時更新1次,故只需要在最短路更新或相等時,修改前驅即可。

總複雜度為$o((m+k) \log n) / o(n+m+k) $

#include #include #define mn 50005

#define mm 200005

#define m (1<<16)

#define r register

#define ll long long

#define inf 0x3f3f3f3f

#define inf 0x3f3f3f3f3f3f3f3fll

#define ak_titoly ditoly

#define file(f) freopen(#f".in","r",stdin);freopen(#f".out","w",stdout);

inline int read()

inline int min(r int a,r int b)

inline void dij(int u,ll *dis) }}

int main()dij(1,dis);for (r int i=1; i<=k; ++i)dij(1,dis2);for (r int i=2; i<=n; ++i)

if (dis2[i]printf("%d\n",k-ans);

return 0;

}

2018 10 12 校內模擬賽

分析 題一 一道模擬題 但模擬也是有很多坑的 寫出一道題後,一定要自己試很多很多很多組不同的資料 比如這道題,幾乎我試的每一組資料都找出了我程式的bug,好險 分析 題二 好題!應該是和松鼠聚會這道題本質一樣的 首先我們需要推導出任意兩個點 x,y a,b 之間能夠到達彼此所需要走的最短步數,由於可...

1105 校內模擬賽

題一 差分約束or帶權並查集?不啊,zz了,簡單模擬即可 我簡直服了我自己了,想複雜了 直接對每乙個聯通塊隨便找乙個點賦位置,然後dfs繼續找下去,給每乙個點賦值,如果在搜尋的過程中,發現了有衝突,就是impossible了 注意加邊的時候加雙向邊,因為你是從隨便乙個點開始搜尋的 然後這麼簡單的乙個...

2018 9 27 校內模擬賽

a dna 題目大意 給定乙個長度為n,每項值為1或2的數列。有q次詢問,對於每次詢問回答乙個區間 l,r 使得區間內的和等於xi。時間限制 1000ms 空間限制 256mb 編譯指令 開啟o2和c 11 solution 容易發現,若存在乙個權值和為 x x 2 的串,必然存在乙個權值和 為 x...