花六游鸟小

背景

  “西瓜是可以种在平行世界的!”——小鸟游六花

描述

  又到了收获时节,为了方便采摘,六花酱现在要给众西瓜命名,她已经为每个西瓜想好了一个名字,名字一共有m个属性,一个名字是否拥有这些属性可以用一个长度为m的01串xi来表示,表示这个名字是否吉利,是否好听等等。

  她可以在任意时刻把这个名字倒过来(就像题目名字),倒过来后,原来好听的就不好听了,原来不好听的就好听了。即把这个01串取反。

  每个属性都有一个价值vi,一个西瓜的价值为把它的名字拥有的所有属性的价值加起来。即第i个名字的价值为。其中xi,k表示第i个名字是否拥有第k个属性,0表示没有,1表示有。

当她手上拥有一堆西瓜时,这堆西瓜拥有第i个属性当且仅当存在一个西瓜拥有这一个属性,然后计算出的价值就是这堆西瓜的价值。即把所有西瓜的名字01串或起来之后当成一个西瓜处理。

  现在六花开始采摘西瓜。瓜地构成一棵n个节点的树,一个点上有一个西瓜。她从根(1号节点)开始走,每次只能往儿子方向走。走到一个点时,她可以把这个西瓜采摘起来,每摘到一个西瓜,她可以把手头所有西瓜名字任意修改(修改即把名字倒过来)。

每个点会有一个价值,这个价值是她从根走到这个点,手上这堆西瓜价值的最大值(允许对西瓜们改名后的最大值)。一圈西瓜摘完,每个点的价值都已经确定。

  摘完西瓜闲来无事,六花开始在西瓜地里漫步,她可以从任意点出发,在任意点结束(没有只能往儿子方向走的限制)。她不希望自己走过的相邻两个点的价值相同,同时不希望走过重复的点。她想知道,对于每个d,自己能走出的长度为d路径一共有多少条。这里的路径长度定义为路径上点的数量。

输入格式

  第一行两个整数n,m。表示西瓜的个数(树的节点数量),属性的数量。

  接下来n行,每行一个长度为m的01串,第i行的01串描述一个第i个西瓜的名字。

  第n+2行包含m个正整数,第i个数vi表示第i个属性的价值。

  再有n-1行,每行一个1到n中的整数,第i行的整数fai表示树中i+1号节点的父节点。

输出格式

  如果能走出最大的路径长度为D,则输出D个整数,第i个数表示长度为i的路径数量。

样例输入

5 20

10110000001010011111

10010001110111101111

11111111111111111111

10000110011111110111

10110000001010011111

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

1

1

2

3

样例输出

5 3 2 1

数据范围与约定

  对于初: 1<= n<= 10,1<= m<= 20,1<= vi<= 109

  对于续: 1<= n<= 105,1<= m<= 200,1<= vi<= 109,保证不存在节点的价值达到理论最大值,且树的深度不超过10。

  对于终: 1<= n<= 105,1<= m<= 200,1<= vi<= 109

样例解释

  1号点价值为10

  2号点价值为17(1号西瓜名字倒过来,2号不变)

  3号点价值为20

  4号点价值为19(三个西瓜均不变即可)

  5号点价值为20

  长度为1的路径为5点单独一条路径

  长度为2的路径为:4->2,2->1,1->3

  长度为3的路径为:4->2->1,2->1->3

长度为4的路径为:4->2->1->3

备注

本题输入数据较多,请使用stdio.h读入。实测0.7s时限下,stdio.h+scanf需要的最大用时约0.4s。

—————————————————————————————————————————————

这道题 首先深度大于logm的点肯定能达到最大值。因为每次我们可以把至少一半的为0的属性变成1。

这个证明一下把

————————————————————————————————————————————————

因为我们考虑当前拥有的西瓜为x 要摘的西瓜为y

我们按二进制位考虑 因为x反转和y反转没有区别

考虑反转y 那么x是1的位不用考虑 剩下的0位 如果和y或起来不足一半 就反转y这样就大于一半了

————————————————————————————————————————————————

然后未到达最大值的点相邻两个肯定价值不同,也就是说路径相邻两个值不同的限制其实是把达到最大值的子树(不包括他本身)砍掉。

所以题目给的价值是没有用的 父亲和儿子只要不是全为0就不可能相同

这样我们只要考虑到每个点是否全为0就好了

我们发现 根到当前点 几个串可以组成一个矩阵

矩阵的行表示组成每个点的串 那么只要每一列都能有个1就能全0了

可是怎么判断一个矩阵能否达到上述状态呢

我们可以从亦或的角度考虑 反转一个序列就是整行异或1

那么问题就变成了找一个和列一样长的01串 使他和每一列异或后实现每一列都有1

那么由异或的性质得 A&A=0

所以如果所有列的排列(即不同的列数)达到2^k(k是到当前点收集到的点数) 那么所有的排列都在矩阵中了

所以不论你选什么 必然有一列为0 反之你随机选一个不在矩阵中存在的排列就可以了 QAQ

最后问题就转换成了求树上长度为d的路径的数量 然后我们考虑每一个点 算经过他的路径

就是一波树形dp了 233333

#include<stdio.h>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=1e5+7;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
int n,m,k;
char s[255];
int cnt,first[M],f[M][257];
int usd[2507],h[M];
LL ans[55],dis[M][55];
struct node{int to,next;}e[M];
void ins(int a,int b){e[++cnt]=(node){b,first[a]}; first[a]=cnt;}
void dfs(int x,int d){
    //printf("(%dL)",x);
    cnt=1<<d+1;
    for(int i=0;i<m;i++){
        if(f[x][i]) h[i]|=(1<<d);
        if(usd[h[i]]!=x) cnt--,usd[h[i]]=x;
    }
    if(cnt) first[x]=0;
    for(int i=first[x];i;i=e[i].next) dfs(e[i].to,d+1);
    for(int i=0;i<m;i++) h[i]&=~(1<<d);
    //printf("(%dR)",x);
}
void dp(int x,int d){
    ++dis[x][d];
    for(int i=first[x];i;i=e[i].next){
        int now=e[i].to;
        dp(now,d+1);
        for(int p=d;p<10;p++)
         for(int q=d;q<10;q++) ans[p+q-2*d]+=1LL*dis[x][p]*dis[now][q];
        for(int p=0;p<10;p++) dis[x][p]+=dis[now][p];
    }
}
int main(){
    n=read(); m=read();
    for(int i=1;i<=n;i++){
        scanf("%s",s);
        for(int j=0;j<m;j++) f[i][j]=s[j]==‘1‘;
    }
    for(int i=1;i<=m;i++) read();
    for(int i=2;i<=n;i++) k=read(),ins(k,i);
    dfs(1,0);
    dp(1,0);
    k=25;
    ans[0]=n;
    while(!ans[k]) k--;
    for(int i=0;i<=k;i++) printf("%lld ",ans[i]);
    return 0;
}

时间: 2024-10-13 17:42:14

花六游鸟小的相关文章

【STSRM13】花六游鸟小

[题意]给定n个节点的树,每个节点有一个m位二进制数,数字可以随时按位取反,每个数位有一个价值,定义每个点的最大价值是从根到这个点路上的数字(可以取反)或起来的数字中,1有价值0无价值,加起来得到的最大价值. 得到所有点的最大价值后,相邻点若同价值则断边,最后求长度为d的路径数量(边长1),d取遍0到max,依次输出. n<=10^5,m<=200. [算法]数学+搜索 [题解]结论题. 首先最显然的,深度>log m的点一定能达到最大值,因为每次每个串至少能使未取到的数位取一半(不够一

【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】

游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePacker工具来加密的,不过针对性还是不够强. 分析一下原理为: 1,转格式:将需要加密的文件转为流的方式: 2,加密:根据自己需要使用加密手段,MD5,AES,甚至可以直接改变位移,加一些自己的特殊字符也可以使文件简单加密,加密完后基本保证 图片类型基本用特殊软件预览不了也打不开,Lua文件加密后一片乱

手游外设,小旗捡了小米的漏吗?

15日,亿万米粉怀着激动的心情迎来了他们的节日,官方营销火力全开,小米note好,海报做地更好,还发布了小米小盒子,两日之后,包含多功能网关.人体感应器.门窗传感器.无线开关.门铃,支持WiFi.Zigbee协议的小米智能家庭套装亮相. 如今小米已把能做的.不能做到都做了,产品线覆盖智能手机.智能家居等多个领域,电视.机顶盒.路由器.手环.净化器.血压仪等等等等,就连插座和灯泡也不放过,可为何小米却漏掉了更具消费市场潜力的手游外设产品呢? 小米不做,就会有别人来抢着做,打着"如何让小米手机游戏体

【cocos2d-x 手游研发小技巧(17)封装动画插件,序列帧 plist+png】

今天是2014年的最后一天  明天就是2015年了 今天给大家一点干活 我就直接上代码了 #ifndef __ENTITY_ACTION_H__ #define __ENTITY_ACTION_H__ #include "cocos2d.h" #include "cocos-ext.h" #include "game/entity/UISprite.h" class EntityAction : public CCNode { public: E

SRM13

由于种种原因,好像出了点锅--? 好在问题不是很大. 得分比我估的要低啊. 木之本樱 计算几何送分题 就是叫你求一共有多少组四线共点,O(n^4)暴力可以过初.枚举两条线,求出交点之后求有多少条直线过这个点.这样是O(n^3)的,可以过续.先把n^2 个交点求出来,排个序,统计多少个点重复.O(n^2logn)可以过终. 实际:由于出题人自己代码常数较大,导致卡暴力失败,n^4过了续,n^3过了终. 绵津见 数据结构送分题 按照题意模拟,可以过初.以时间和x 坐标作为平面的两维,如果把每个西瓜当

2018最新小程序应用商店大全

微应用大全 (www.wyydq.com)微应用大全是国内最大最全的微信小程序应用.游戏免费收录网站之一,拥有海量小程序详情资源!向用户推荐实- 有设小程序商店 有设-微信小程序商店,第一时间收录优秀的微信小程序应用,这里有小程序的最新资讯.入门指南.开发教程和- 小程序商店 程序商店,微信小程序推荐平台.比目后端云,轻轻松松开发小程序 第九程序 第九程序(xcx.9.cn)拥有当前热门微信小程序和微信小程序资源.小程序资讯等,致力于为用户提供优- 微信主页-小程序商店 微信主页收录最新最全微信

[转]填词

奠基 诗词读多了,难免自己也想拿笔试试.人,尤其可不做而做的事都有所为.想试试的所为可以有多种.一种是附庸风雅,用大白话说是,让人看看,"我也能作旧诗.填词,可见是造诣高,多才多艺."另一种由野狐禅走入正经,是确有"故国(读仄声)平居有所思"之类或"为伊消得(读仄声)人憔悴"之类的情怀,读别人的,借他人酒杯浇自己块垒,不直接,或吃不饱,于是只好自己拿笔.还有一种,胃口更大,有情怀,抒发了,还不满足,立志要写得多,写得好,以期追踪李.杜,步武秦.周

前端交互开发微体验--总结了一些国内外炫酷的网站

前端交互开发微体验 关于首屏灵动小效果,微交互提升页面生机: 一.关于首屏视频播放 http://designmodo.com/startup/ 感官体验:科技感,高大上,酷 综合评价:如页面请求不多且视频占空小的情况下使用.一般为首屏轮播图的情况下使用,前两张轮播为图片,最后为视频,多给视频一些加载时间.还有就是非首屏使用. 推荐指数:★★★☆☆     二.Hover时实现图片随着鼠标方向而变动 http://atieva.com/ https://labs.invisionapp.com/

择校记1(转)

[一种声音]择校记 择校记 九月最后一天,女儿下午一点钟放学.几乎还在凌晨,我和孩子妈妈就激动起来了,分工合作,让我早早.千万别晚到去接女儿. 一晃之间,她在平和学校住宿四个星期了. 从来没有单独出门机会的她,在学校里乐不思蜀,竟然一点不适应都没有.八月最后一天,是她第一天入校,第一次住宿,妈妈各种收拾,无数叮咛(好几斤重的车 轱辘话),各种不放心.可是,全校父母和学生听校长演说结束之后,中午家长和孩子分开,她就不见了.我们在宿舍和教室到处找,妈妈很着急.我说,学校管理 这么严,她又不会跑出学校