正睿 2018 提高組十連測 Day5

2022-06-01 19:18:08 字數 3203 閱讀 7496

(鴨血居然沒想到字首和優化dp,主要是寫的是刷表....,只想到線段樹優化,還要兩棵....)

首先是暴力解法:

f[i][j]+=f[i-1][k] (0<=k<=j/2)

嗯.....這個顯然可以字首和優化.....

然後是正常人dp解法:

令f(i,j)表示長度為i總和為j的合法陣列個數

則f[i][j]=f[i][j-1]+f[i-1][j/2]; (第二項只有j為偶數轉移 2*k總為偶數)

這個轉移相當於是:對於第i個陣列有兩種轉移:第1種是給最後1個數加1,第2種是新加1個數,

因為新加的數最少是前i-1個的和。(然後第二種的狀態,第乙個有可以去累加,常見思路!!!noip2016飛翔的小鳥也有這種思路

其實這題就水得一匹。

上**:

1 #include2

#define maxn 1000005

3using

namespace

std;

4 typedef long

long

ll;5

const ll mod=998244353

; 6 ll dp[25

][maxn];

7int

n,k;

8void

init()

16 printf("

%lld

",dp[k][n]); 17}

18int

main()

首先這道題可以觀察推出ans[i]=2*len-dep[i](滑稽)len為所經過的路徑長度(塗黑的),然後這裡我用的是樹鏈剖分,實際上可以暴力:每次加乙個個ai,暴力列舉ai到根這條路徑上的所

有邊,然後將他們標記為屬於迴路的邊。

只要暴力往上爬時,碰到已經被標記的邊就不繼續爬,這樣所有邊

最多被標記1次,所以是o(n)的。(有點草率...)

上**:

1 #include2

#define maxn 100005

3using

namespace

std;

4int n,m,a[maxn],x,y,dep[maxn],son[maxn],sz[maxn],rk[maxn],dfn[maxn],clock_=0,top[maxn];//

rk:回指dfn序所指的原節點編號

5int fa[maxn][18

]; 6

struct

eagee[maxn<<1];9

int np=0

,first[maxn];

10void add(int u,int

v);12 first[u]=np;13}

14void dfs1(int i,int f,int

d)25}26

int lca(int u,int

v)32

if(u==v) return

u;33

for(int i=17;i>=0;i--)

37return fa[u][0

];38}39

void dfs2(int i,int f,int

tp)48}49

int num[maxn<<1],ad[maxn<<1

];50

int lc[maxn<<1],rc[maxn<<1],npp=0,rt=0;51

void upload(int

now)

54void build(int &now,int l,int

r)57

58int m=l+r>>1;59

build(lc[now],l,m);

60 build(rc[now],m+1

,r);

6162

upload(now);63}

64void download(int now,int l,int m,int

r)72}73

void update(int now,int l,int r,int i,int j,int

d) 79

80int m=l+r>>1;81

download(now,l,m,r);

8283

if(j<=m)

86else

if(i>m)

89else

9394

upload(now);95}

96void upd(int u,int

v)103

if(dep[u]104 update(rt,1,n,dfn[v],dfn[u],1

);105

}106

void

init()

113for(int i=1;i<=m;i++) scanf("

%d",&a[i]);

114 dfs1(1,0,0

);115 dfs2(1,0,1

);116

117118 build(rt,1

,n);

119 a[0]=1

;120

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

124}

125int

main()

留坑放**...

1 #include2

#define maxn 100005

3using

namespace

std;

4 typedef long

long

ll;5

int n,a[maxn*2],b[maxn*2];//

b:替用陣列

6bool vis[65];//

分解t之後哪些位上有

7 ll t,w[65];8

char

s[maxn];

9void

ready()

13void

fj(ll t)17}

18void

init()34}

35 memcpy(a,b,sizeof

(b)); 36}

37}38for(int i=1;i<=n;i++) printf("%d"

,a[i]);39}

40int

main()

正睿2018 9 1提高2

對於二次函式提出乙個x 對於剩下的直線維護乙個 我們需要求出最大值上輪廓 單調棧求上凸殼就好了 include includeinline int read while c 9 c 0 x x 10 c 0 c getchar return x f const int maxn 500007 int...

正睿2020提高組十連測 選做

更新中.目錄題目鏈結 理解題意,打出第乙個暴力 首先需要知道,隨機生成的樹 如果不特別說明隨機方法,就是指在所有 n 棵樹里隨機 最大深度期望是 o sqrt 的。看本題。首先,期望是嚇唬你的,因為期望乘上階乘,其實就是求和。於是我們要求 所有排列下 操作後所有點的權值和 的和 因此暴力做法就是列舉...

2018提高組模擬9

2018提高組模擬9 20181004 woj4036 模擬 數論 描述給定乙個k 2 k 16 進製數a,判斷a是否能被k 1整除。輸入第一行是乙個整數t 1 t 50 表示測試點數量。對於每組資料,第一行乙個整數k,表示進製。第二行乙個k進製數,表示a。保證a是合法的k進製數,沒有前導0,且只由...