hdu5735Born Slippy(乱搞)

来源:互联网 发布:京东商城数据库设计 编辑:程序博客网 时间:2024/06/03 12:47

题目链接:点这里!!!


题解:

官方题解讲的很详细了,我就不做过多赘述啦!

官方题解:点这里!!!!


代码:

#include<cstdio>#include<cstring>#include<iostream>#include<sstream>#include<algorithm>#include<vector>#include<bitset>#include<set>#include<queue>#include<stack>#include<map>#include<cstdlib>#include<cmath>#define LL long long#define pb push_back#define pa pair<int,int>#define clr(a,b) memset(a,b,sizeof(a))#define lson lr<<1,l,mid#define rson lr<<1|1,mid+1,r#define bug(x) printf("%d++++++++++++++++++++%d\n",x,x)#define key_value ch[ch[root][1]][0]#pragma comment(linker, "/STACK:102400000000,102400000000")const LL  MOD = 1000000007;const int N = 70000+15;const int maxn = 1e5+15;const int letter = 130;const int INF = 1e9;const double pi=acos(-1.0);const double eps=1e-10;using namespace std;inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}int n,pp,head[N],tot,vis[N];LL sum,w[N],f[260][260],g[N][260];struct node{    int to,next;}e[N];void addedges(int u,int v){    e[tot].to=v,e[tot].next=head[u],head[u]=tot++;}LL op(LL a,LL b){    if(pp==0) return a&b;    if(pp==1) return a^b;    if(pp==2) return a|b;}void init(){    sum=tot=0;    for(int i=1;i<=n;i++) head[i]=-1;    clr(f,0);}void dfs(int x){    LL a=w[x]>>8ll,b=w[x]&255ll;    LL mx=0;    for(int i=0;i<256;i++) if(vis[i])mx=max(mx,f[i][b]+(op(a,i)<<8ll));    sum=(sum+1ll*x*(w[x]+mx)%MOD+MOD)%MOD;    for(int i=0;i<256;i++) g[x][i]=f[a][i],f[a][i]=max(f[a][i],mx+op(b,i));    vis[a]++;    for(int i=head[x];i!=-1;i=e[i].next) dfs(e[i].to);    vis[a]--;    for(int i=0;i<256;i++) f[a][i]=g[x][i];}int main(){    int T;    char s[10];    scanf("%d",&T);    while(T--){        scanf("%d%s",&n,s);        if(s[0]=='A') pp=0;        if(s[0]=='X') pp=1;        if(s[0]=='O') pp=2;        init();        for(int i=1;i<=n;i++) scanf("%I64d",w+i);        int x;        for(int i=2;i<=n;i++){            scanf("%d",&x);            addedges(x,i);        }        dfs(1);        printf("%I64d\n",(sum%MOD+MOD)%MOD);    }    return 0;}


0 0
原创粉丝点击