NOI2015 軟體包管理器

2022-05-05 18:27:09 字數 2309 閱讀 7060

傳送門

最近學了樹剖我們來做幾道題練練手。

這個題我覺得也是板子題啊……

反正就是對於乙個安裝操作,就在它自己所在鏈向上跳,如果當前鏈頂已經被安裝的話計算一下從這個點到鏈頂還有多少沒被安裝即可。每次向上跳的時候都要把經過的鏈上的點全改為1.至於解除安裝操作就更簡單了,直接先統計自己子樹內有多少節點值為1的兒子(已安裝軟體),之後區間修改為0即可。如果這個點已經被安裝/解除安裝相對應的就可以不執行這次操作。

這題還是很好寫的,一次ac。(之後就是樹剖無限bug的開始)

看一下**。

#include#include

#include

#include

#include

#include

#include

#define rep(i,a,n) for(int i = a;i <= n;i++)

#define per(i,n,a) for(int i = n;i >= a;i--)

#define enter putchar('\n')

using

namespace

std;

typedef

long

long

ll;const

int m = 100005

;int

read()

while(ch >= '

0' && ch <= '9'

)

return ans *op;

}struct

segt[m

<<2

];struct

edge

e[m<<1

];int

n,dfn[m],rk[m],a[m],size[m],dep[m],fa[m],hson[m],q,x,y,head[m],ecnt,idx,top[m];

char s[15

];void add(int x,int

y)void dfs1(int x,int f,int

depth)

}void dfs2(int x,intt)}

void build(int p,int l,int

r)

int mid = (l+r) >> 1

; build(p

<<1,l,mid),build(p<<1|1,mid+1

,r);

}void pushdown(int p,int l,int

r)int query(int p,int l,int r,int kl,int

kr)void modify(int p,int l,int r,int kl,int kr,int

val)

int mid = (l+r) >> 1

;

if(t[p].lazy != -1

) pushdown(p,l,r);

if(kr <= mid) modify(p<<1

,l,mid,kl,kr,val);

else

if(kl > mid) modify(p<<1|1,mid+1

,r,kl,kr,val);

else modify(p<<1,l,mid,kl,mid,val),modify(p<<1|1,mid+1,r,mid+1

,kr,val);

t[p].v = t[p<<1].v + t[p<<1|1

].v;

}int qrange(int

x)

int g = dfn[x] - dfn[top[x]] + 1

;

//printf("#%d %d\n",g,x);

//printf("!%d\n",query(1,0,n,dfn[top[x]],dfn[x]));

ans += (g - query(1,0,n,dfn[top[x]],dfn[x])),modify(1,0,n,dfn[top[x]],dfn[x],1

);

//printf("!%d\n",query(1,0,n,dfn[top[x]],5));

return

ans;

}int qson(int

x)int

main()

printf(

"%d\n

",qrange(x));

}else

if(s[0] == 'u'

)

printf(

"%d\n

",qson(x));}}

return0;

}

noi2015軟體包管理器

你決定設計你自己的軟體包管理器。不可避免的,你要解決軟體包之間的依賴關係。如果a依賴b,那麼安裝a之前需安裝b,解除安裝b之前須解除安裝a。0號軟體包不依賴任何軟體包。依賴關係不存在環 包括自環 你的任務是,求出每次安裝 刪除操作會改變多少個包的狀態。安裝乙個已安裝的軟體包,或者解除安裝乙個未安裝的...

Noi2015 軟體包管理器

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

NOI2015 軟體包管理器

樹鏈剖分維護。1表示安裝的狀態,0表示沒有安裝的狀態。如果install就是把當前點到根的所有點都變成1,然後計算前後的 delta 如果uninstall呢,就是把自己的子樹變成0,答案也是前後的 delta 具體可以參照 不過我的 常數好大啊,跑得好慢。如下 include include in...