CF165E看不懂
  • 板块灌水区
  • 楼主BD_AZZR_CN
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/6 08:55
  • 上次更新2024/8/6 10:16:14
查看原帖
CF165E看不懂
767779
BD_AZZR_CN楼主2024/8/6 08:55
#include<bits/stdc++.h>
using namespace std;
#define N 22
int n, a[1000005], f[1<<N];
int main() {
    // freopen("in","r",stdin);
	cin>>n;
    // memset(f, -1 , sizeof(f));
	for(int i=1;i<=n;i++) {
        scanf("%d", &a[i]);
        f[a[i]]=a[i];
	}
    for(int i = 0; i < N; i++){//前i位
        for(int j = 0; j < (1<<N); j++){
            if(j&(1<<i)&&f[j^(1<<i)]){
                f[j]=f[j^(1<<i)];
            }
        }
    }
    for(int i = 1; i <= n; i++){
        int b = ((1<<N)-1)^a[i];
        cout <<  (f[b]?f[b]:-1) << endl;
	}
}

拿这个改的

为什么一定是22呢

说实话,感觉像是试出来的最优解,因为我不太习惯滚动数组,感觉用不好就爆0了

这是我原来写的

#include<bits/stdc++.h>
using namespace std;
#define N 22
int n, a[1000005], f[N][1<<N];
int main() {
    freopen("in","r",stdin);
	cin>>n;
    memset(f, -1 , sizeof(f));
	for(int i=1;i<=n;i++) {
        scanf("%d", &a[i]);
        f[0][a[i]]=a[i];
	}
    for(int i = 1; i < N; i++){//前i位
        for(int j = 0; j < (1<<N); j++){
            f[i][j] = f[i-1][j];//上一维
            if(j&(1<<i)){
                f[i][j]=max(f[i][j] , f[i][j^(1<<(i))]);
            }
        }
    }
    for(int i = 1; i <= n; i++){
        int b = ((1<<N)-1)^a[i];
        cout << f[N-1][b] << endl;
    }
}//这代码不看也罢,我也看不懂

顺便问一下有没有高维前缀和的pdf或者别的格式的资料

2024/8/6 08:55
加载中...