原创 poj3494(求最大全1子矩陣)

點我 這題和最大子矩陣和都是用了壓行的思想把多行壓成 一行,降維後當成1維的處理。 區別是這個是枚舉底行   先思考這樣一個問題,如何求一個數組{3 4 5 2 4}圍成的最大面積。 對任意一個位置i,我們需要找到其左右邊第一個小於arr

原创 poj3321(dfs序+線段樹)

  題意就是給一棵樹,然後有2種操作,一是問以x爲根節點的子樹有多少蘋果,二是更改某點的蘋果數量。  做法就是用dfs序把樹形結構轉化成線性結構也就是區間,然後用線段樹維護。先要求出每個點的in和out值,然後就給每個點分配了一個新編號了

原创 無向圖求點雙連通分量/割點

假設DFS中我們從頂點U訪問到了頂點V(此時頂點V還未被訪問過),那麼我們稱頂點U爲頂點V的父頂點,V爲U的孩子頂點。在頂點U之前被訪問過的頂點,我們就稱之爲U的祖先頂點。 顯然如果頂點U的所有孩子頂點可以不通過父頂點U而訪問到U的祖先頂

原创 zoj 1301 Color the Ball 區間合併線段樹

Color the Ball 題意:一開始全部點爲黑色,然後給n個區間染色,染色爲白色或黑色,最後統計哪段區間白色最長,要最右邊的。 這題因爲沒說區間有多少個點,所以一開始不知道線段樹要維護多長的區間,但是操作只有2000種,所以離散化之

原创 D. Pawn(記憶化搜索)

https://codeforces.com/contest/41/problem/D 題意翻譯 翻譯: 題目描述: 國際象棋棋盤最底行站了一個兵。 它只有兩種行動方式: 向上左或向上右走。 它可以選擇從最低行哪個節點開始他的旅程。 每個

原创 codeforces1100E. Andrew and Taxi(二分+拓撲)

  給n個點,m條邊,然後每個邊有個權值,然後需要把一些邊反向使得圖中無環,問你需要反向的邊的最大邊權最小是多少?   寫這題需要知道拓撲排序的一個應用,當原圖是無環的,在a,b兩點之間加一條有向邊,還得保證圖是環的,加的邊的方向取決與t

原创 Gym - 101170I Iron and Coal (思維)

  給一個有向圖,然後一些點有鐵一些點有煤,然後問你從1走,至少花費多少(走一個沒走過的點花費1,走過的點再走一次是不用花費的)可以拿到一個鐵一個煤,點可以重複走。   枚舉從1節點到一個鐵一個煤的交叉點即可,三遍bfs處理出dis[1,

原创 無向圖求邊雙連通分量/橋

在無向圖中,去掉了i號邊,連通塊數量增加了,那麼i號邊就是橋。 #include<bits/stdc++.h> using namespace std; #define ls rt<<1 #define rs (rt<<1)+1 #de

原创 hdu2242 (邊雙縮點)

題意:給出n個點和m條無向邊,每個點都有權值,要求去掉一條邊,使得整個圖變成兩個連通塊,並且兩者的權值總和之差最小 **思路:**首先去掉的邊必定是橋,無橋的話對應無解,有橋的話,把邊雙都求出來縮點,然後dfs一遍統計答案 #in

原创 樹上差分(點差分和邊差分)

 因爲準備學樹剖於是又學了樹差分。 點差分:u至v路徑上所有點點權+1,那麼c[u]++,c[v]++,c[lca]--,c[fa[lca]]--,可以在多次更新樹鏈的點之後,得到某點權值 邊差分:邊差分的話要把邊的權值存在他連着的兒子節

原创 牛客練習賽52 烹飪(裴蜀定理+dp)

  題目大意就是給你n個數,然後要找這n個數的線性組合a1*x1+a2*x2+a3*x3+....+am*xm 等於任意正整數(1<=m<=n),問你這樣的組合(a1,a2,...,am)有多少個,因爲a1*x1+a2*x2+a3*x3+

原创 淺談tarjan的應用

無向圖{ 求邊雙連通分量(邊bcc)/割邊求點雙連通分量(點bcc)/割點 無向圖 \begin{cases} \ 求邊雙連通分量(邊bcc)/割邊 \\ \\求點雙連通分量(點bcc)/割點 \end{cases} 無向圖⎩⎪

原创 Codeforces Round #576 (Div. 2) D. Welfare State + hdu5306 Gorgeous Sequence (吉司機線段樹)

存個板子 更新操作區間取最值,n(logn)2\mathbb 更新操作區間取最值 ,n(logn)^2更新操作區間取最值,n(logn)2 Codeforces Round #576 (Div. 2) D. Welfare S

原创 牛客練習賽13-幸運數字Ⅱ(暴力)

  因爲區間很大暴力搞不行,但是這個10位數以內的幸運數字只有2046種,所以可以先dfs預處理出所有的幸運數字,然後求每個幸運數字的貢獻。 #include<bits/stdc++.h> using namespace std; #d

原创 51NOD 1020 逆序排列(dp預處理)

  定義dp[i][j]爲1~i的排列裏逆序數爲j的方案數。那麼只需要求i階段的dp值時,只需要考慮在i-1階段的基礎上把i放哪裏就好了,如果i放在倒數第v個就會新產生v-1個逆序對。那麼轉移方程就是dp[i][j]=sum(dp[i-1