魔法樹
(mahou.pas/c/cpp)
【問題描述】
魔法使mored在研究一棵魔法樹。
魔法樹顧名思義,這貨是一棵樹
,奇葩的是魔法樹上的每一條邊都擁有乙個魔法屬性
,如果不那麼奇葩就不是mored的魔法樹了。
魔法使mored在研究這棵魔法樹的方法比較奇葩,每一次他會選擇一條路徑
施法。
這個魔法是mored的看家本領,叫元素剝離。施法過程是這樣的:首先,mored將把他的寵物通靈到魔法樹上選定路徑的一端
,通靈不需要
魔法值。初始時,寵物不擁有任何屬性。
寵物會在mored的指使下沿著路徑走到另乙個端點。在走過樹上的邊時。若該寵物已經擁有該邊的屬性,該寵物就會自己施法,使用當前邊的屬性,幫自身把相同的屬性剝離,剝離完成後,寵物自身便不再帶有該屬性;否則,寵物會吸收該屬性,即讓自身擁有該屬性。
寵物完成自己的旅途後,mored要對寵物進行**。**時,若mored的寵物不帶有屬性,則mored需要使用1點魔法值。否則mored使用的魔法值將是寵物剩下的屬性所需剝離魔法值的積
,以此來幫助自己的寵物剝離剩下的屬性。
mored想知道,對於每條選定的路徑,mored需要的魔法值數額對
100,000,007
取mod
後的值是多少?
【輸入格式】
輸入第一行包含兩個整數n,q,k,表示魔法樹的大小,詢問數以及屬性的數量。
接下來n-1行,每行表示一條魔法樹上的邊,ai,bi,ci。表示一條連線ai,bi兩個點的邊帶有屬性ci.
接下來一行,k個整數表示對於剝離每種屬性所需的魔法值cost i。
接下來q行,每行一組詢問,pi,qi表示mored選定的施法路徑。
【輸出格式】
對於每組資料輸出一行,表示該組詢問的答案。
【輸入樣例】
5 4 3
1 2 2
1 5 3
2 3 2
2 4 1
1 2 3
3 51 3
4 54 4
【輸出樣例】
【資料範圍】
對於前40%的資料 n,q≤1,000
對於前80%的資料n≤100,000,q≤40,000
對於100%的資料n,q≤500,000 1≤ci≤k≤20 1≤ai,bi,pi,qi≤n cost i≤100,000,000
對於所有奇數點的資料滿足所有pi=1。
【題解】
#include#includeusing namespace std;
static int bin[21],root=1;
void make_bin()
inline int read()
while(c>47&&c<58)x=x*10+c-48,c=getchar();
return x*f;
}int n,q,k,m,cost[500001];
int v[1000001],first[1000001],nxt[1000001],magic[1000001];
bool vis[500001];
int qq[500101],f[1000001];
void link(int x,int y,int z)
void bfs() }}
int main()
bfs();
for(int i=1;i<=k;i++)
cost[i]=read();
while(q--)
printf("%i64d\n",mul);
} fclose(stdin);
fclose(stdout);
return 0;}/*
5 4 3
1 2 2
1 5 3
2 3 2
2 4 1
1 2 3
3 51 3
4 54 4
*/
NOIP模擬 魔法數字
在數論領域中,人們研究的基礎莫過於數字的整除關係。一般情況下,我們說整除總在兩個數字間進行,例如 a b a能整除b 表示 b 除以 a 的餘數為 0 我們稱乙個數字 x 是魔法的,當且僅當 x 是整數,且它能被 k 及 k 以上種一位數整除,要求這若干種一位數均在 x 的十進位制表示中出現。給出整...
2018 10 14 noip模擬賽 超級樹
題意 給定乙個深度為k的滿二叉樹,將他的所有節點向這個點的所有祖宗連邊,求新生成的這樣一棵樹中經過乙個點最多的路徑數目 怎麼搞?顯然是個遞推嘛.記狀態f i j 代表二叉樹的深度為i,從中選出j條互不相交的路徑的方案數 即這些路徑不會經過同乙個點超過一次 然後呢?我們會發現,由i變成i 1時,超級樹...
noip模擬賽 蒜頭君的樹
分析 這道題問的是樹上整體的答案,當然要從整體上去考慮.一條邊對答案的貢獻是這條邊一端連線的點的個數 另一端連線的點的個數 邊權,可以用一次dfs來統計答案,之後每次更改操作在原答案的基礎上增減就好了.千萬不要傻傻地去求lca.事實證明只有10分.問的是任意兩點最短距離之和,樹上兩個點的最短路徑只有...