[JZOJ5363]生命之树
来源:互联网 发布:iptv管理系统php 编辑:程序博客网 时间:2024/05/19 06:47
题目大意
给定一棵
定义
对每一节点输出其子树的总收益。
题目分析
看到异或运算直接拆位。
考虑维护一个子树的
然后我们直接用线段树合并的方法合并
时间复杂度
代码实现
#include <iostream>#include <cstring>#include <cstdio>#include <cctype>using namespace std;typedef long long LL;int read(){ int x=0,f=1; char ch=getchar(); while (!isdigit(ch)) f=ch=='-'?-1:f,ch=getchar(); while (isdigit(ch)) x=x*10+ch-'0',ch=getchar(); return x*f;}int buf[30];void write(LL x){ if (x<0) putchar('-'),x=-x; for (;x;x/=10) buf[++buf[0]]=x%10; if (!buf[0]) buf[++buf[0]]=0; for (;buf[0];putchar('0'+buf[buf[0]--]));}const int N=100005;const int E=N<<1;const int L=500015;const int LGN=17;const int S=L+N;const int C=26;int val[N],last[N];int tov[E],nxt_[E];char str[L];LL ans[N];int n,tot;int cnt[S][LGN][2];int nxt[S][C];int root[N];int tots;int newnode(int val){ ++tots; for (int i=0;i<LGN;++i,val>>=1) ++cnt[tots][i][val&1]; return tots;}void ins(int id,int val){ int rt=root[id]=newnode(0),len=strlen(str); for (int i=0;i<len;++i) nxt[rt][str[i]-'a']=newnode(val),rt=nxt[rt][str[i]-'a'];}int merge(int x,int y,LL &ret){ if (!x||!y) return x^y; for (int i=0;i<LGN;++i) { ret+=(1ll*cnt[x][i][0]*cnt[y][i][1]+1ll*cnt[x][i][1]*cnt[y][i][0])*(1<<i); cnt[x][i][0]+=cnt[y][i][0],cnt[x][i][1]+=cnt[y][i][1]; } for (int c=0;c<C;++c) nxt[x][c]=merge(nxt[x][c],nxt[y][c],ret); return x;}void insert(int x,int y){tov[++tot]=y,nxt_[tot]=last[x],last[x]=tot;}void dfs(int x,int fa=0){ ans[x]=0; for (int i=last[x],y;i;i=nxt_[i]) if ((y=tov[i])!=fa) dfs(y,x),ans[x]+=ans[y],root[x]=merge(root[x],root[y],ans[x]);}int main(){ freopen("tree.in","r",stdin),freopen("tree.out","w",stdout); n=read(); for (int i=1;i<=n;++i) val[i]=read(); for (int i=1;i<=n;++i) scanf("%s",str),ins(i,val[i]); for (int i=1,x,y;i<n;++i) x=read(),y=read(),insert(x,y),insert(y,x); dfs(1); for (int i=1;i<=n;++i) write(ans[i]),putchar('\n'); fclose(stdin),fclose(stdout); return 0;}
阅读全文
0 0
- [JZOJ5363]生命之树
- jzoj5363【NOIP2017提高A组模拟9.14】生命之树 trie+启发式合并
- 生命之树
- 生命之树
- 生命之树
- 生命之树—题解
- 2015蓝桥杯 生命之树
- 蓝桥 生命之树
- 蓝桥 生命之树
- 树形dp 生命之树
- 蓝桥 生命之树
- 每日分享之《生命树》
- 第六届-蓝桥杯省赛-生命之树
- 蓝桥杯 生命之树 动态规划DFS
- 蓝桥杯-2015省赛-生命之树
- 第五届省赛javaB组--生命之树
- 生命之树(树形dp)
- 2015 第六届 蓝桥杯省赛 生命之树
- com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 2 字节的 UTF-8 序列的字节 2 无效。
- POJ1233 Prim Kruskal
- 高性能服务器架构小结
- CodeForces Round#433
- 一道面试题
- [JZOJ5363]生命之树
- inline函数必须定义在头文件吗
- Codeblocks environment error编译器找不到问题解决方法
- POJ 3070 斐波那契数列(矩阵快速幂(版题))
- 【算法】图的最短路径(Floyd算法)
- org.hibernate.HibernateException: JDBC Driver class not found: com.mysql.jdb
- 心路里程碑
- 微信小程序UI------实现携程首页顶部的界面(弹性布局)
- Qt之模型/视图