青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

終于會寫動態樹了

Posted on 2012-02-26 13:03 Mato_No1 閱讀(2070) 評論(2)  編輯 收藏 引用 所屬分類: 專題:數據結構動態模擬問題
【背景】
2012年1月19日,本沙茶開始看動態樹論文,搞懂了一些;
2012年1月20日,開始寫動態樹,使用的題是QTREE,花了整整一天時間總算寫完,交上去,TLE……
2012年1月21日,又調了一天,對拍了100+組隨機數據都瞬間出解,交上去,還是TLE……
2012年2月8日,WC2012,fanhq666講動態樹,又搞懂了一點,于是當天晚上回房間以后就開始繼續調,交上去,TLE……
2012年2月9日,晚上繼續調QTREE,TLE……
在挑戰動態樹N次失敗之后,本沙茶昨天再次去挑戰動態樹……這次換了一個題:BZOJ2002(傳說中的動態樹模板題)
一開始還是TLE了,不過后來把數據搞到手以后,發現TLE的原因并不是常數大,而是死循環了,最后,經過2h+的調試,總算找到了錯誤(有好幾處),終于AC了……

【關于BZOJ2002】
從每個點i往(i+Ki)連一條邊,如果(i+Ki)不存在則往一個附加的結點(本沙茶的代碼中為1號點,因為0號點是不能使用的)連一條邊,這樣就是一棵樹(除1號點外,每個點有且只有一個后繼……),然后,問題中的兩種操作就是“改接”和“詢問到根的距離”,可以用動態樹搞;

【代碼】
#include <iostream>
#include 
<stdio.h>
#include 
<stdlib.h>
#include 
<string.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define rre(i, n) for (int i=n-1; i>=0; i--)
#define rre1(i, n) for (int i=n; i>0; i--)
#define rre2(i, r, l) for (int i=r-1; i>=l; i--)
#define rre3(i, r, l) for (int i=r; i>=l; i--)
const int MAXN = 200004, INF = ~0U >> 2;
struct node {
    
int c[2], p, sz;
    
bool rf, d;
} T[MAXN];
int n;
void sc(int _p, int _c, bool _d)
{
    T[_p].c[_d] 
= _c; T[_c].p = _p; T[_c].d = _d;
}
void upd(int No)
{
    T[No].sz 
= T[T[No].c[0]].sz + T[T[No].c[1]].sz + 1;
}
void rot(int No)
{
    
int p = T[No].p; bool d = T[No].d;
    
if (T[p].rf) {T[p].rf = 0; T[No].rf = 1; T[No].p = T[p].p;} else sc(T[p].p, No, T[p].d);
    sc(p, T[No].c[
!d], d); sc(No, p, !d); upd(p);
}
void splay(int No)
{
    
int p; while (!T[No].rf) if (T[p = T[No].p].rf) rot(No); else if (T[No].d == T[p].d) {rot(p); rot(No);} else {rot(No); rot(No);} upd(No);
}
int access(int x)
{
    
int tmp = 0;
    
do {
        splay(x); T[T[x].c[
1]].rf = 1; T[tmp].rf = 0; sc(x, tmp, 1); upd(x); tmp = x; x = T[x].p;
    } 
while (x);
}
void cut(int x)
{
    access(x); splay(x); T[T[x].c[
0]].rf = 1; T[T[x].c[0]].p = 0; sc(x, 00); upd(x);
}
void join(int x, int p)
{
    access(x); T[x].p 
= p;
}
int main()
{
    
int m, x, y, z;
    scanf(
"%d"&n); n++;
    re3(i, 
2, n) {scanf("%d"&x); T[i].sz = 1; T[i].rf = 1if (i + x <= n) T[i].p = i + x; else T[i].p = 1;}
    T[
1].sz = 1; T[1].rf = 1; T[0].sz = 0;
    scanf(
"%d"&m);
    re(i, m) {
        scanf(
"%d"&x);
        
if (x == 1) {
            scanf(
"%d"&y); y += 2;
            access(y); splay(y); printf(
"%d\n", T[T[y].c[0]].sz);
        } 
else {
            scanf(
"%d%d"&y, &z); y += 2;
            cut(y); 
if (y + z <= n) join(y, y + z); else join(y, 1);
        }
    }
    
return 0;
}

【易疵點】
(1)注意一個點的父結點p有兩種可能:如果該結點是某棵伸展樹的根結點則p為它通過輕邊連向的另一棵伸展樹中的某一個點的編號(在原樹中,就是該結點所在伸展樹代表的鏈的最上層的那個節點的父結點),否則為該結點在伸展樹中的父結點編號(通過重邊相連);
(2)在改接時刪除邊的時候,如果刪除的是輕邊則直接把父結點設為0即可,如果是重邊則要sc一下再將父結點設為0;
(3)rot里面有一個地方很關鍵,極易疵!就是如果p是伸展樹的根結點,則除了No的rf改為1,p的rf改為0之外,還要把No的父結點設為p的父結點;
(4)本題中不涉及整棵大樹的根(就是root),如果需要root,則rot中還要加一句:if (root == p) root = No;
(5)cut里面有一種簡便寫法(不需要找到x的父結點的):先access(x),將x伸展到根之后,x及其右子樹就是原樹中以x為根的子樹,左子樹就是其它部分,所以直接將x與其左子結點斷開即可(注意斷開的是重邊所以要sc一下,再將x的左子結點的父結點設為0、rf設為1,再upd一下);
(6)一定要搞清楚rf的變化(該改時一定要改!)

最后,放上fanhq666超級大神的總結:
01

Feedback

# re: 終于會寫動態樹了  回復  更多評論   

2012-05-14 15:34 by yimao
受到了一定的啟發,thx!

# re: 終于會寫動態樹了  回復  更多評論   

2012-06-28 23:53 by 蒟蒻
請問大牛...codeforces 121 div1 3fools ans roads...可以用LCT做嗎?
題目大概意思是:有一棵樹,每條邊權值為0,m個操作,給a到b路徑上每條邊權值都+1,最后問每條邊的權值....
只會樹鏈剖分...不知是否LCT...求大牛給個思路...萬分感激...
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一区二区三区四区在线观看| 久久精品国产第一区二区三区| 亚洲综合社区| 亚洲精品久久久久久久久久久久| 国产日韩精品一区| 国产欧美69| 国产一区二区三区直播精品电影 | 欧美护士18xxxxhd| 欧美二区在线播放| 欧美日韩一区二区精品| 国产精品进线69影院| 国产乱码精品一区二区三区不卡| 国产人妖伪娘一区91| 亚洲福利视频免费观看| 亚洲卡通欧美制服中文| 午夜精品一区二区三区在线| 久久精品视频一| 亚洲国产成人在线| 亚洲成在人线av| 一区二区三区不卡视频在线观看| 亚洲性av在线| 久热re这里精品视频在线6| 欧美日韩另类在线| 韩国自拍一区| 亚洲无线视频| 欧美二区在线看| 亚洲影院免费观看| 欧美韩日一区二区| 国产一区二区三区久久悠悠色av | 欧美ab在线视频| 亚洲精品色图| 欧美在线视频一区二区| 欧美久久久久久蜜桃| 国产女人aaa级久久久级| 亚洲美洲欧洲综合国产一区| 欧美专区在线观看一区| 99热在这里有精品免费| 免费欧美电影| 一区二区三区我不卡| 亚洲制服少妇| 亚洲激情校园春色| 久久久久久久999精品视频| 国产精品www.| 夜夜嗨av一区二区三区| 美国三级日本三级久久99| 亚洲一区二区三区午夜| 欧美美女福利视频| 亚洲娇小video精品| 久久久国产一区二区| 亚洲一区二区三区精品动漫| 欧美日韩精品一区二区在线播放 | 欧美亚洲综合久久| 亚洲日本一区二区| 欧美国产日本在线| 亚洲国产99| 美女在线一区二区| 久久久久久久国产| 在线激情影院一区| 久久久久久亚洲精品中文字幕| 中文在线不卡| 国产精品久久久久久久久借妻| 一区二区三区回区在观看免费视频| 农村妇女精品| 久久一区二区三区四区| 136国产福利精品导航| 久久日韩粉嫩一区二区三区| 久久久精品国产99久久精品芒果| 国产亚洲一区二区三区在线观看 | 久久激情网站| 激情成人av在线| 欧美成人精品在线观看| 另类亚洲自拍| 亚洲国产日韩综合一区| 亚洲国产三级网| 欧美二区在线观看| 国产精品99久久久久久人| 日韩午夜三级在线| 国产精品久久久久久久久久久久久| 亚洲欧美制服中文字幕| 午夜日韩视频| 亚洲电影激情视频网站| 国产精品午夜在线| 亚洲国产日韩欧美在线99| 亚洲欧洲免费视频| 欧美日韩一区不卡| 久久久久久免费| 欧美大胆人体视频| 在线视频精品一区| 亚洲欧美高清| 亚洲激情网址| 夜夜嗨一区二区三区| 国产午夜精品一区二区三区视频| 六月天综合网| 欧美天天在线| 久久精品中文| 欧美激情精品久久久| 欧美一级在线亚洲天堂| 欧美专区在线观看| 日韩亚洲国产欧美| 欧美一区深夜视频| 夜夜狂射影院欧美极品| 久久av在线| 亚洲综合日本| 欧美aaa级| 性欧美videos另类喷潮| 男人天堂欧美日韩| 久久精品国产一区二区三| 欧美激情一区二区三区全黄 | 亚洲日本欧美| 激情综合自拍| 亚洲一区二区免费看| 亚洲日本成人| 欧美一级艳片视频免费观看| 一区二区三区精品久久久| 久久av一区二区三区漫画| 午夜欧美不卡精品aaaaa| 欧美激情久久久久| 狼狼综合久久久久综合网| 欧美日韩国产91| 欧美大片在线影院| 韩国av一区二区三区| 亚洲专区在线视频| 亚洲视频网站在线观看| 蜜臀a∨国产成人精品| 久久久水蜜桃| 国产精品无码永久免费888| 亚洲精品久久久久久一区二区| 在线播放豆国产99亚洲| 午夜精品久久久久99热蜜桃导演| 一区二区三区四区五区精品视频 | 国产午夜久久久久| 亚洲一区视频在线| 亚洲男人av电影| 欧美午夜不卡影院在线观看完整版免费| 模特精品在线| 亚洲大片精品永久免费| 久久电影一区| 久久香蕉国产线看观看网| 国产日韩亚洲欧美| 欧美一区精品| 免费欧美日韩| 亚洲三级网站| 欧美高清视频www夜色资源网| 欧美人与禽猛交乱配| 亚洲国产视频一区二区| 亚洲日本中文字幕区| 欧美va天堂va视频va在线| 欧美大片网址| 亚洲视频第一页| 国产精品久久久久久久久免费桃花| 一本色道久久综合狠狠躁篇的优点| 正在播放亚洲| 国产精品视频你懂的| 午夜亚洲福利| 乱人伦精品视频在线观看| 在线观看欧美一区| 久久天天狠狠| 亚洲美女毛片| 欧美自拍偷拍| 亚洲欧洲一区二区三区| 欧美日韩蜜桃| 亚洲欧美日韩综合国产aⅴ| 久久麻豆一区二区| 亚洲欧洲日产国产综合网| 欧美色图一区二区三区| 亚洲在线一区二区三区| 久久一综合视频| 一本色道久久综合亚洲精品高清| 国产精品美女www爽爽爽| 欧美一区二区三区久久精品茉莉花| 欧美大胆a视频| 亚洲视频在线观看视频| 国产日韩欧美在线看| 欧美电影打屁股sp| 国产精品99久久久久久宅男| 久久精品成人一区二区三区蜜臀 | 欧美精品久久久久久久免费观看| 亚洲精品乱码久久久久| 欧美一级播放| 亚洲精品国久久99热| 国产精品久久久久毛片大屁完整版| 午夜免费日韩视频| 最新热久久免费视频| 欧美一区二区精品| 亚洲国产精品va在看黑人| 欧美视频在线播放| 久久亚洲电影| 亚洲欧美国产毛片在线| 91久久精品久久国产性色也91| 午夜精品久久久久久久白皮肤| 亚洲国产精品一区二区第一页| 国产精品www| 欧美日本国产一区| 久久综合网色—综合色88| 一区二区三区黄色| 亚洲黑丝在线| 蜜臀久久99精品久久久画质超高清| 亚洲综合日本| 正在播放亚洲一区| 亚洲欧洲日产国产综合网|