日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CODEVS-3303-翻转区间

發布時間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CODEVS-3303-翻转区间 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

描述

http://codevs.cn/problem/3303/


分析

本題就是一個普通的通過打標記實現區間翻轉的splay題目. 之前發過翻轉卡片和這個題很像. 這里主要是想仔細分析一下標記的實現以及一些問題. 為后面的維護數列做一些準備工作.


  • 首先明確, 為什么可以通過標記的方式記錄翻轉信息.
    splay 的一棵子樹代表的就是一個連續的區間, 因為splay是BST, 滿足結點o的左兒子(lc) <= 根節點(o) <= 右兒子(rc). 并且如果o是其父結點的左兒子, rc一定比o的父節點要小; 如果o是其父結點的右兒子, lc一定又比o的父節點要大. 這樣就保證了區間是連續的, 而且這個區間的序列就是這棵子樹的先序遍歷的結果.

  • 既然子樹是一個封閉的區間了, 對其打上翻轉標記后就可以表示區間已經被翻轉了. 那么如何標記下傳呢? 首先根結點的左右子樹應該交換一下, 也就是以根結點o為分界點, 比o小的lc交換到比o大的rc上, 比o大的rc交換到比o小的lc上. 接著以左右子結點為根節點分別將標記下傳到左右兩棵子樹上… 層層下傳, 最終實現整個區間的翻轉. 這就是分治的思想. 當然實現中需要時才將標記下傳一步.

  • 最后一個問題, 何時進行標記下傳? 標記下傳后如何維護其父結點以及祖先的值?
    這里還要分兩種情況, 第一種是自底向上的splay, 這種需要在find()時把遇到的所有結點進行標記下傳,find()會經過到達目標結點的所有結點. 另一種是自頂向下的splay, 需要在splay操作時把根結點和目標所在的子結點標記下傳. 因為既要找到目標結點在根結點的方向(左子樹還是右子樹), 又要找到目標結點在子結點的方向.
    而標記下傳后需不需要維護祖先結點的值呢? 其實不需要過多維護, 因為splay操作自帶維護操作——旋轉操作里就有.

代碼

https://code.csdn.net/snippets/608231

總結

以上是生活随笔為你收集整理的CODEVS-3303-翻转区间的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。