3月15日考試 題解(數學 揹包 線段樹)

2022-03-26 10:51:39 字數 3357 閱讀 3891

這次好不容易ak了一次(雖然題有點白給。有的題還是比較考驗思路的。

t1 放棋子

給乙個n*n的棋盤,有n個棋子。棋盤的副對角線不能放棋子(即$i+j=n+1$的位置)。每行每列只能擺乙個棋子。每個棋子都視為是不同的。問有多少種擺法。

$n\leq 1314520$。答案對1e8+7取模。

典型的錯排問題。

我們將題目轉化:有$n$個數,標號為$1$-$n$。第$i$個數不能放到第$i$個位置。有多少種方法。

考慮遞推:設$f_$為放i個棋子的方案數。假設將第$i$個棋子放到第$k$個位置上。

如果將第$k$個棋子放到第$i$個位置上,則此時方案數為$f_$。

如果將第$k$個棋子放到其他位置上,則方案數為$f_$。

因為把$i$放到$k$上有$i-1$種方案。所以$f_=(i-1)\times (f_+f_)$。

特別地,有$f[1]=0,f[2]=1$。

**:

#includeusing

namespace

std;

const

int mod=100000007

;unsigned

long

long f[1314525

]; unsigned

long

long jie=1

;int

main()

for (int i=3;i<=n;i++)

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

f[n]%=mod;f[n]=f[n]*jie;f[n]%=mod;

printf(

"%lld

",f[n]%mod);

return0;

}

t2 金明的預算方案

尼瑪竟然考了原題,這就很離譜。

題目描述

對於乙個物品,無非只有五種情況:

1.不買這個物品。

2.買這個物品和它的第乙個附件。

3.買這個物品和它的第二個附件。

4.全都買

5.都不買

如果並沒有第$i$個物品直接把$price[i]$和$im[i]$設為0即可。

也可以先把主件和附件揹包一次,然後再進行分組揹包。我這裡採用的是第二種方法。

**:

#includeusing

namespace

std;

struct

yyya[

60],chi[60][60

];int n,m,b[80][10],t[80],c[80][10],cnt[80],f[32005],ans;//

n為價錢,m為數量

intmain()

}for (int i=1;i<=m;i++)//

對於有依賴的揹包問題,可以事先將他們分到乙個組裡,用「01揹包」的方法取得區域性最優值

}if (!a[i].fa)//

如果不是附件

}memset(f,

0,sizeof

(f));

for (int i=1;i<=m;i++)//

這時候就是分組揹包問題了

for (int j=n;j>=0;j--)

for (int k=1;k<=cnt[i];k++)

if (j>=b[i][k])

f[j]=max(f[j],f[j-b[i][k]]+c[i][k]);

for (int i=0;i<=n;i++)

ans=max(ans,f[i]);//

保險起見,又遍歷了一遍

cout

}

t3 線段樹大綜合

題目大意:讓你區間修改,區間查詢。

內容包括:

1.修改:統一加$x$或統一重新賦值為$x$。

2.區間求和,最大值或最小值。

對於修改,我們要維護兩個tag,分別對應重新賦值和加權。

pushdown的順序是先維護重新賦值的tag再維護加權的tag。因為先前不管怎麼加最後重新賦值和直接賦值是一樣的。所以優先重新賦值。

pushdown的**:

void pushdown(int

k)

if(a!=0

)}

然後就是線段樹板子題了,熟練的話20min打完+調完。

ac**:

#include#define ll long long

using

namespace

std;

intn,m;

struct datat[4000001

];void pushup(int

k)void build(int k,int l,int

r)

int mid=(l+r)>>1

; build(k

<<1,l,mid);build(k<<1|1,mid+1

,r);

pushup(k);

}void pushdown(int

k)

if(a!=0)}

void change(int k,int x,int y,int

z)

int mid=(l+r)>>1

;

if(mid>=y)change(k<<1

,x,y,z);

else

if(mid1|1

,x,y,z);

else

pushup(k);

}void add(int k,int x,int y,int

z)

int mid=(l+r)>>1

;

if(mid>=y)add(k<<1

,x,y,z);

else

if(mid1|1

,x,y,z);

else

pushup(k);

}int ask(int k,int x,int y,int

f)

int mid=(l+r)>>1

;

if(mid>=y)return ask(k<<1

,x,y,f);

else

if(midreturn ask(k<<1|1

,x,y,f);

else

}int

main()

else

}return0;

}

後記:這次考試總體難度一般吧。平時認真做題獨立思考的不出意外150+。t1有難度,轉化那一步不太容易想到。t2白給題。t3噁心題,寫錯調半年。

希望我的狀態能保持下去。

考試題題解

主講人igl albl 試題t2 t3 t1 t4 t5 暴力 dfs所有路徑,在使用clock的情況下預計 text 題意 給你一張有向圖,距離為 text 的正整數次冪的兩點間可以重新連一條長為 text 邊,求在此情況下的從起點到終點最短路。我們用 text 表示點 text 到點 text ...

12月14日考試題反思

本大周學習了遞迴和高精。又進行了考試,結果爆零了,總結後是自己沒掌握。還是看題吧!第一題大意 給兩個字串,找出重疊字元輸出對數並排列。題看了很久才明白意思,前面幾問的思路是有的,可排列函式sort的用法卻忘了,想了許久,還是先敲 為上。最初 如下 include using namespace st...

考試題解集合

某天忽然發現自己的blog裡全是考試題解 那麼為什麼不鏈到一篇blog裡呢?避免首頁全是加密blog看起來不大友善,大概也會整齊一點。估計是個大工程但還是作死地開始啦。有些難題是單獨寫的,就不鏈了。密碼仍然是開機使用者名稱 入學年份 兩個班級,希望總是能比過去的自己更用心!2018 4月 14 17...