ccpc2020长春站F题 Strange Memory
题目链接
题目大意
给定一棵包含 \(n\) 个节点的树,每个节点有个权值 \(a_i\)
求\(∑_{i=1}^n∑_{j=i+1}^n[a_i⊕a_j=a_{lca(i,j)}](i⊕j).\)
解题思路
题目保证了 \(a_i ≠ 0\) ,所以不存在 \(a_u⊕a_v = a_u\),即满足条件的\(a_u ⊕ a_v = a_{lca(u,v)}\) 的 \(u , v\) 一定在不同分支
这点极大的简单化了本问题
于是在以 \(rt\) 为根的子树中,对于节点 \(u\) ,满足条件的点的异或值为 \(a_u ⊕ a_{rt}\)
而 \(u\) 对答案产生的贡献只和 \(u\) 在二进制下每一位的数值有关系
于是我们可以定义 \(f_{ijk}\) 表示异或值为 \(i\) 的数 , 它们在二进制下第 \(j\) 位为 \(k\) 的个数
那么对于 \(u\) , 它的贡献可以这么算
int x = a[u] ^ a[rt];
if(x <= 1000000) // a[i] <= 1e6
{
for(int i = 17 ; i >= 0 ; i --)
{
int k = u >> i & 1;
ans += (1LL << i) * f[x][i][k ^ 1];
}
}
到这本题就差不多结束了
别忘了一个分支内的任意节点不能相互影响,所以需要先对一个分支统计完贡献后,再添加它的信息
AC_Code
#include<bits/stdc++.h>
#define rep(i , a , b) for(int i = a ; i <= b ; i ++)
#define per(i , b , a) for(int i = b ; i >= a ; i --)
#define ll long long
#define pb push_back
#define fi first
#define se second
using namespace std;
const int N = 1e5 + 10 , M = 1e6 + 10;
struct Edge{
int nex , to;
}edge[N << 2];
int head[N] , TOT;
void add_edge(int u , int v)
{
edge[++ TOT].nex = head[u];
edge[TOT].to = v;
head[u] = TOT;
}
int dep[N] , sz[N] , hson[N] , HH;
int a[N] , f[M][20][2];
ll ans;
void dfs(int u , int far)
{
sz[u] = 1;
dep[u] = dep[far] + 1;
for(int i = head[u] ; i ; i = edge[i].nex)
{
int v = edge[i].to;
if(v == far) continue ;
dfs(v , u);
sz[u] += sz[v];
if(sz[v] > sz[hson[u]]) hson[u] = v;
}
}
void change(int u , int far , int val)
{
for(int i = 17 ; i >= 0 ; i --) f[a[u]][i][u >> i & 1] += val;
for(int i = head[u] ; i ; i = edge[i].nex)
{
int v = edge[i].to;
if(v == far || v == HH) continue ;
change(v , u , val);
}
}
void calc(int u , int far , int rt)
{
int x = a[u] ^ a[rt];
if(x <= 1000000)
{
for(int i = 17 ; i >= 0 ; i --)
{
int k = u >> i & 1;
ans += (1LL << i) * f[x][i][k ^ 1];
}
}
for(int i = head[u] ; i ; i = edge[i].nex)
{
int v = edge[i].to;
if(v == far || v == HH) continue ;
calc(v , u , rt);
}
}
void dsu(int u , int far , int op)
{
for(int i = head[u] ; i ; i = edge[i].nex)
{
int v = edge[i].to;
if(v == far || v == hson[u]) continue ;
dsu(v , u , 0);
}
if(hson[u]) dsu(hson[u] , u , 1) , HH = hson[u];
for(int i = head[u] ; i ; i = edge[i].nex)
{
int v = edge[i].to ;
if(v == far || v == HH) continue ;
calc(v , u , u) , change(v , u , 1);
}
HH = 0;
for(int i = 17 ; i >= 0 ; i --) f[a[u]][i][(u >> i) & 1] ++ ;
if(!op) change(u , far , -1);
}
signed main()
{
ios::sync_with_stdio(false);
int n ;
cin >> n;
rep(i , 1 , n) cin >> a[i];
rep(i , 2 , n)
{
int u , v;
cin >> u >> v;
add_edge(u , v) , add_edge(v , u);
}
dfs(1 , 0);
dsu(1 , 0 , 0);
cout << ans << '\n';
return 0;
}
ccpc2020长春站F题 Strange Memory的更多相关文章
- 2013年山东省赛F题 Mountain Subsequences
2013年山东省赛F题 Mountain Subsequences先说n^2做法,从第1个,(假设当前是第i个)到第i-1个位置上哪些比第i位的小,那也就意味着a[i]可以接在它后面,f1[i]表示从 ...
- 2017Summmer_上海金马五校 F题,G题,I题,K题,J题
以下题目均自己搜 F题 A序列 一开始真的没懂题目什么意思,还以为是要连续的子串,结果发现时序列,简直智障,知道题意之后,好久没搞LIS,有点忘了,复习一波以后,直接双向LIS,处理处两个数组L和R ...
- ACM-ICPC 2019南昌网络赛F题 Megumi With String
ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...
- 2019牛客多校第八场 F题 Flowers 计算几何+线段树
2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...
- AtCoder Beginner Contest 215 F题题解
F - Dist Max 2 什么时候我才能突破\(F\)题的大关... 算了,不说了,看题. 简化题意:给定\(n\)个点的坐标,定义没两个点的距离为\(min(|x_i-x_j|,|y_i-y_j ...
- 2020CCPC长春F. Strange Memory
题目大意 一棵以 \(1\) 为根的 \(n(2\leq n\leq 10^5)\) 的树,每个节点 \(i\) 有权值 \(a_{i}(1\leq a_{i}\leq 10^6)\) ,求 \(\s ...
- NEFU 2016省赛演练一 F题 (高精度加法)
Function1 Problem:F Time Limit:1000ms Memory Limit:65535K Description You know that huicpc0838 has b ...
- 周赛F题 POJ 1458(最长公共子序列)
F - F Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Description ...
- 2015 UESTC 搜索专题F题 Eight Puzzle 爆搜
Eight Puzzle Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/61 ...
随机推荐
- linux修改环境变量后无法登录
在登陆界面按Ctrl+Alt+F1(F1~F6), 进入 tty 后登陆账号. 执行以下命令: /usr/bin/sudo /usr/bin/vi /etc/environment 将PATH的值复原 ...
- 性能测试之JVM的故障排查-堆内存泄漏
JVM异常说明(超链接) 一文中已介绍了,JVM每个运行时区域--程序计数器 .Java虚拟机栈.本地方法栈.Java堆.方法区.直接内存发生OutOfMemoryError的不同原因和不同错误信息. ...
- maven 配置文件 settings.xml pom.xml
maven涉及的配置文件一般有三个:(作用范围依次减小,优先级依次升高) 全局配置(maven安装包中):${M2_HOME}/conf/settings.xml 用户配置(该文件是拷贝全局配置而来的 ...
- 5. Bean Validation声明式验证四大级别:字段、属性、容器元素、类
1024,代码改变世界.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习.关注公众号[BAT的 ...
- 读高性能Mysql摘要
类型相关 INT(1)和INT(20)对于存储和计算来说,意义是相同的,他不会限制值的合法范围,只是一些交互工具会用来显示字符的个数 默认是有符号的,可以指定为无符号,增加数据存储范围,如0-255, ...
- robotframework执行自动化不能转换为h5页面的问题解决
电脑换成win10后,搭建了robotframework环境,执行自动化发现页面不支持h5页面了.请教了大佬,解决办法如下: 1.切换到DOS环境下,执行pip list命令,查看selenium2l ...
- Python+Post请求中涉及到多个参数data方法的应用
进行post请求,Python提供了httplib.urllib2,同时也可以引用requests模块的一些方法.前几天做持续集成,运用requests写了一个post请求.代码如下: import ...
- python开发基础(一)-if条件判断,while循环,break,continue,
条件语句 (1)if 基本语句 if 条件 : 内部代码块 else: .... print() (2)if 嵌套 (3)if elif 语句 (4)if 1==1: pass # if不执行,pas ...
- ubuntu设置mentohust开机自动登录校园网
设置环境: ubuntu14.04 64位 无法忍受校园网ubuntu锐捷客户端登录每次开机都要输一大串命令 step1 首先下载mentohust,链接http://code.google.com ...
- [阿里DIN] 从模型源码梳理TensorFlow的乘法相关概念
[阿里DIN] 从模型源码梳理TensorFlow的乘法相关概念 目录 [阿里DIN] 从模型源码梳理TensorFlow的乘法相关概念 0x00 摘要 0x01 矩阵乘积 1.1 matmul pr ...