bzoj 4573: [Zjoi2016]大森林

Description

小Y家里有一個大森林,里面有n棵樹,編號從1到n。一開始這些樹都只是樹苗,只有一個節點,標號為1。這些樹
都有一個特殊的節點,我們稱之為生長節點,這些節點有生長出子節點的能力。小Y掌握了一種魔法,能讓第l棵樹
到第r棵樹的生長節點長出一個子節點。同時她還能修改第l棵樹到第r棵樹的生長節點。她告訴了你她使用魔法的
記錄,你能不能管理她家的森林,并且回答她的詢問呢?

Solution

有點神仙,看了題解的做法
首先顯然要離線,否則空間都是錯的,這樣維護一棵樹就好了
然后發現都是區間修改,掃描線維護一下節點就好了
但是還有刪除節點這樣的操作,復雜度保證不了

不如先把樹的形態都建出來,對于 \(1\)\(n\) 的公共部分我們一起考慮,不同的部分就直接新建節點
考慮維護添加,刪除操作的復雜度
我們每產生一個新的生長節點就新建一個虛點,然后把新長出來的都接上去
如果按加入時間考慮的話,有很多連續的節點都是同一個父親,所以我們用一個虛點暫時代替它們的父親
然后對于 \(1\)\(n\) 的不同的樹,它們的父親是不一樣的,因為建立了這個虛點,所以只需要把虛點的父親變一下,就可以達到把所有的點的父親都改變的效果了

具體的也說不清楚,看代碼比較直觀.....

#include<bits/stdc++.h>
using namespace std;
template<class T>void gi(T &x){int f;char c;for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
const int N=4e5+10;
int n,m,ch[N][2],fa[N],a[N],w[N];
inline void upd(int x){w[x]=w[ch[x][0]]+w[ch[x][1]]+a[x];}
inline bool isrt(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
inline void rotate(int x){int y=fa[x];bool t=ch[y][1]==x;ch[y][t]=ch[x][!t];fa[ch[y][t]]=y;ch[x][!t]=y;fa[x]=fa[y];if(!isrt(y))ch[fa[y]][ch[fa[y]][1]==y]=x;fa[y]=x;upd(y);upd(x);
}
inline void splay(int x){while(!isrt(x)){int y=fa[x],p=fa[y];if(isrt(y))rotate(x);else if((ch[p][0]==y)==(ch[y][0]==x))rotate(y),rotate(x);else rotate(x),rotate(x);}
}
inline int access(int x){int y=0;while(x)splay(x),ch[x][1]=y,upd(x),x=fa[y=x];return y;
}
inline void link(int x,int y){access(x);splay(x);fa[x]=y;
}
inline void cut(int x){access(x);splay(x);fa[ch[x][0]]=0;ch[x][0]=0;upd(x);
}
inline int query(int x,int y){int ret=0,t;access(x);splay(x);ret+=w[x];t=access(y);splay(y);ret+=w[y];access(t);splay(t);ret-=w[t]<<1;return ret;
}
int L[N],R[N],id[N],cnt=2,ans[N],top=0;
struct data{int ty,p,x,y;inline bool operator <(const data &t)const{if(p!=t.p)return p<t.p;return ty<t.ty;}
}q[N];
int main(){freopen("pp.in","r",stdin);freopen("pp.out","w",stdout);cin>>n>>m;int op,l,r,x,y=2,tp=0,ID=1;L[1]=1;R[1]=n;id[1]=1;w[1]=a[1]=1;L[2]=1;R[2]=n;w[2]=a[2]=0;link(2,1);for(int i=1;i<=m;i++){gi(op);gi(l);gi(r);if(op==0){a[++cnt]=1;w[cnt]=1;L[++ID]=l;R[ID]=r;id[ID]=cnt;link(cnt,y);}else if(op==1){gi(x);a[++cnt]=0;w[cnt]=0;l=max(l,L[x]);r=min(r,R[x]);if(l<=r){link(cnt,y);q[++top]=(data){-1,l,cnt,id[x]};q[++top]=(data){-1,r+1,cnt,y};y=cnt;}}else gi(x),q[++top]=(data){++tp,l,id[r],id[x]};}sort(q+1,q+top+1);for(int i=1,j=1;i<=n;i++){while(j<=top && q[j].p==i){if(q[j].ty==-1)cut(q[j].x),link(q[j].x,q[j].y);else ans[q[j].ty]=query(q[j].x,q[j].y);j++;}}for(int i=1;i<=tp;i++)printf("%d\n",ans[i]);return 0;
}

轉載于:https://www.cnblogs.com/Yuzao/p/8968717.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251836.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251836.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251836.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity3D在C#編程中的一些命名空間的引用及說明

System包含用于定義常用值和引用數據類型、事件和事件處理程序、接口、屬性和處理異常的基礎類和基類。其他類提供支持下列操作的服務&#xff1a;數據類型轉換&#xff0c;方法參數操作&#xff0c;數學計算&#xff0c;遠程和本地程序調用&#xff0c;應用程序環境管理以及對…

docker入門簡介

簡介docker(容器技術)是實現虛擬化技術的一種方案,通過利用linux中命名空間,控制組和聯合文件系統這個三個主要技術,來實現應用程序空間的隔離.通過對應用程序運行環境的封裝來生成鏡像并部署來實現跨平臺,一定程度上加快了服務交付的整體流程.這篇文章主要介紹docker的一些基本…

Highcharts 配置選項詳細說明

http://www.runoob.com/highcharts/highcharts-setting-detail.html 轉載于:https://www.cnblogs.com/mengfangui/p/8969121.html

linux下的啟停腳本

linux下的根據項目名稱&#xff0c;進行進程的啟停腳本 #!/bin/bashJAVA/usr/bin/java APP_HOME/opt/program/qa/wechat APP_NAMEprogramname.jar APP_PARAM"--spring.config.location${APP_HOME}/application.properties --logging.path${APP_HOME}"case $1 in star…

python 網頁爬取數據生成文字云圖

1. 需要的三個包&#xff1a; from wordcloud import WordCloud #詞云庫 import matplotlib.pyplot as plt #數學繪圖庫 import jieba; 2. 定義變量&#xff08;將對于的變量到一個全局的文件中&#xff09;&#xff1a; import re; pdurl_firsthttps://movie.do…

python---重點(設計模式)

前戲&#xff1a;設計模式簡介 設計模式是面向對象設計的解決方案&#xff0c;是復用性程序設計的經驗總結。&#xff08;與語言無關&#xff0c;任何語言都可以實現設計模式&#xff09; 設計模式根據使用目的的不同而分為創建型模式&#xff08;Creational Pattern&#xff0…

洛谷 題解 P2010 【回文日期】

因為有8個字符&#xff0c;所以可得出每一年只有一個回文日期。 因此只要判斷每一年就行了。 做法&#xff1a; 我們先把年倒過來&#xff0c;例如2018年就倒為8102&#xff0c;就得出8102就是回文日期的后四個字符&#xff0c;我們只要判斷一下有沒有這個月份和這個日期。 具體…

線程相關

1、啟動線程1.11 new Handler()形式new Handler(mContext.getMainLooper()).post(newOnekeyBindFrameActivity.NetworkThread());1.12new Handler().postDelayed(new StatusCheckLoginBindFrameThread(), IoTCultivatePlantConfig.START_ACTIVITY_POST_DELAYED);1.2 new Thread…

驗證Oracle收集統計信息參數granularity數據分析的力度

最近在學習Oracle的統計信息這一塊&#xff0c;收集統計信息的方法如下&#xff1a; DBMS_STATS.GATHER_TABLE_STATS (ownname VARCHAR2, ---所有者名字tabname VARCHAR2, ---表名partname VARCHAR2 DEFAULT NULL, ---要分析的分區名estimate_percent NUMBER DEFAULT NULL, …

Python之NumPy(axis=0 與axis=1)區分

Python之NumPy&#xff08;axis0 與axis1&#xff09;區分 轉載于:https://www.cnblogs.com/greatljg/p/10802392.html

Python Web開發:開發wsgi中間件

本文參考了&#xff1a; github.com/alanctkc/ws…Youtube : Creating WSGI Middleware上篇文章簡要提到&#xff1a;wsgi 規范中的 app 是一個可調用對象&#xff0c;可以通過嵌套調用的方式實現中間件的功能。這篇文章就來親自動手實現一下。 此文的重點在于 app 端&#xff…

20165320 第九周學習總結

主要內容&#xff1a; 1.URL類 URL類是java.net包中的一個重要的類&#xff0c;使用URL創建對象的應用程序稱為客戶端程序。URL 的構造方法&#xff1a;try { URL url new URL ("http://www.google.com"); } catch (MalformedURLException e) {System.out.println(&…

Python 函數的執行流程-函數遞歸-匿名函數-生成器

1 函數的執行流程函數的執行需要對函數進行壓棧的&#xff0c;什么是壓棧呢&#xff0c;簡而言之就是在函數執行時在棧中創建棧幀存放需要變量以及指針的意思。具體涉及的知識非常多&#xff0c;這里就已一個Python腳本簡單進行分析。當我們運行上面代碼時&#xff0c;它的執行…

python 課堂筆記-for語句

for i in range(10):print("----------",i)for j in range(10):print("world",j)if j> 5:break 轉載于:https://www.cnblogs.com/leon-zyl/p/7542466.html

【2】信息的表示和處理

1.現代計算機存儲和處理的信息都以二值信號表示。 2.機器為什么要使用二進制進行存儲和處理&#xff1f; 答&#xff1a;二值信號能夠很容易的被表示、存儲、傳輸。例如&#xff1a; 可以表示為穿孔卡片上有洞和無洞、導線上的高壓和低壓&#xff0c;順逆時針的磁場。 3.大多數…

java版b2b2c社交電商spring cloud分布式微服務(二) 服務消費者(rest+ribbon)

一、ribbon簡介 Ribbon is a client side load balancer which gives you a lot of control over the behaviour of HTTP and TCP clients. Feign already uses Ribbon, so if you are using FeignClient then this section also applies. —–摘自官網 ribbon是一個負載均衡客…

[學習筆記]支配樹

被支配樹支配的恐懼 定義 顯然&#xff0c;這個支配關系是一個樹&#xff08;或者如果有的點不能從r到達&#xff0c;就是一個樹一堆點&#xff09;。 首先不會成環&#xff0c;其次也不會是DAG 即如果A支配C&#xff0c;B支配C&#xff0c;那么A和B之間必然有支配關系 解法 首…

RBAC 權限設計(轉載)

來源 &#xff1a;https://blog.csdn.net/rocher88/article/details/43190743 這是我在網上找的一些設計比較好的RBAC權限管理不知道&#xff0c;像新浪、搜狐、網易、百度、阿里巴巴、淘寶網的RBAC用戶權限這一塊&#xff0c;都是這種細顆粒的RBAC設計開發&#xff0c;還是把他…

54.get set

當程序查詢對象屬性時調用get方法,如果只有get方法那么他是一個只讀屬性&#xff0c;//程序對對象屬性進行賦值操作時調用set方法&#xff0c;如果只有set方法那么他是是一個只讀屬性 <script type"text/javascript">var p {x:1.0,y:1.0,//當程序查詢對象屬性…

Codeforces Round #554 Div.2 E - Neko and Flashback

歐拉路徑 神題啊神題&#xff01;這道題的突破口就是后兩個數組每個元素是一一對應的。 也就是說&#xff0c;對于一個p的排列&#xff0c;b和c取得每一個元素的下標在p中都是一樣的。 根據b和c數組的性質可以得出&#xff0c;b[i] < c[i]。 這也是我們輸出-1的一個判斷方法…