社区讨论

求条

P14989传送参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mkrocqgf
此快照首次捕获于
2026/01/24 10:12
4 周前
此快照最后确认于
2026/01/24 17:52
4 周前
查看原帖
CPP
//  Gavinzhou's code
#include<bits/stdc++.h>
using namespace std;
//#define LOCAL
#define in freopen("xx.in","r",stdin)
#define out freopen("xx.out","w",stdout)
//#define int long long
#define endl '\n'
#define FastIO std::ios::sync_with_stdio(false);cin.tie(0);
#define fi first
#define se second
#define dis(x1,y1,x2,y2) (sqrt(abs(x1-x2)*abs(x1-x2)+abs(y1-y2)*abs(y1-y2)))
#define pb push_back
using PII=pair<int,int>;
/*--------------------定义变量,函数---------------------------*/
const int N=5e5+5;
int n,q;
int a[N];
vector<int>g[N];
int le[N],ri[N];
int dep[N],f[N][32];
/*-----------------------解决函数--------------------------*/
void dfs(int u,int pre){
	f[u][0]=pre;
	dep[u]=dep[pre]+1;
	for(int i=1;i<=30;i++){
		f[u][i]=f[f[u][i-1]][i-1];
	}
	for(int i:g[u]){
		if(i!=pre) dfs(i,u);
	}
}
inline int lca(int a,int b){
	if(dep[a]>dep[b]) swap(a,b);
	for(int i=30;i>=0;i--){
		if(dep[f[b][i]]>=dep[a]) b=f[b][i];
	}
	if(a==b) {
        return a;
    }
	for(int i=30;i>=0;i--){
		if(f[a][i]!=f[b][i]) a=f[a][i],b=f[b][i];
	}
	return f[a][0];
}
void solve(){
    cin>>n>>q;
    int ma=0,start=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(ma<a[i]){
            ma=a[i];
            start=i;
        }
    }
    stack<int>st1,st2;
    for(int i=1;i<=n;i++){
        while(!st1.empty()&&a[st1.top()]<=a[i]){
            st1.pop();
        }
        if(!st1.empty()){
            le[i]=st1.top();
        }else{
            le[i]=i;
        }
        st1.push(i);
    }
    for(int i=n;i>=1;i--){
        while(!st2.empty()&&a[st2.top()]<=a[i]){
            st2.pop();
        }
        if(!st2.empty()){
            ri[i]=st2.top();
        }else{
            ri[i]=i;
        }
        st2.push(i);
    }
    for(int i=1;i<=n;i++){
         if(le[i]>ri[i]){
            g[le[i]].pb(i);
             g[i].pb(le[i]);
         }else{
            g[i].pb(ri[i]);
            g[ri[i]].pb(i);
         }
    }
     dfs(start,0);
    while(q--){
        int k;
        cin>>k;
        int LCA=-1;
        while(k--){
            int x;
            cin>>x;
            if(LCA==-1) LCA=x;
            else LCA=lca(LCA,x);
        }
        cout<<dep[LCA]<<endl;
    }
}
/*------------------------------------------------------*/
signed main(){
  FastIO
#ifdef LOCAL
    in;
    out;
#endif
  int t;
  t=1;
  while(t--){
    solve();
  }
  return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...