NOIP2018 解題報告

2021-09-27 18:50:14 字數 3578 閱讀 9934

這題就是noip2013 積木大賽原題=。=,貪心地想,如果 a

i>ai

−1a_i > a_

ai​>ai

−1​, ans

+=ai

−ai−

1ans+=a_i-a_

ans+=a

i​−a

i−1​

,因為搞 ai−

1a_ai−1

​ 的時候,能盡量搞 a

ia_i

ai​ 就搞 a

ia_i

ai​。

#include

#include

#include

using

namespace std;

int a[

100001

], max1, s;

intmain()

printf

("%d"

,s);

return0;

}

由於 b

bb 與 a

aa 等價且 b

bb 要盡量小,b

bb 肯定是 a

aa 的子集,其中對於 x∈a

,x∉b

x\in a,x \notin b

x∈a,x∈

/​b,x

xx 能用 b

bb 中的元素表示。

於是我們將 a

aa 排個序跑個揹包就可以了。

#include

using

namespace std;

int f[

25005

], a[

105]

, ans;

intmain()

printf

("%d\n"

, ans);}

return0;

}

要求最小的最大,於是我們二分。

那怎麼 che

ckcheck

chec

k 呢?

首先,如果是一條鏈的情況,明顯就是長度到了 t

tt 就 tot

+1tot+1

tot+1。

於是我們從下往上每到乙個分叉點,一定匯聚了多條長度小於 t

tt 的鏈,如圖。

紅色的是 3

33 條未到 t

tt 的鏈,顯然只有 1

11 條可以繼續往上延伸,其他鏈都要在這裡進行合併。於是我們就對每個節點維護乙個 mul

tise

tmultiset

multis

et,放置這些鏈。然後每次從這些鏈中貪心地合併,最後剩的最大那條鏈向上傳遞。這樣我們就保證了長度大於 t

tt 的鏈總數盡量大。

總結就是這道題用了幾個貪心:

第乙個是單鏈上要貪心,第二個是合併的時候要貪心,第三個是傳遞的時候要貪心,這些貪心保證了解的最優性。

#include

#define n 50005

#define inf 2147483647

using

namespace std;

struct noded[n *2]

;int h[n]

, cnt, n, m, t, f[n]

, tot;

intread()

voidcr(

int a,

int b,

int c)

void

dfs(

int a,

int p)

while

(!s.

empty()

) it = s.

lower_bound

(t -

*s.begin()

);if(it == s.

begin()

&& s.

count

(*it)==1

) it++;if

(it == s.

end())

else}}

intok

(int t)

intmain()

r /= m;

while

(l < r)

printf

("%d"

, l)

;return0;

}

這道題考的應該是邊排序,首先對 m=n

m = n

m=n 的情況,我們列舉斷掉的邊,那麼問題就變成了 m=n

−1m = n-1

m=n−

1 的情況。我們考慮在 o(n

)o(n)

o(n)

複雜度下解決 m=n

−1m = n - 1

m=n−

1的情況。

應該不難發現,題目中所得到的序列就是樹的 dfs

dfsdf

s 序,我們要讓字典序盡量小,只要讓每個節點訪問的點按從小到大排序就可以了。如何實現這個排序呢?

我的做法是先讓所有邊的出點按從小到大排序,然後單獨對每個點再來加邊(emmm我突然發現有點難說,大家看**吧

#include

#define n 10005

using

namespace std;

struct node

}d[n]

, e[n]

, re[n]

;int h[n]

, p[n]

, v[n]

, vis[n]

, n, cnt, ret, tot, ans[n]

;int mp[

5005][

5005];

voidcr(

int a,

int b)

void

crr(

int a,

int b)

void

dfs(

int a)

}void

dfs1

(int a)

}void

cmp()if

(vis[i]

> ans[i]

)return;}

}int

main()

sort

(e +

1, e + tot +1)

;for

(i =

1; i <= tot; i++

)for

(a =

1; a <= n; a++)}

if(m == n -1)

dfs(1)

;else

for(i =

1; i <= n; i++

)printf

("%d "

, ans[i]);

}return0;

}

NOIp2018解題報告

ans sum a a 正確性可由貪心證得 考慮貪心,選出乙個屬於a的集合,容易證明其是最優的 然後考慮乙個數如果不被選,則他需要滿足那些條件,發現是他可以被已選出的一些數表示 那麼這就是乙個要求不斷加點的完全揹包,和普通完全揹包無異 看到最大值最小直接二分 直接考慮二分lim為最小的最大權 考慮乙...

noip2018滾粗報告

一切都結束了。tg327,夢醒了。day1是真炸了,別人都290,300,就我股份170,t2降智,continue打成return 0,直接爆了,t3sb到就打了20分,真不知道自己是怎麼想的,可惜。day2t1不會,騙了72,t2真心不會,打了50分,其中n 3硬是沒打出來,我真是辣雞,t3暴力...

NOIP2018模擬賽10 16 手殘報告

爐石亂鬥模式美滋滋啊,又頹到好晚.上來t2先敲了樹剖,看t1發現是個思博dp,然後沒過大樣例,寫個暴力發現還是沒過大樣例 才發現理解錯題意了,真是太菜了 然後看t3發現又要樹剖,想了想發現邊雙縮點似乎能做.結果碼來碼去比賽臨近結束才搞完,趕緊交 但是那台機子上的chrome似乎是個假的,開啟什麼網頁...