NOIP做題記錄

2021-10-13 09:57:43 字數 3461 閱讀 5614

這篇文章主要就是記錄noip的思路和解法,以及設計到的演算法,十分主觀,請勿見怪。(不斷更新中)

t1 排水系統

拓補排序+高精,難度較低

t2 字串匹配

hash+樹狀陣列+字首字尾和+卡常(還沒學拓展kmp)

1.列舉 abab

ab和 i

ii ,hash 判斷字串相同(主要思路)

2.對 f(x

)f(x)

f(x)

函式進行字首和字尾預處理

3.樹狀陣列處理 f(x

)f(x)

f(x)

函式數值字首和

4.就 i

ii 奇偶性討論

這樣就可以做到 o(t

n(ln⁡

n+

log⁡27)

)o( t n (\ln n+ \log 27))

o(tn(ln

n+log27)

) 的時間複雜度,卡卡常數就過了

ps.貌似 o(t

n(ln⁡

n+27)

)o(t n(\ln n+27))

o(tn(ln

n+27

))可以卡常卡過去,但我反正卡不過(orz 卡常大佬們)

**如下:

#include

using

namespace std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

ll read()

while

('0'

<=c && c<=

'9')

return flag?x:

-x;}

const ll n=

1050000+10

,p=1e9+7

;char s[n]

;ll h[n]

,l[n]

;int bar[30]

,n;short suf[n]

,pre[n]

;inline

intlowbit

(int x)

inline

void

add(

int x)

inline

intque

(int x)

intmain()

memset

(bar,0,

sizeof

(bar));

suf[n+1]

=0;for

(register

int i=n;i>=

1;i--

)memset

(bar,0,

sizeof

(bar));

ll ans=0;

for(

register

int i=

2;i<=n;i++)}

printf

("%lld\n"

,ans);}

}

t3 移球遊戲

思維題+spj

40pts 複雜度 o(n

m2

)o(nm^2)

o(nm2)

寫個up函式把某個數從乙個柱子中移到乙個柱子最上面,其他球順序不變。

然後對每種顏色進行以下操作:

1.把每乙個柱子中的該種顏色的球提到最上方

2.把這些同種顏色的球移到右邊空的柱子(稱為a柱)上

3.把a柱左邊的柱子所有球移動到該柱左邊的柱子上的空位上

容易看出,這樣的操作進行n-1次即可滿足題目條件

40pts **如下:

#include

using

namespace std;

typedef

long

long ll;

ll read()

while

('0'

<=c && c<=

'9')

return flag?x:

-x;}

const ll n=

60,m=

410,mx=

820000

+10010

;ll a[n]

[m],topans=

0,n,m;

struct ansoutans[mx]

;ll ano;

void

up(ll num,ll d)

;for

(ll i=d+

1;i<=m;i++

) ans[

++topans]

=(ansout)

; ans[

++topans]

=(ansout)

;for

(ll i=d+

1;i<=m;i++

) ans[

++topans]

=(ansout)

; ans[

++topans]

=(ansout)

; ans[

++topans]

=(ansout);}

else

;for

(ll i=d+

1;i<=m;i++

) ans[

++topans]

=(ansout)

; ans[

++topans]

=(ansout)

;for

(ll i=d+

1;i<=m;i++

) ans[

++topans]

=(ansout)

; ans[

++topans]

=(ansout)

; ans[

++topans]

=(ansout);}

ll x=a[num]

[d];

for(ll i=d;i) a[num]

[i]=a[num]

[i+1];

a[num]

[m]=x;

}ll len[n]

;int

main()

}for

(ll ci=

1;ci}for

(ll i=

1;i<=n-ci+

1;i++);

}for

(ll i=

1;i<=n-ci;i++);

a[i]

[j]=a[n-ci+1]

[len[n-ci+1]

--];}

}}printf

("%lld\n"

,topans)

;for

(ll i=

1;i<=topans;i++)}

//ball

KMP做題記錄

題目太長不貼了 這道題很巧妙,給定乙個字串s,求最少在首尾新增幾個字元後,s變為乙個迴圈了n次的字串 n 1 假設我們有乙個迴圈串s abcabcabc 我們根據kmp求一次next陣列,就可以通過next strlen s 得到乙個迴圈節的位置從而求出迴圈節的長度,顯然,迴圈節能被s整除。如果s ...

8 25 9 25 做題記錄

2018.8.25 上午 1.ac 洛谷p1514引水入城 搜尋 貪心 2.ac 洛谷p3918 國家集訓隊 特技飛行 貪心 下午 3.ac 洛谷p1120 小木棍 資料加強版 搜尋 剪枝 4.ac 洛谷p1441 砝碼稱重 dfs列舉 01揹包 2018.8.26 上午 參加模擬賽 下午 1.ac...

8 25 9 25 做題記錄

2018.8.25 上午 1.ac 洛谷p1514引水入城 搜尋 貪心 2.ac 洛谷p3918 國家集訓隊 特技飛行 貪心 下午 3.ac 洛谷p1120 小木棍 資料加強版 搜尋 剪枝 4.ac 洛谷p1441 砝碼稱重 dfs列舉 01揹包 2018.8.26 上午 參加模擬賽 下午 1.ac...