校內模擬考 一

2022-07-15 14:00:20 字數 1557 閱讀 8473

第一題

乙個裸裸的樹形dp

1 #include2

using

namespace

std;

3const

int n=1e5+5;4

intn,t,tot,s,a[n],h[n];

5int

cnt,fro[n],to[n],nxt[n];

6 inline int

read()

12void add(int x,int

y) 15

16void dp(int

u) 18

for(int i=fro[u];i;i=nxt[i]) dp(to[i]);

19 tot=0; memset(h,0,sizeof

(h));

20for(int i=fro[u];i;i=nxt[i]) h[++tot]=a[to[i]];

21 sort(h+1,h+tot+1

);22

for(int j=1;j<=ceil((double)tot*t/100);j++) a[u]+=h[j];23}

2425

intmain()

30 dp(0

); 31 printf("

%d",a[0

]);32 }

第二題

理一理思路

1)將人按身高從矮到高排序,按這個順序處理時無論當前怎麼放,都不會對後面更高的產生影響。

2)線段樹:統計當前答案序列$1$~$x$的位置有幾個未確定的 (即有幾個更高的)。

3)字典序最小:在處理時,盡量把當前數往左放。

1 #include2

using

namespace

std;

3const

int n=1e5+5;4

intn,ans[n];

5struct node a[n];

6struct tree f[n*3

];7 inline int

read()

13bool cmp(node x1,node x2)

1415

void build(int p,int l,int

r) 18

int mid=(l+r)>>1

;19 build(p*2

,l,mid);

20 build(p*2+1,mid+1

,r);

21 f[p].s=f[p*2].s+f[p*2+1

].s;22}

2324

void find(int p,int num,int

h) 27

if(num2].s) find(p*2

,num,h);

28else find(p*2+1,num-f[p*2

].s,h);29}

3031

intmain()

校內模擬 鎖

沒有標籤是因為我真的不知道這算什麼型別 這題我說不來大意你們還是看題面描述吧 小z住的房子一共有n個人,他們每人有乙個重要度。房子的門上可以裝若干把鎖。假設共有k把鎖,命名為1到k。每把鎖有一種對應的鑰匙,也用1到k表示。鑰匙可以複製若干份並發給任意多個居民。每個人都可以持有若干鑰匙,可以不持有鑰匙...

校內模擬 assignment(DP)

題面見校內oj4693 考慮預處理f k i j f k i j f k i j 表示最長的一段不超過k kk的時候,將長度為i ii的序列分為j jj段的方案數。在k kk相同的狀態之間轉移,顯然有f i j f i 1 j f i 1 j 1 f i k 1 j 1 f i j f i 1 j ...

2019 10 03 校內模擬

內網傳送門 很明顯的乙個網路流。轉換一下題意,相當於求保留航線的最大值。所以我們把邊權取負跑最小費用流。有乙個坑點,就是我們只需要費用最小,不要求流量最大,所以不應該用最小費用最大流。有兩個解決辦法 用最小費用可行流。連 i,t,1,0 i,t,1,0 i,t,1 0 的邊,表示不選 i ii 連出...