<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Loading

      廣二集訓 day1

      T1 線段樹合并&dsu on tree


      Problem A: 不能說的秘密(secret)

      【題目描述】

      碎片散落在了一棵有 \(n\) 個頂點的有根樹上。頂點從 \(1\)\(n\) 編號,頂點 \(1\) 是根,頂點 \(i\)(\(2 \le i \le n\)) 的父親編號為 \(p_i\),其中 \(1 \le p_i < i\)。每個頂點上恰有一個碎片,頂點 \(i\) 上的碎片會在第 \(t_i\) 秒末消失。

      你試著撿起頂點 \(k\) 子樹內的所有碎片。在每一秒,你可以什么也不做,也可以選擇一個滿足以下條件之一的頂點 \(i\) 并撿起頂點 \(i\) 上的碎片:

      • \(i = k\)
      • 頂點 \(p_i\) 上的碎片已經被撿起。

      每個碎片被撿起的時間都要在其消失之前。例如,對于一個在第 \(3\) 秒末消失的碎片,你需要在第 \(1\) 秒、第 \(2\) 秒或第 \(3\) 秒撿起它。

      我們保證了 \(t_i ≥ n\),不難發現你可以隨便撿,但是你想拖延時間。試求最遲在第多少秒初開始撿碎片能保證撿完頂點 \(k\) 子樹內的所有碎片。

      你需要對于 \(k = 1, 2,...,n\) 分別求出答案。

      【輸入格式】

      從文件 secret.in 中讀入數據。

      輸入的第一行包含一個整數 \(n\),表示樹的頂點數量。

      輸入的第二行包含 \(n-1\) 個整數,第 \(i-1\) 個整數 \(p_i\) 表示頂點 \(i\) 的父親編號。

      輸入的第三行包含 \(n\) 個整數,第 \(i\) 個整數 \(t-i\) 表示頂點 \(i\) 上的碎片消失時間。

      【輸出格式】

      輸出到文件 secret.out 中。

      輸出一行包含 \(n\) 個整數,第 \(i\) 個整數表示當 \(k = i\) 時的答案。

      【樣例 1 輸入】

      6
      1 1 2 2 3
      6 8 6 7 9 9
      

      1 輸出】

      4 6 6 7 9 9
      

      線段樹合并和啟發式合并好題

      先說思路,容易發現先按時間排序,然后從小到大依次與根節點打通最優,考慮交換處理順序,發現肯定會將最小時間提前

      我們先處理好操作順序,按上述描述模擬即可,先處理根為1的

      $ans=\min_{i=1}^{n}{t_i-k_i+1} $ , \(k_i\)為操作次序

      那我們在每個子樹內維護即可

      線段樹合并

      這個處理方法真的很妙,容易發現全局操作次序的相對次序在子樹內同樣適用,假定線段樹底層是操作次序\(k_i\),那么子樹內\(k_i\)即為線段樹底層節點前面有幾個不為空的位置+1

      我們考慮線段樹合并,容易發現siz是好維護的,再維護一個ans

      考慮合并,可以直接繼承左子樹答案,因為右邊已經無值,右子樹則需處理,理由如上

      \(ans=min(ans_l,ans_r-siz_l)\)

      普通線段樹合并即可

      int insert(int p,int l,int r) {
      	int id=++cnt;
      	siz[id]++,val[id]=p;
      	if(l==r)return id;
      	int mid=l+r>>1;
      	if(p<=mid) ls[id]=insert(p,l,mid);
      	else rs[id]=insert(p,mid+1,r);
      	return id;
      }
      
      void push_up(int p) {
      	siz[p]=siz[ls[p]]+siz[rs[p]];
      	val[p]=min(val[ls[p]],val[rs[p]]-siz[ls[p]]);
      }
      int merge(int x,int y,int l,int r) {
      	if(!x||!y) return x+y;
      	if(l==r) {
      		siz[x]+=siz[y],val[x]=l-siz[x]+1;
      		return x;
      	}
      	int mid=l+r>>1;
      	ls[x]=merge(ls[x],ls[y],l,mid);
      	rs[x]=merge(rs[x],rs[y],mid+1,r);
      	push_up(x);
      	return x;
      }
      

      啟發式合并

      還是剛才那個思路,我們考慮樹上啟發式合并

      我們還是考慮線段樹底層是操作次序\(k_i\),那這樣我們需要將\(t_i\)插入進去,用區間減操作處理\(k\)的真實值,具體的講,將區間\([k_i+1,up]\)都減去1,代表它們在此節點后操作,注意初始線段樹來個極大值即可,然后區間取min

      時間復雜度為\(O(n log^2 n)\),常數很小

      貼一下初繪代碼

      void pushup(int p) {tr[p] = min(tr[p * 2] , tr[p * 2 + 1]);}
      void pushdown(int p) {/* ... */}
      void change(int p , int l , int r , int s , int t , int x) {
          /*區間加減*/
      }
      void TJ(int x , int fa , int op) {
          change(1 , 1 , n , dis[x] , dis[x] , (a[x].t - M) * op);
          change(1 , 1 , n , dis[x] + 1 , n , (-1) * op);
          for(auto to : v[x]) {
              if(to == fa) continue;
              TJ(to , x , op); 
          }
      }
      void dfs2(int x , int fa , bool op) {
          for(auto to : v[x]) {
              if(to == fa || to == son[x]) continue;
              dfs2(to , x , 0); 
          }
          if(son[x]) dfs2(son[x] , x , 1);
          for(auto to : v[x]) {
              if(to == fa || to == son[x]) continue;
              TJ(to , x , 1);
          }
          change(1 , 1 , n , dis[x] , dis[x] , a[x].t - M);//插入自身
          change(1 , 1 , n , dis[x] + 1 , n , -1);//區間減,維護子樹內k值
          ans[x] = tr[1];
          if(!op) TJ(x , fa , -1);
      }
      
      posted @ 2025-06-13 07:22  Mortis_Life  閱讀(19)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲 制服 丝袜 无码| 久久亚洲精品无码va白人极品| 国产精品一区二区传媒蜜臀| 国产日产欧产精品精品| 综合亚洲网| jizz视频在线观看| 牡丹江市| 亚洲国产av区一区二| 无码av免费毛片一区二区| 天堂网在线.www天堂在线资源| 熟女少妇精品一区二区| 激情啪啪啪一区二区三区| 欧美成人精品手机在线| 一区二区三区四区五区自拍| 最近中文字幕日韩有码| 国产日韩精品中文字幕| 亚洲禁精品一区二区三区| 孟州市| 日韩a∨精品日韩在线观看| 强奷乱码中文字幕| 国产乱码日韩精品一区二区| aⅴ精品无码无卡在线观看| 日本黄色三级一区二区三区| 真人在线射美女视频在线观看| 免费无码黄十八禁网站| 日韩亚洲精品中文字幕| 97欧美精品系列一区二区| 亚洲欧洲精品日韩av| 国产免费高清69式视频在线观看| 国产激情精品一区二区三区| 一区二区三区无码高清视频| 亚洲色在线v中文字幕| 一本本月无码-| 日韩精品国产另类专区| 久久久久青草线蕉亚洲| 国产一区二区三区无遮挡| 日韩蜜桃AV无码中文字幕不卡高清一区二区 | 久久国内精品自在自线91| 亚洲午夜爱爱香蕉片| 亚洲欧美高清在线精品一区二区| 亚洲精品宾馆在线精品酒店|