hdu 6430 bitset暴力
阿新 • • 發佈:2018-12-01
題意:
一棵有根樹,1e5,輸出每個節點的一個查詢,查詢定義為:以這個節點為根的樹任選兩個節點 權值GCD 最大 若沒有孩子,則為-1
思路:
群裡看見bitset居然有find_first()和find_next(x)的操作,搜了一下抄了一個大佬的思路具體實現就是 暴力子樹的因子,用bitset合併,查詢就在合併的時候&(保證了因子出現兩次)然後find_first一下就行了。因為沒有findlast,我們插入的時候反著插入就可以了 顯然時間複雜度n*n/64
程式碼:
#include<bits/stdc++.h> #define PB push_back using namespace std; const int N = 1e5+7; vector<int> E[N]; int v[N],ans[N],n,x; bitset<N> gao(int x){ bitset<N> as(0),bs(0); for(int i=1;i*i<=v[x];i++) if(v[x]%i==0)as[N-i]=as[N-v[x]/i]=1; int ret=-1,en=E[x].size(); for(int i=0;i<en;i++){ bs=gao(E[x][i]); ret=max(ret,(int)(N-(as&bs)._Find_first())); as|=bs; } ans[x]=ret; return as; } int main(){ std::ios::sync_with_stdio(false); cin>>n; for(int i=2;i<=n;i++){ cin>>x; E[x].PB(i); } for(int i=1;i<=n;i++)cin>>v[i]; gao(1); for(int i=1;i<=n;i++)cout<<ans[i]<<endl; return 0; }