HDU-6430:Problem E. TeaTree(bitset)
Problem E. TeaTree
Time Limit: 8000/4000 MS (Java/Others)
Memory Limit: 524288/524288 K (Java/Others)
Problem Description
Recently, TeaTree acquire new knoledge gcd (Greatest Common Divisor), now she want to test you.
As we know, TeaTree is a tree and her root is node 1, she have n nodes and n-1 edge, for each node i, it has it’s value
For every two nodes i and j (i is not equal to j), they will tell their Lowest Common Ancestors (LCA) a number : .
For each node, you have to calculate the max number that it heard. some definition:
In graph theory and computer science, the lowest common ancestor (LCA) of two nodes u and v in a tree is the lowest (deepest) node that has both u and v as descendants, where we define each node to be a descendant of itself.
Input
On the first line, there is a positive integer n, which describe the number of nodes.
Next line there are n-1 positive integers describe the father of node i on tree.
Next line there are n positive integers describe the value of node i.
Output
Your output should include n lines, for i-th line, output the max number that node i heard.
For the nodes who heard nothing, output -1.
Sample Input
4
1 1 3
4 1 6 9
Sample Output
2
-1
3
-1
思路:因為每個數的因子只有100多個,所以看似暴力的做法其實可以過。從大神那學習了一種寫法,bitset動態儲存每個子樹的所有的因子數。
把每個數當成一個bit,然後把約數反向存入bitset,這樣就可以用bitset的_Find_first()函式找到最低位的1,即最大的約數。
PS:如果這棵樹是一條鏈的話,空間可能就炸了。所以還是建議用啟發式合併。。
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e5+10;
const int N=1e5;
typedef long long ll;
vector<int>e[MAX];
vector<int>d[MAX];
int a[MAX],ans[MAX];
bitset<MAX>*b[MAX];
void dfs(int k)
{
b[k]=new bitset<MAX>(0);//動態開記憶體
for(int j=0;j<d[a[k]].size();j++)(*b[k])[N-d[a[k]][j]]=1;//將a[k]的約數反著存入節點
for(int i=0;i<e[k].size();i++)
{
int nex=e[k][i];
dfs(nex);
int x=((*b[k])&(*b[nex]))._Find_first();//找到bitset裡面最低位的1
(*b[k])|=(*b[nex]); //合併兒子節點
ans[k]=max(ans[k],N-x);
delete b[nex]; //刪除兒子節點
}
}
int main()
{
for(int i=1;i<=1e5;i++)
for(int j=i;j<=1e5;j+=i)d[j].push_back(i);//預處理約數
int n;
scanf("%d",&n);
for(int i=2;i<=n;i++)
{
int x;
scanf("%d",&x);
e[x].push_back(i);
}
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
memset(ans,-1,sizeof ans);
dfs(1);
for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
return 0;
}
相關推薦
HDU-6430:Problem E. TeaTree(bitset)
Problem E. TeaTree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Problem Description Recen
[HDU 6430] 2018 Multi-University Training Contest 10 Problem E. TeaTree 暴力 bitset
題目大意 一顆樹, 每個節點上有一個小於等於1e5的數字, 然後每個節點的值等於所有以它為LCA 的節點對(i, j)中gcd(v[i], v[j])的最大值, 要求輸出所有節點的值 思路 一開始想到用bitset記錄每個節點的所有因數, 但T
HDU 6430 Problem E. TeaTree(線段樹)
Problem E. TeaTree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Total Submission(s): 781
玲瓏杯 Round #5 Problem E Tetration (枚舉 + 歐拉公式)
frog def int 歐拉公式 bsp 公式 log www perm 題目鏈接 Tetration 題意 給定一個排列 現在可以任意調整這個排列的順序 求$a_{1}^{a_{2}^{a_{3}^{...^{a_{n}}}}}$對$p$取模的最小值
HDU - 6197:array array array (簡單LIS)
One day, Kaitou Kiddo had stolen a priceless diamond ring. But detective Conan blocked Kiddo's path to escape from the museum. But Kiddo didn't want to g
Problem E – Enigma(數位dp)
題意: 給一個1000位大數,有些位置用?遮住,給出這個大數的一個1000以內的因子k,求這個大數(多個輸出最小的,沒有輸出*) 解析: 這麼經典的數位dp居然沒想出來。 dp[i][j]表示到第i位為止可能%k=j的第i位上的最小數設第i位上的數為x,r為i
HDU - 5421:Victor and String (回文樹,支持首尾插入新字符)
std ref == bsp ner efi hdu fail containe Sample Input 6 1 a 1 b 2 a 2 c 3 4 8 1 a 2 a 2 a 1 a 3 1 b 3 4 Sample Output 4
HDU - 6125: Free from square (狀壓DP+分組背包)
素數 scanf style 多少 tor mod def c++ n) problem:給定N,K。表示你有數1到N,讓你最多選擇K個數,問有多少種方案,使得選擇的數的乘積無平方因子數。N,K<500; solution:顯然可以狀壓DP做,但是500以內的素數還
Pro Android學習筆記(一三七):Home Screen Widgets(3):配置Activity
map onclick widgets info xtra ces extends height appwidget 文章轉載僅僅能用於非商業性質,且不能帶有虛擬貨幣、積分、註冊等附加條件。轉載須註明出處http://blog.csdn.net/flowingfly
Windows Phone開發(10):常用控件(上)
androi chm att size near grid txt idt inf Windows Phone的控件有幾個來源,和傳統的桌面應用程序開發或Web開發一樣,有默認提供的控件和第三方開者發布的控件。一般而言,如果不是過於復雜的界面布局,使用默認控件就足矣。相比之
消息:SQL Server 2017(vNext)的第三個公開的CTP(社區技術預覽版)發布了
start spn system 看到了 一個 get creat 社區 目前 今天看到了一個新聞,跟大家分享一下,有興趣的可以去嘗試一下。 SQL Server 2017 CTP3於5月23日發布了,詳細版本號是6.7.55.0。 大家可以去安裝試試。在下載頁面,目前是S
Kotlin VS Java:基本語法差異(轉載)
允許 接收 point this view 學習 替換 同時 ons 5月18號,goole宣布Kotlin成為官方支持的開發語言以來,Kotlin語言社區,公眾號,qq群等全面轟炸,本文是一篇譯文,來自國外的一個用戶,將給大家介紹,基礎語法部分Kotlin和java之間的
UVM序列篇之二:sequence和item(上)
技術 一點 目標 idt 需要 開始 掛載 ron 前行 無論是自駕item,穿過sequencer交通站,通往終點driver,還是坐上sequence的大巴,一路沿途觀光,最終跟隨導遊停靠到風景點driver,在介紹如何駕駛item和sequence,遵守什麽交規,最終
uva:10763 - Foreign Exchange(排序)
希望 return pri con com 解題思路 track || blog 題目:10763 - Foreign Exchange 題目大意:給出每一個同學想要的交換坐標 a, b 代表這位同學在位置a希望能和b位置的同學交換。要求每一位同學都能
Spring源碼:IOC原理解析(二)
main 節點 定義 nat ner multicast esp loading more 版權聲明:本文為博主原創文章,轉載請註明出處,歡迎交流學習! 接著上一章節的內容,我們來分析當new一個FileSystemXmlApplicationContext對
去哪網實習總結:開發定時任務(JavaWeb)
pri simple mod 節點 easy run dsm 16px 發送郵件 本來是以做數據挖掘的目的進去哪網的,結構卻成了系統開發。。。 只是還是比較認真的做了三個月,老師非常認同我的工作態度和成果。。。 實習立即就要結束了。總結一下幾點之前沒有註意過的變成
Spark源代碼分析之六:Task調度(二)
oge 3.4 總結 utili filter 相關 .com ram 順序 話說在《Spark源代碼分析之五:Task調度(一)》一文中,我們對Task調度分析到了DriverEndpoint的makeOffers()方法。這種方法針對接收到的Re
設計模式之十八:橋接模式(Bridge)
ora 它的 pla sin string src ams down ng- 橋接模式: 將抽象部分和它的實現部分相分離開來,以使它們能夠單獨地變化。 UML圖: 主要包含: Abstraction:定義了抽象部分的接口。操作一個實現部分對
HDU 6043 KazaQ's Socks (規律)
n-1 cnblogs sample swe 順序 裏的 this c-s close Description KazaQ wears socks everyday. At the beginning, he has nn pairs of socks numbered
初等數學問題解答-9:恒等變形(二)
教育 奧賽 包括 美國 $$ col 高中數學 arr 國內 本題適合初一以上數學愛好者解答 問題: 若 $abc = -1$ 且 $\dfrac{a^2}{c} + \dfrac{b}{c^2} = 1$,求 $ab^5 + bc^5 + ca^5$ 的值