《 Codeforces Round #122 (Div. 1) B》

首先可以状压所有方案,但是这样复杂度O(2 ^ u * n)。

考虑到连续的xor操作其实可以整合到一起,那么可以再次优化。

然后我们考虑dfs,理论上来说dfs每层都有两种操作应该是2 ^ u * n。

但是因为连续的异或操作是没有意义的,所有我们就可以明白了除非是进行1的xor操作,否则进行和不进行都是一样的。

那么就有了如果上一层进行过异或操作之后,那么这一层就不能再异或了。

这样一来30层里最多也只有15层的xor | +r。这样复杂度估计也就2 ^ 20之内。那么就够了。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
const int N = 1e6 + 5;
const int M = 1e7 + 5;
const LL Mod = 998244353;
#define rep(at,am,as) for(int at = am;at <= as;++at)
#define INF 1e18
#define dbg(ax) cout << "now this num is " << ax << endl;
inline long long ADD(long long x,long long y) {
    if(x + y < 0) return ((x + y) % Mod + Mod) % Mod;
    return (x + y) % Mod;
}
inline long long MUL(long long x,long long y) {
    if(x * y < 0) return ((x * y) % Mod + Mod) % Mod;
    return x * y % Mod;
}
inline long long DEC(long long x,long long y) {
    if(x - y < 0) return (x - y + Mod) % Mod;
    return (x - y) % Mod;
}

int n,u,r,a[35],b[35],k[35],p[35],ans[35][35];
LL mx = -INF;
void dfs(int x,int tag) {
    if(x % 2 == u % 2) {
        LL tmp = 0;
        rep(i,1,n) tmp += 1LL * ans[x][i] * k[i];
        mx = max(mx,tmp);
    }
    if(x == u) return ;
    rep(i,1,n) ans[x + 1][i] = ans[x][p[i]] + r;
    dfs(x + 1,1);
    if(tag == 1) {
        rep(i,1,n) ans[x + 1][i] = ans[x][i] ^ b[i];
        dfs(x + 1,0);
    }
}
void solve() {
    cin >> n >> u >> r;
    rep(i,1,n) cin >> a[i];
    rep(i,1,n) cin >> b[i];
    rep(i,1,n) cin >> k[i];
    rep(i,1,n) cin >> p[i],ans[0][i] = a[i];
    dfs(0,1);   
    printf("%lld\n",mx);
}
int main() {
    // int _;
    // for(scanf("%d",&_);_;_--) {
        solve();
    //}
   // system("pause");
    return 0;
}
View Code

 

posted @ 2022-02-18 09:26  levill  阅读(21)  评论(0编辑  收藏  举报