Codeforces資料結構刷題

2021-10-12 00:22:11 字數 3155 閱讀 5473

const

int n =

2e5+5;

int n , m;

ll a[n]

;struct node

tr[n <<2]

;void push_up (

int i)

void build (

int i ,

int l ,

int r)

int mid =

(l + r)

>>1;

build (i<<

1, l, mid)

; build (i<<1|

1, mid +

1, r)

; push_up (i);}

void push_down (

int i)

}int querypos (

int i ,

int l ,

int r, ll y)

void update (

int i ,

int l ,

int r,

int l ,

int r, ll y)

push_down

(i);

int mid =

(l + r)

>>1;

if(l <= mid) update (i<<

1,l,mid,l,r,y);if

(r > mid) update (i<<1|

1,mid+

1,r,l,r,y)

;push_up

(i);

}ll getsum (

int i ,

int l ,

int r,

int l,

int r)

ll cost;

int query (

int i ,

int l,

int r)

push_down

(i);

int mid =

(l + r)

>>1;

if(tr[i<<1]

.minn <= cost)

ans +

= query (i<<

1, l, mid);if

(tr[i<<1|

1].minn <= cost)

ans +

= query (i<<1|

1,mid+

1,r)

;return ans;

}int main (

)else

}return0;

}

解題思路:本題通過簡單分析,通過rmq查詢區間最值,通過列舉x之後,發現區間的單調性從而使用兩次二分求解

const

int n =

2e5+5;

int n, t, a[n]

;int maxn[n][30

], minn[n][30

];void

getst()

}int

rmq(

int l,

int r,

int op)

int main ()}

}if(mid1 !=-1

)break;}

if(mid1 !=-1

)printf

("yes\n%d %d %d\n"

,mid1,mid2-mid1,n-mid2)

;else

printf

("no\n");

}}

解題思路:本題有乙個性質:答案一定包含眾數,可以感性理解一下(擴張思維),然後就可以列舉搞了,這裡一定要用unordered_map不然會tle

const

int n =

2e5+5;

int n;

int a[n]

;int buck[n]

, cnt, val;

unordered_map <

int,

int> ma;

int main ()if

(cnt >1)

cout << n << endl;

else

} cout << ans << endl;

}}

解題思路:正常來說,是很容易想到o(n

2k

)o(n^2k)

o(n2k)

的分組揹包,可惜時間不夠acac

ac不得,於是我們觀察題目,發現有乙個很特殊的點,每個棧是單調棧。那麼從網上的結論可知,選擇的序列,僅存在乙個選不滿,然後,用線段樹分治的策略搞一搞就好了

const

int n =

3005

;int n , k;

int l[n]

;vector sum[n]

;ll dp[n]

, ans =0;

void solve (

int l ,

int r)

int mid =

(l + r)

>>1;

ll cpy[n]

;for

(int i =

0; i <= k ; i ++

) cpy[i]

= dp[i]

;for

(int i = mid +

1; i <= r ; i ++

) solve (l , mid)

;for

(int i =

0; i <= k ; i ++

) dp[i]

= cpy[i]

;for

(int i = l ; i <= mid ; i ++

) solve (mid +

1, r);}

int main ()}

solve (

1, n)

; cout << ans << endl;

}

資料結構刷題 剪枝

在刷題中會遇到,比如二叉樹問題中會遇到剪枝的問題,我們需要,研究一下什麼是剪枝 剪枝可謂是搜尋的靈魂所在,我們知道搜尋是個愣頭青小伙,一路撞到底可能都撞不到答案,他還可能要撞很多次。所以有什麼方法可以讓他撞的次數少一點呢?我們知道搜尋會形成乙個搜尋樹,這其中有很多的枝杈,但是他們中許多其實是無用或者...

資料結構刷題 陣列

給定乙個矩陣 a,返回 a 的轉置矩陣。先建立乙個與原始矩陣行列數互換的新矩陣 做兩個迴圈巢狀,內迴圈遍歷原始矩陣的行轉列,外矩陣遍歷原始矩陣的列 class solution return v 逐行的細緻解釋 vector 建立了二維陣列,兩個空格可以在c 11標準中可以剔除 a 0 size 獲...

LeetCode刷題目錄 資料結構

160.相交鍊錶 21.合併兩個有序鍊錶 83.刪除鍊錶中的重複元素 19.刪除鍊錶中倒數第k個節點 22.鍊錶中倒數第k個節點 24.兩兩交換鍊錶中的節點 445.兩數相加 234.回文鍊錶 755.分隔鍊錶 328.奇偶鍊錶 1.關注頭尾結點的處理,什麼時候需要虛擬頭節點,什麼時候不需要 2.判...