码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces193B

时间:2019-08-10 00:12:58      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:ret   ==   data-   偶数   fun   inf   cal   efi   size   

CF193B Xor

技术图片

sol:发现好像非常不可做的样子,发现n,u都很小,大胆dfs,因为异或偶数次毫无卵用,只要判每次是否做2操作就是了,复杂度O(可过)

技术图片
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
    ll s=0; bool f=0; char ch= ;
    while(!isdigit(ch))    {f|=(ch==-); ch=getchar();}
    while(isdigit(ch)) {s=(s<<3)+(s<<1)+(ch^48); ch=getchar();}
    return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
    if(x<0) {putchar(-); x=-x;}
    if(x<10) {putchar(x+0); return;}
    write(x/10); putchar((x%10)+0);
}
#define W(x) write(x),putchar(‘ ‘)
#define Wl(x) write(x),putchar(‘\n‘)
const int N=35;
const ll inf=0x7fffffffffll;
int n,m,r;
ll ans,a[N],b[N],k[N],p[N];
inline ll calc(ll num[])
{
    int i;
    ll res=0;
    for(i=1;i<=n;i++) res+=1LL*num[i]*k[i];
    return res;
}
inline void dfs(ll num[],int step)
{
    if(step==0)
    {
        ans=max(ans,calc(num)); return;
    }
    int i;
    ll c[N],d[N];
    for(i=1;i<=n;i++) c[i]=num[i]^b[i];
    if(step&1) ans=max(ans,calc(c)); else ans=max(ans,calc(num));
    for(i=1;i<=n;i++) d[i]=num[p[i]]+r;
    dfs(d,step-1);
    if(step<2) return;
    for(i=1;i<=n;i++) d[i]=c[p[i]]+r;
    dfs(d,step-2);
}
int main()
{
    int i;
    R(n); R(m); R(r); ans=-inf;
    for(i=1;i<=n;i++) R(a[i]);
    for(i=1;i<=n;i++) R(b[i]);
    for(i=1;i<=n;i++) R(k[i]);
    for(i=1;i<=n;i++) R(p[i]);
    dfs(a,m);
    Wl(ans);
    return 0;
}
View Code

 

 

 

 

codeforces193B

标签:ret   ==   data-   偶数   fun   inf   cal   efi   size   

原文地址:https://www.cnblogs.com/gaojunonly1/p/11329845.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!