社区讨论
树上倍增30pts求助
P7167[eJOI 2020] Fountain (Day1)参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lp826fuo
- 此快照首次捕获于
- 2023/11/21 16:13 2 年前
- 此快照最后确认于
- 2023/11/21 19:19 2 年前
莫名挂掉的树上倍增(雾
CPP#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
const int M=25;
int n,q;
struct Node{
int d,c,f[M],siz[M];
}tr[N];
pair<int,int>rec;
stack<pair<int,int>>sta;
int sol(int r,int v){
if(r==0)return r;
if(v<=tr[r].c)return r;
for(int k=20;k>=0;k--){
if(tr[r].siz[k]>=v)continue;
v-=tr[r].siz[k];
r=tr[r].f[k];
break;
}
return sol(r,v);
}
signed main(){
scanf("%lld%lld",&n,&q);
for(int i=1;i<=n;i++){
scanf("%lld%lld",&tr[i].d,&tr[i].c);
tr[i].siz[0]=tr[i].c;
if(!sta.empty())rec=sta.top();
while(!sta.empty()&&rec.first<=tr[i].d){
sta.pop();
tr[rec.second].f[0]=i;
if(!sta.empty())rec=sta.top();
}
sta.push(make_pair(tr[i].d,i));
}
if(!sta.empty())rec=sta.top();
while(!sta.empty()){
sta.pop();
tr[rec.second].f[0]=0;
if(!sta.empty())rec=sta.top();
}
for(int k=1;k<=20;k++){
for(int i=1;i<=n;i++){
tr[i].f[k]=tr[tr[i].f[k-1]].f[k-1];
}
}
for(int k=1;k<=20;k++){
for(int i=1;i<=n;i++){
tr[i].siz[k]=tr[i].siz[k-1]+tr[tr[i].f[k-1]].siz[k-1];
}
}
for(int i=1;i<=q;i++){
int r,v;
scanf("%lld%lld",&r,&v);
printf("%lld\n",sol(r,v));
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...