P2146 NOI2015 軟體包管理器

2022-05-19 22:17:04 字數 1540 閱讀 8781

p2146 [noi2015]軟體包管理器

一道樹鏈剖分……

還算是比較裸的樹剖w

對於查詢(影響數)的話只需要查詢原本根節點值與現根節點值差異就可以了

#include #include #include #include #include using namespace std;

#define maxn 100233

//data

int n;

int ans[maxn<<2],tag[maxn<<2]={};

struct qwq

e[maxn<<1];

int h[maxn],son[maxn],siz[maxn],fa[maxn],top[maxn],id[maxn],dep[maxn];

int tot=0,cnt=0;

//data_end.

void add(int x,int y)

//dfs<<1

inline void dfs_fir(int x,int f,int dept)

}}inline void dfs_sec(int x,int ft)

}//dfs_end.

//segment_tree

#define ll long long

#define leftson cur<<1

#define rightson cur<<1|1

#define mid ((l+r)>>1)

#define push_up ans[cur]=ans[leftson]+ans[rightson]

#define push_down lazyadd(leftson,l,mid,tag[cur]); lazyadd(rightson,mid+1,r,tag[cur]); tag[cur]=-1

void lazyadd(int cur,int l,int r,int del)

inline void change(int adl,int adr,int cur,int l,int r,int del)

push_down;

if (adl<=mid) change(adl,adr,leftson,l,mid,del);

if (adr>mid) change(adl,adr,rightson,mid+1,r,del);

push_up;

}#undef ll

//segment_tree_end.

void upd(int x,int y,int del)

int main()

for (int i=1;i<=(n<<2);i++)

dfs_fir(1,1,1);

dfs_sec(1,1);

int q;

scanf("%d",&q);

string s;

int tat;

for (int i=1;i<=q;i++)

upd(1,a,1);

printf("%d\n",abs(tat-ans[1]));

}}

殘廢了。。。

P2146 NOI2015 軟體包管理器

很好的樹剖板子題 操作一 求點x到0的最短路徑 經過的結點個數 路徑上已安裝的軟體包的總個數,同時將經過的路徑上的所有點標記為已安裝。操作二 將子樹代表的那段存安裝包個數的區間清空 或者是說將其sum值賦值為0 此處為了實現標記已安裝和清空,我們用了乙個標記add add i 1 線段樹上的點i及其...

P2146 NOI2015 軟體包管理器

輸入格式 從檔案manager.in中讀入資料。輸入檔案的第1行包含1個整數n,表示軟體包的總數。軟體包從0開始編號。隨後一行包含n 1個整數,相鄰整數之間用單個空格隔開,分別表示1,2,3,n 2,n 1號軟體包依賴的軟體包的編號。接下來一行包含1個整數q,表示詢問的總數。之後q行,每行1個詢問。...

P2146 NOI2015 軟體包管理器

p2146 noi2015 軟體包管理器 樹鏈剖分 帶區間修改線段樹 install操作 該點到根之間修改成1 uni操作 該點及其子樹修改成0 每次操作時和上次的相減一下即可 include include include include using namespace std template ...