題目鏈結
題意是給一棵樹,每個點有點權,然後每次詢問給乙個子樹和乙個x,問子樹上面所有的點中異或x的最大值是多少。
這個題目可以離線用字典樹合併的方式,從葉子往根去合併,也可以用dfs序直接把子樹轉化為區間上的問題,然後用可持續化trie樹去做。
可持續化trie樹本質其實和主席樹的建樹方式差不多,動態建樹且每一次新增一條鏈。然後當詢問某乙個子樹的時候,通過dfs序把它變成乙個區間,然後就是01字典樹上面走走。從高到底看看這一位有沒有與x相反的bit位,如果有還要判斷是否在l到r的區間上。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define long long long
const
int inf=0x3f3f3f3f;
const long mod=1e9+ 7;
const
double pi=acos(-1.0);
#define clri(x) memset(x,-1,sizeof(x))
#define clr0(x) memset(x,0,sizeof x)
#define clr1(x) memset(x,inf,sizeof x)
#define clr2(x) memset(x,-inf,sizeof x)
#define eps 1e-10
#define lson l , mid , rt<< 1
#define rson mid + 1 ,r , (rt<<1)+1
#define root 1, n , 1
const
int maxn = 140000 ;
int l[maxn + 50 ] , r[maxn + 50] ;
int tot = 0;
int root[maxn + 50 ] ;
struct trie
}trie[ (maxn << 6 )+ (maxn << 5)];
struct edge
edge[200100] ;
int head[maxn] ;
int tot = 0 ;
int cnt = 0 ;
int v[maxn] ;
int rank[maxn] ;
void init()
void add(int u ,int v)
void dfs(int pre ,int u)
r[u] = cnt ;
}void build(int x)
now = trie[now].next[p] ;
trie[now].sum ;
}}int insert(int x , int rt , int d )
int que(int x ,int l_rt,int r_rt)
else}}
return res ;
}int main()
dfs( -1 , 1) ;
for(int i= 1;i<= n ; ++ i)
trie[0].init() ;
for(int i = 1 ;i<= n ; ++ i)
build(v[rank[ i ] ]) ;
root[0] = 0 ;
for(int i = 1;i<= n ; ++ i)
root[i] = insert( v[rank[i]] , root[i-1 ] , 31) ;
int u , x;
int l ,r ;
int ans = 0 ;
while(q --)
}return
0 ;}
廣西邀請賽總結
2017年8月25號到8月28號,zqu集訓隊6人參加了廣西的一次邀請賽,這是我們第一次離開廣東省打的邀請賽。雖然這次還是沒能衝擊到獎牌,但這次比賽使我更加堅定地在演算法競賽道路上付出的決心。廣西距離肇慶不遠,3個多小時高鐵就能到達南寧,這次學校的住宿日程安排我是滿意的。一共四天的行程,第一天到的下...
2017ACM ICPC廣西邀請賽
c counting stars 無向圖求三元環 這裡需要一些小小的改動 題目中要求的a結構其實是兩個具有一條公共邊的三元環 求這樣的個數 根據演算法我們一開始就是先列舉一條邊,這樣我們就以第一條邊為公共邊,找出三元環的個數,然後從這n個中選2個即可,也就是sum sum 1 2 include i...
2017 ACM ICPC 廣西邀請賽 題解
題目鏈結 problems hdoj上的題目順序可能和現場比賽的題目順序不一樣,我這裡的是按照hdoj的題目順序來寫的。problem 1001 簽到 include using namespace std define rep i,a,b for int i a i b i typedef lon...