社区讨论
神秘 RE 求助
P14829[THUPC 2026 初赛] Asian Soul参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mjpguu5h
- 此快照首次捕获于
- 2025/12/28 16:27 2 个月前
- 此快照最后确认于
- 2025/12/28 17:28 2 个月前
rt.
CPP#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define FOR(i,a,b) for(int i=(a),E##i=(b);i<=E##i;i++)
#define REV(i,a,b) for(int i=(a),E##i=(b);i>=E##i;i--)
#define CLOSE_TIE ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define psbk push_back
#define endl '\n'
#define int unsigned int
template <typename T>
void _outval(string s,int p,const T &t) {cout<<s.substr(p,s.length()-p)<<'='<<t<<endl; }
template <typename T, typename... Args>
void _outval(string s,int p,const T &t,const Args &...rest){
string n="";
while(s[p]!=',') n+=s[p++];
cout<<n<<'='<<t<<", ";
_outval(s,p+1,rest...);
}
#define outval(...) _outval(#__VA_ARGS__,0,__VA_ARGS__)
#define outarr(a,be,ed)\
{cout<<(#a)<<": ";\
FOR(iiii,be,ed)cout<<'['<<iiii<<"]="<<a[iiii]<<", "; cout<<endl;}
constexpr int N=5e5+5;
int n,m,k,a[N],u[N],ans[N];
int dfn[N],id[N],fa[N],dep[N];
int buf[N*20],*now=buf,*b[N<<2],stk[N<<1],bk1[N];
int nd[N<<1],len;
struct Qu{int l,r,u,id;}q[N];
vector<int> e[N],g[N],bk2[N];
void dfs1(int u){
dep[u]=dep[fa[u]]+1,id[dfn[u]=++dfn[0]]=u;
for(int v:e[u])
if(v!=fa[u]) fa[v]=u,dfs1(v);
}
//dfs 序求 lca
struct ST{
int st[20][N];
void init(){
FOR(i,1,n) st[0][i]=id[i];
FOR(i,1,__lg(n))
FOR(j,1,n-(1<<i)+1){
if(dep[st[i-1][j]]<dep[st[i-1][j+(1<<(i-1))]]) st[i][j]=st[i-1][j];
else st[i][j]=st[i-1][j+(1<<(i-1))];
}
}
inline int lca(int u,int v){
if(u==v) return u;
if(dfn[u]>dfn[v]) swap(u,v);
int l=dfn[u]+1,r=dfn[v],lgl=__lg(r-l+1);
return fa[dep[st[lgl][l]]<dep[st[lgl][r-(1<<lgl)+1]]?st[lgl][l]:st[lgl][r-(1<<lgl)+1]];
}
}st;
inline void addEdge(int u,int v){
dep[u]<dep[v]?g[u].psbk(v):g[v].psbk(u);
}
inline void dfs2(int u){
for(int v:g[u]) dfs2(v),bk1[u]+=bk1[v];
}
inline void dfs3(int u,int mx){
if(!bk2[u].empty()){
int nmx=max(mx,u*(bool)(bk1[u]));
for(int i:bk2[u]) ans[i]=max(ans[i],nmx);
bk2[u].clear();
}
for(int v:g[u]) dfs3(v,(bk1[u]-bk1[v]?max(mx,u):mx));
bk1[u]=0;
}
struct SGT{
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
#define mid ((l+r)>>1)
vector<int> t[N<<2];
inline void update(int p,int l,int r,int x,int y,int id){
if(x<=l&&r<=y) return t[p].psbk(id),void();
if(x<=mid) update(ls(p),l,mid,x,y,id);
if(y>mid) update(rs(p),mid+1,r,x,y,id);
}
inline void solve(int p,int l,int r){
b[p]=now,now+=r-l+2;
if(l==r){
b[p][1]=a[l];
}else{
//归并
solve(ls(p),l,mid),solve(rs(p),mid+1,r);
int i,j,k;
for(i=1,j=1,k=1;i<=mid-l+1&&j<=r-mid;k++){
if(dfn[b[ls(p)][i]]<dfn[b[rs(p)][j]]) b[p][k]=b[ls(p)][i],++i;
else b[p][k]=b[rs(p)][j],++j;
}
while(i<=mid-l+1) b[p][k]=b[ls(p)][i],++k,++i;
while(j<=r-mid) b[p][k]=b[rs(p)][j],++k,++j;
}
//小数据暴力
if(r-l+1<=32){
FOR(i,l,r) for(int j:t[p]) ans[j]=max(ans[j],st.lca(u[j],a[i]));
return;
}
FOR(i,l,r) bk1[a[i]]=1;
for(int i:t[p]) bk2[u[i]].psbk(i);
//归并
len=0; int i,j;
for(i=1,j=0;i<=r-l+1&&j<t[p].size();){
if(dfn[b[p][i]]<dfn[u[t[p][j]]]) nd[++len]=b[p][i],++i;
else nd[++len]=u[t[p][j]],++j;
}
while(i<=r-l+1) nd[++len]=b[p][i],++i;
while(j<t[p].size()) nd[++len]=u[t[p][j]],++j;
//单调栈建虚树
int top=1; stk[top]=1; g[1].clear();
FOR(i,1,len){
if(nd[i]==1||(i&&nd[i]==nd[i-1])) continue;
int l=st.lca(nd[i],stk[top]);
if(l!=stk[top]){
while(dfn[l]<dfn[stk[top-1]]) addEdge(stk[top-1],stk[top]),--top;
if(dfn[l]>dfn[stk[top-1]]) g[l].clear(),addEdge(stk[top],l),stk[top]=l;
else addEdge(l,stk[top]),--top;
}
g[nd[i]].clear(),stk[++top]=nd[i];
}
FOR(i,1,top-1) addEdge(stk[i],stk[i+1]);
dfs2(1); dfs3(1,0);
}
}t;
inline int read(){
char c=getchar();
int f=1,res=0;
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
res=res*10+c-'0';
c=getchar();
}
res*=f;
return res;
}
signed main(){
CLOSE_TIE
n=read(),m=read(),k=read();
FOR(i,2,n){
int u=read(),v=read();
e[u].psbk(v),e[v].psbk(u);
}
FOR(i,1,m) a[i]=read();
FOR(i,1,k){q[i].l=read(),q[i].r=read(),q[i].u=read(); u[q[i].id=i]=q[i].u;}
dfs1(1); st.init();
sort(q+1,q+k+1,[&](Qu a,Qu b){return dfn[a.u]<dfn[b.u];});
FOR(i,1,k) t.update(1,1,m,q[i].l,q[i].r,q[i].id);
t.solve(1,1,m);
FOR(i,1,k) cout<<ans[i]<<endl;
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...