1. 程式人生 > >HDU-6430:Problem E. TeaTree(bitset)

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

v[i].
For every two nodes i and j (i is not equal to j), they will tell their Lowest Common Ancestors (LCA) a number : gcd(v[i],v[j]).
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 f[2],f[3],,f[n],f[i] describe the father of node i on tree.
Next line there are n positive integers v[2],v[3],,v[n],v

[i] describe the value of node i.
n<=100000,f[i]<i,v[i]<=100000

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-6430Problem E. TeaTreebitset

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 - 6197array 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 - 5421Victor 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 Widgets3配置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 2017vNext的第三個公開的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,遵守什麽交規,最終

uva10763 - 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$ 的值