MLE,听灌多
  • 板块灌水区
  • 楼主Autumn_Rain
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/23 20:09
  • 上次更新2024/5/23 20:20:34
查看原帖
MLE,听灌多
826079
Autumn_Rain楼主2024/5/23 20:09

RT。怎么卡空间?

#include<iostream>
using namespace std;
const int N=1e6+10;
int n,k,a[N];
int t[N][2],tot=1;
int d[N],f[N],siz[N];
inline void insert(int v){
    int u=1;
    for(int i=19;i>=0;i--){
        int a=v>>i&1;
        if(t[u][a]==0){
        	t[u][a]=++tot;
		}
        u=t[u][a];
    }
    siz[u]++;
}
inline void dfs(int u){
	if(!t[u][0]){
		if(!t[u][1]){
			f[u]=siz[u];
			return;//叶子结点直接返回 
		}
	}
	int v=0;
	for(int i=0;i<=1;i++){
		if(!t[u][i])continue;
		v=t[u][i];
		d[v]=d[u]-1;
		dfs(v);
		siz[u]+=siz[v];
	}
	if(k>>d[u]&1){
	//k的d[u]为1,可以取反继续访问或者直接相同不再遍历 
		f[u]=max(f[t[u][0]]+siz[t[u][1]],f[t[u][1]]+siz[t[u][0]]);
	}
	else{//否则只能取相同,左右两边取较大值 
		f[u]=max(f[t[u][0]],f[t[u][1]]);
	}
}
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		insert(a[i]);
	}
	d[1]=19;
	dfs(1);
	cout<<f[1];
	return 0;
} 
2024/5/23 20:09
加载中...