xmu 1466 祖先極值

2022-09-23 09:18:11 字數 3026 閱讀 8548

1466.祖先極值

time limit: 5000 ms memory limit: 131072 k

total submissions: 153 (39 users) accepted: 43 (25 users)

[ my solution]

description

在一棵有向樹中, 若節點u至節點v之間有一條有向邊, 則我們稱u為v的父節點, 也可以稱作1祖先節點。所謂節點v的k祖先節點, 指的是節點v的父節點的k-1祖先節點。現在, 給定你一棵以0為根節點的樹, 樹上的每個節點都有乙個值, 你需要能快速的回答出從節點v至它的k祖先節點所經過的所有節點中(即v節點、v節點的1祖先、...、v節點的k-1祖先、v節點的k祖先), 值最大的節點的值的為多少? 其中我們預設0號節點的值為0。

input

輸入的第一行有乙個正整數n (n <= 100,000), 接下來的一行有n個整數ai(1 <= i <= n, 1 <= ai <= 1,000,000,000), 第i個數字代表了第i號節點上的數值。再接下來的一行有n個正整數bi(1 <= i <= n, 0 <= bi < i), 第i個數字代表了第i號節點的父節點的為bi。再接下來有乙個整數m (1 <= m <= 100,000), 代表了詢問的次數, 接下來的m行, 每行有2個整數k, v (1 <= k <= n, 1 <= v <= n), 代表了詢問, 從v節點到它的k祖先所經歷的所有節點中的最大值。

output

對於每次詢問, 若v節點不存在k祖先, 則輸出一行"wrong request", 否則輸出乙個整數, 代表了從v節點到它的k祖先所經歷的所有節點中的最大值。

sample input

51 2 2 1 3

0 0 1 1 2

41 4

2 22 3

1 5sample output

1wrong request23

唉,我真是太笨了,看了別人的**才會做,就是以樹的高度作為區間查詢

妹的,苦逼的除錯

[cpp]

#include  

#include  

#include  

#include  

#include  

using namespace std; 

#define n 100010  

#define l(i)  i<<1  

#define r(i)  i<<1|1  

struct nodet[n*4]; 

int mx; 

struct data; 

int v[n],ans[n];//值,答案  

vectora[n]; 

vectorson[n]; 

void build(int l,int r,int k) 

int insert(int d,int k,int v) 

void query(int l,int r,int k) 

int ll=l(k); 

int rr=r(k); 

if(t[ll].r>=r)query(l,r,ll);//往左  

else if(t[rr].l<=l)query(l,r,rr);//往右  

else 

} void dfs(int x,int d) 

for(i=0;i

dfs(son[x][i],d+1);//遞迴遍歷  

} int main() 

scanf("%d",&n); 

for(i=0;i

scanf("%d%d",&j,&k); 

s.x=j;s.id=i; 

a[k].push_back(s); 

} /*for(i=0;i<=n;i++)

cout<

}*/ 

dfs(0,0);//從根遍歷到最後  

for(i=0;i

if(ans[i]==-1)printf("wrong request\n"); 

else printf("%d\n",ans[i]); 

} return 0; 

} #include

#include

#include

#include

#include

using namespace std;

#define n 100010

#define l(i)  i<<1

#define r(i)  i<<1|1

struct nodet[n*4];

int mx;

struct data;

int v[n],ans[n];//值,答案

vectora[n];

vectorson[n];

void build(int l,int r,int k)

int insert(int d,int k,int v)

void query(int l,int r,int k)

int ll=l(k);

int rr=r(k);

if(t[ll].r>=r)query(l,r,ll);//往左

else if(t[rr].l<=l)query(l,r,rr);//往右

else

}void dfs(int x,int d)

for(i=0;i

dfs(son[x][i],d+1);//遞迴遍歷

}int main()

scanf("%d",&n);

for(i=0;i

scanf("%d%d",&j,&k);

s.x=j;s.id=i;

a[k].push_back(s);

}  /*for(i=0;i<=n;i++)

cout<

}*/dfs(0,0);//從根遍歷到最後

for(i=0;i

if(ans[i]==-1)printf("wrong request\n");

else printf("%d\n",ans[i]);

}return 0;

}

模擬 XMU 1055 數七

題目大意 報數遊戲,不能報7的倍數和2進製下含有111的數。給定n,m 1 n,m 20 表示起始位和總人數。報到255為止。能報輸出二進位制,否則 pass 題目思路 模擬 暴力模擬即可。十進位制轉二進位制。by cool include include include include inclu...

XMU 1465 連續數列

1465.連續數列 time limit 1000 msmemory limit 65536 k total submissions 397 77 users accepted 48 29 users description 所謂連續整數列,指的是將含有n個整數的數列a中的所有整數重新從小到大排序以...

xmu 1001 宅男健身計畫

description 宅男thebeet有一天心血來潮發誓要開始鍛鍊身體,他給自己訂了乙個計畫 他在宿舍的中間擺了乙個椅子,今天也就是第0天繞著椅子跑1圈,明天也就是第1天繞著椅子跑2圈,後天也就是第2天繞著椅子跑4圈,大後天也就是第3天跑8圈 以後每天跑的圈數是前一天的兩倍。thebeet對自己...