bzoj4196 Noi2015 軟體包管理器

2022-08-22 22:15:10 字數 1295 閱讀 5004

傳送門:

思路:裸裸的樹鏈剖分。設已安裝的為1,未安裝的為0。

對於安裝操作,就是詢問x到0的路徑上0的個數,然後把這個路徑賦為1

對於解除安裝操作,就是詢問x的子樹中1的個數,然後把子樹賦為0。

#include#include#include#define ls (p<<1)

#define rs ((p<<1)|1)

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

const int maxn=200010,maxt=maxn<<2;

using namespace std;

int n,q,last[maxn],pre[maxn],now[maxn],son[maxn],tot,a[maxn],cnt,w[maxn],size[maxn],hson[maxn],top[maxn],fa[maxn],dep[maxn];

char op[12];

struct tree

}void build(int p,int l,int r)

build(ls,l,mid),build(rs,mid+1,r);

sum[p]=sum[ls]+sum[rs],size[p]=size[ls]+size[rs];

}void change(int p,int l,int r,int a,int b,int v)

down(p);

if (b<=mid) change(ls,l,mid,a,b,v);

else if (a>mid) change(rs,mid+1,r,a,b,v);

else change(ls,l,mid,a,mid,v),change(rs,mid+1,r,mid+1,b,v);

sum[p]=sum[ls]+sum[rs];

}int query(int p,int l,int r,int a,int b)

down(p);

if (b<=mid) return query(ls,l,mid,a,b);

else if (a>mid) return query(rs,mid+1,r,a,b);

else return query(ls,l,mid,a,mid)+query(rs,mid+1,r,mid+1,b);

}}seg;

void add(int a,int b)

void dfs(int x)}

void btree(int x,int tp)

void answer(int a,int b)

int main()

}return 0;

}

bzoj4196 NOI2015 軟體包管理器

time limit 10 sec memory limit 512 mb submit 1168 solved 672 你決定設計你自己的軟體包管理器。不可避免地,你要解決軟體包之間的依賴問題。如果軟體包a依賴軟體包b,那麼安裝軟體包a以前,必須先安裝軟體包b。同時,如果想要解除安裝軟體包b,則必...

bzoj 4196 Noi2015 軟體包管理器

你決定設計你自己的軟體包管理器。不可避免地,你要解決軟體包之間的依賴問題。如果軟體包a依賴軟體包b,那麼安裝軟體包a以前,必須先安裝軟體包b。同時,如果想要解除安裝軟體包b,則必須解除安裝軟體包a。現在你已經獲得了所有的軟體包之間的依賴關係。而且,由於你之前的工作,除0號軟體包以外,在你的管理器當中...

bzoj4196 Noi2015 軟體包管理器

題目大意 有一棵樹,兩個修改 install x 把根節點到 x 軟體路徑上的值全部變為 1 並輸出修改的節點個數 uninstall x 把 x 以及它的子樹的值變為 0 並輸出修改的節點個數 題解 樹鏈剖分,比較一下修改前後值的變化,即為答案 卡點 1.邊忘記開兩倍 c code include...