北師大部分題解

2022-06-13 16:30:11 字數 3068 閱讀 4688

e  題意:給你乙個長度為n的陣列和k,問你這個陣列的所有長度為k的子串行的和的平方的異或和是多少,資料保證cnk<=1e5,n-1e5;

題解:搜尋,直接跳過0節點就可以了

#include#include

#include

using

namespace

std;

const

int n=1e5+88

;int

n,k;

long

long

sum,ans;

inta[n],f;

void dfs(int u,int ow,int

now)

for(int i=u;i<=n;++i) dfs(i+1,ow+1,now+a[i]);

}int

main()

}

h:題意:給你乙個長度為5e5的括號序列,只包含左括號和右括號,有m次操作(m<=5e5)

操作1是將括號反向,操作2則是問以x開頭的合法序列的最長長度是多少。

題解:若乙個序列a[i....k]合法,則必有i-k中左括號的數目》=右括號並且在k處左括號與右括號相等。

轉化成數字就是左括號的權值是1,右括號的權值是-1,那麼從i開始到j的權值和一定要大於等於i並且從i到k的權值和等於i。

則就是和區間最小值的有關的問題了,想到線段樹維護這個權值字首和,然後查詢的時候,第一感覺肯定是查字首和值等於起始處的,但是這樣是不可行的,因為你二分查詢的時候,如果這個區間最小值等於起始處的時候,無法判斷是向左還是向右。

那麼就分步進行,首先從左開始找到第乙個小於起始值的,這個直接二分就可以找了,找到的話那麼答案就有了。如果沒有找到,那麼就從序列末尾找等於起始值的,找到就是答案。

兩次二分的差別就在於第一次是毫無目的性,你無法判斷向右還是向左,而第二次就很明朗了。

#includeusing

namespace

std;

const

int n=5e5+88

;int mi[n<<2],lazy[n<<2

],a[n],n,m;

char

s[n];

void build(int l,int r,int

t)

int m=(l+r)>>1

; build(l,m,t

<<1

); build(m+1,r,t<<1|1

); mi[t]=min(mi[t<<1],mi[t<<1|1

]);}

void pw(intt)}

int query(int l,int r,int l,int r,intt)}

void update(int l,int l,int r,int t,int

val)

pw(t);

int m=(l+r)>>1

;

if(l<=m) update(l,l,m,t<<1

,val);

update(l,m+1,r,t<<1|1

,val);

mi[t]=min(mi[t<<1],mi[t<<1|1

]);}

intmain()

else

else l=m+1

; }

printf(

"%d\n

",xx-x);

}else

else r=m-1

; }

printf(

"%d\n

",ans-x+1

); }}}

}}

k:題意:給你乙個n,m,n<=1000,m<=100.

長度為n的序列相對位置不能變,長度為m的任意插入長度為n的序列之中去,插入過程由你決定,然後相鄰的值不能選,問你能選的最大值是多少。

題解:不插入的話直接dp[n][2]推過去就行了,有插入的話就相當於每段之間多了m*m個狀態,多的就是目前b序列的情況。然後也是順推就行了。

兩種寫法,一種無狀態重疊,另一種有。

狀態重疊的關鍵就是用上一次選的代替這一次選的是對答案沒有影響的。

#include#include

#include

using

namespace

std;

const

int n=1e3+55

;const

int m=1e2+55

;int sum[n],f[2][m][m],g[2

][m][m];

inta[n],b[n],n,m;

intmain()

sort(b+1,b+m+1

);

for(int i=1;i<=m;++i) sum[i]=b[i]+sum[i-1

];

int ans=0

;

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

printf(

"%d\n

",ans);

}}

#include#include

#include

using

namespace

std;

const

int n=1e3+55

;const

int m=1e2+55

;int sum[n],f[2][m][m],g[2

][m][m];

inta[n],b[n],n,m;

intmain()

sort(b+1,b+m+1

);

for(int i=1;i<=m;++i) sum[i]=b[i]+sum[i-1

];

int ans=0

;

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

printf(

"%d\n

",ans);

}}

北師大複試

近來真忙,想要保持寫點東西的習慣不容易。複試 招聘進行時。招聘 想不停,推了許多招聘的面試筆試。有自己想要的路了。今天去的是北師大複試。早上8點開始,上午筆試加機試,下午是面試。題目做得還行,機試提早交卷了,最後一道實在沒思路。面試是1點鐘開始,輪到我時已4點半了。面試流程是中文自我介紹,專業基礎知...

北師大上機題 三 c

題目 輸入一堆要完成的任務,每個任務有開始時間和要完成的時間,求把這些任務做完最快要多久。原題是回憶版題目,題意表述不是很明確,這裡簡單認為個任務可以在相同時間段內進行不會衝突,時間的格式採用的是整數 輸入格式 輸入任務的總數 各個任務開始的時間和所需要的時間 輸出格式 所需時間 輸入樣例 5 2 ...

又想起東北師大

今天在校內上看到一篇比較北師大 華東師大和東北師大的文章,列舉了三所高師名校的軟硬體對比。作者比較的結果是三所學校各有所長,都很不錯。其實這三所學校之間還是存在很大的差距的,尤其是我的母校東北師大和另外兩所師大相比而言。這種差距不是因為東師的老師不努力 領導不得力,我個人覺得更主要的是地理位置決定了...