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 ...