題目大意:
一共有n個軟體,這些軟體相互依賴。這種依賴關係共有n-1對。如果a依賴b,安裝a時必須安裝b,解除安裝b時必須解除安裝a。
現在輸入軟體間的依賴關係,詢問安裝或解除安裝乙個軟體一共會有幾個軟體受到影響。
題解:
很明顯,這些軟體可以構成一棵樹。
安裝a即為詢問從a到根節點的路徑中有多少軟體未安裝
解除安裝a即為詢問以a為根節點的子樹有多少軟體已安裝。
將安裝的節點設為1,初始設為0
利用樹鏈剖分模板就可以直接解決安裝問題,(answer = depth[ i ]-sum)
(比模板還簡單)
**:
#include#include#include#include#include#include#include#define maxn 200010
using namespace std;
int n,cnt,wcnt;
int size[maxn],w[maxn],son[maxn],prt[maxn],vis[maxn],dep[maxn];
int d[maxn],top[maxn];
struct edge
ep[3*maxn],*h[maxn];
void addedge(int u,int v)
void input()
son[u]=maxson;
}void dfs_2(int u)
for(edge *p=h[u];p;p=p->next)
if(!vis[v=p->v])
}struct node
pool[3*maxn],*root;
void build_tree(node *p,int left,int right)
void change(node *p,int left,int right,int lazy)
return ;
}if(p->lazy)
if(p->lson->right >= right) change(p->lson,left,right,lazy);
else if(p->rson->left <= left) change(p->rson,left,right,lazy);
else
}int query(node *p,int left,int right)
if(p->lazy)
if(p->lson->right >= right) return query(p->lson,left,right);
else if(p->rson->left <= left) return query(p->rson,left,right);
else
}int query_tree(int a,int b)
{ int x=top[a],y=top[b],sum=0;
while(x!=y)
{if(dep[x]
NOI1997 Day2 T1 最佳遊覽
noi1997 day2 t1 最佳遊覽 time limit 1000ms memory limit 65536k total submit 219 accepted 112 description input 第一行是兩個整數m和n,之間用乙個空格符隔開,n表示旅遊城南北向林萌道的條數,m表示東...
NOI2006 Day2 T1 最大獲利
noi2006 day2 t1 最大獲利 time limit 20000ms memory limit 65536k total submit 66 accepted 41 case time limit 2000ms description 新的技術正衝擊著手機通訊市場,對於各大運營商來說,這既...
noip2015day1t2 資訊傳遞
把每個同學看成乙個點,傳遞關係看成一條邊,點數等於邊數,因此圖由若干個環或環鏈復合邊數等於點數的東西組成,不存在孤立鏈。在圖上,傳遞一輪後,每個點掌握沿邊前乙個點的資訊,傳遞x輪後,任意乙個點恰好掌握沿邊反向前進x條邊的路徑上的所有點的資訊,要聽到自己的資訊,也就是在環上走一圈。這樣就把題目抽象為找...