A1486. 树(王康宁)
题目:http://www.tsinsen.com/A1486
题解:
其实看到和路径有关的就应该想到点分治。
我们找出重心之后遍历每一棵子树得到它的 { x=经过特殊点的个数,y=到rt的异或和}
然后我们按x排序,维护两个头尾指针不断把满足条件的加入trie,然后把左边的放进trie里查询。
但是还有一个问题,所取的两个点不能位于同一棵子树!!!
我yy了一个做法。我们在用三元组来记录{ x=经过特殊点的个数,y=到rt的异或和,ch=所属子树}
然后往trie里插的时候,每条边保留两个ch表示有哪个子树的点从trie往下经过了这里。必须保证这两个ch不同。
然后查询的时候就判断就行了。注意任何时刻往下走的时候都要判断可行性,否则直接返回-1.
代码:
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#define inf 1000000000
#define maxn 250000+5
#define maxm 8000000+5
#define eps 1e-10
#define ll long long
#define ull unsigned long long
#define pa pair<int,int>
#define for0(i,n) for(int i=0;i<=(n);i++)
#define for1(i,n) for(int i=1;i<=(n);i++)
#define for2(i,x,y) for(int i=(x);i<=(y);i++)
#define for3(i,x,y) for(int i=(x);i>=(y);i--)
#define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)
#define for5(n,m) for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)
#define mod 1000000007
#define lch k<<1,l,mid
#define rch k<<1|1,mid+1,r
#define sqr(x) (x)*(x)
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
return x*f;
}
int n,m,k,cnt,tot,head[maxn],v[maxn],w[maxn],t[maxm][][],s[maxn],f[maxn],sum,rt,ans=-;
bool del[maxn];
struct edge{int go,next;}e[*maxn];
struct rec{int x,y,ch;}a[maxn];
inline bool cmp(rec a,rec b){return a.x<b.x;}
inline void add(int x,int y)
{
e[++tot]=(edge){y,head[x]};head[x]=tot;
e[++tot]=(edge){x,head[y]};head[y]=tot;
}
inline void insert(int y,int ch)
{
int x=;
for3(i,,)
{
int j=y>>i&;
if(!t[x][j][])t[x][j][]=++tot,t[x][j][]=ch;
else if(t[x][j][]!=ch)t[x][j][]=ch;
x=t[x][j][];
}
}
inline int query(int y,int ch)
{
int x=,ret=;
for3(i,,)
{
int j=y>>i&^;
if(t[x][j][]&&((t[x][j][]&&t[x][j][]!=ch)||(t[x][j][]&&t[x][j][]!=ch)))ret^=<<i,x=t[x][j][];
else
{
j^=;
if(t[x][j][]&&((t[x][j][]&&t[x][j][]!=ch)||(t[x][j][]&&t[x][j][]!=ch)))x=t[x][j][];
else return -;
}
}
return ret;
}
inline void getdep(int x,int fa,int w1,int w2,int w3)
{
a[++cnt]=(rec){w1,w2,w3};
for4(i,x)if(!del[y]&&y!=fa)getdep(y,x,w1+v[y],w2^w[y],w3);
}
inline void getrt(int x,int fa)
{
s[x]=;f[x]=;
for4(i,x)if(!del[y]&&y!=fa)
{
getrt(y,x);
s[x]+=s[y];
f[x]=max(f[x],s[y]);
}
f[x]=max(f[x],sum-s[x]);
if(f[x]<f[rt])rt=x;
}
inline void work(int x)
{
del[x]=;cnt=;
for4(i,x)if(!del[y])getdep(y,x,v[x]+v[y],w[x]^w[y],y);
sort(a+,a+cnt+,cmp);
int tmp=k+v[x],j=cnt;
for1(i,cnt)
{
while(j>i&&a[i].x+a[j].x>=tmp)insert(a[j].y,a[j].ch),j--;
ans=max(ans,query(a[i].y^w[x],a[i].ch));
}
for1(i,cnt)if(a[i].x>=k)ans=max(ans,a[i].y);
for0(i,tot)t[i][][]=t[i][][]=t[i][][]=t[i][][]=t[i][][]=t[i][][]=;
tot=;
for4(i,x)if(!del[y])
{
sum=s[y];rt=;
getrt(y,x);
work(rt);
}
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
n=read();k=read();
for1(i,n)v[i]=read();
for1(i,n)w[i]=read();
for1(i,n-)add(read(),read());
tot=;
sum=n;
f[rt=]=inf;
getrt(,);
work(rt);
for1(i,n)if(v[i]>=k)ans=max(ans,w[i]);
cout<<ans<<endl;
return ;
}
A1486. 树(王康宁)的更多相关文章
- 【Tsinsen-A1486】树(王康宁) 点分治 + Trie
A1486. 树(王康宁) 时间限制:1.0s 内存限制:512.0MB 总提交次数:455 AC次数:97 平均分:52.62 查看未格式化的试题 提交 试题讨论 试题来源 ...
- Tsinsen A1486. 树(王康宁)
Description 一棵树,问至少有 \(k\) 个黑点的路径最大异或和. Sol 点分治. 用点分治找重心控制树高就不说了,主要是对答案的统计的地方. 将所有路径按点的个数排序. 可以发现当左端 ...
- 搭建Django链接MySQL流程(python2版)
之前生成选型python3,除了用的python3的pymysql模块之外其他的都是一样的. 1.首先搭建mysql(Mariadb)数据库(单点) 安装方式分为yum安装,rpm包安 ...
- 王学长的AAA树
让我们响应王学长的号召勇敢的分开写splay和lct吧! 分开写大法好!!!!!!!!!!!杜教的ch[4]弱爆了!!!! #include <stdio.h> #include < ...
- 「模拟8.18」字符串(卡特兰数)·乌鸦喝水(树状数组,二分)·所驼门王的宝藏(tarjan,拓扑)
最近好颓啊,所以啥都做不出来 简单说一下这次考试,分机房了,还分不同考卷,果然我还是留在二机房的蒟蒻, 大概也只有这样的简单题,才能勉强水个rank 3吧........ 其实不必管在哪个机房,努力便 ...
- 算法与数据结构(十一) 平衡二叉树(AVL树)
今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...
- HDU 4417 (划分树+区间小于k统计)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目大意:给定一个区间,以及一个k值,求该区间内小于等于k值的数的个数.注意区间是从0开始的 ...
- EF4.0、4.3创建表达式树状动态查询总结
---------------------------------------------快速适用 效果: where name like '%王%' and Age>=35 or Age< ...
- Atitti 图像处理 特征提取的科技树 attilax总结
Atitti 图像处理 特征提取的科技树 attilax总结 理论 数学,信号处理,图像,计算机视觉 图像处理 滤波 图像处理 颜色转换 图像处理 压缩编码 图像处理 增强 图像处理 去模糊 图像处理 ...
随机推荐
- 离开csdn来到blog园
csdn里没有限制阅读访问的功能,所以我选择来到cnblog 但是不得不说,cnblog做的界面很丑,我个人很不喜欢,但是没办法
- JDBC第四次学习
传智播客李勇老师的JDBC系列学习终于接近尾声了,好开心,能学到这么多的东西,还不赶快记录下来,留待以后回味! 如何使用开源项目DBCP(实际项目中常用) 主要分为三个步骤: 使用DBCP必须用 ...
- 如何使用JMeter来实现更大批量的并发的解决方案(即如何设置controller和Agent)
http://www.testwo.com/blog/6373 近期在用JMeter进行负载测试的 时候,发现使用单台机器模拟测试超过比如500个进程的并发就有些力不从心或者说不能如实的反应实际情况, ...
- 李洪强iOS开发之后使用纯代码实现横向滚动的UIScrollView
李洪强iOS开发之后使用纯代码实现横向滚动的UIScrollView (VTmagic是一个实现左右滚动的控制器的框架,也可以实现此功能) 实现的效果: 01 - 创建四个控制器 02 - 定义需要 ...
- 540C: Ice Cave
题目链接 题意: n*m的地图,'X'表示有裂痕的冰块,'.'表示完整的冰块,有裂痕的冰块再被踩一次就会碎掉,完整的冰块被踩一次会变成有裂痕的冰块, 现在告诉起点和终点,问从起点能否走到终点并且使终点 ...
- React架构、设计思想
一.
- CentOS编译安装Python3
前话 最近想学一下一门新的高级语言,无意中看到用python仿AIphaGo的github项目,就决定是他了. AIphaGo的Git传送门: https://github.com/Rochester ...
- Linux系统VIM编辑器
vim,linux系统中一款超好用的文本编辑器,是vi的升级版. 三种操作模式 命令模式: 控制光标移动,可对文本进行删除.恢复.黏贴等工作 输入模式: 正常的文本录入 末行模式: 保存,退出与设置编 ...
- Linux命令-mkdir
mkdir用于创建空白文件夹 参数-p用于连续创建多层目录 参数-m用于创建自定义的目录权限 [root@localhost test]# mkdir a/b/c/d mkdir: 无法创建目录&qu ...
- ORA-00911无效字符报错
今天在修改缺陷时遇到一个问题,更新数据库字段时一直报错:ORA-00911.sql脚本如下: '; '; '; 该脚本在数据库中可以执行,但是从程序中去访问数据库修改值时就会报错. 报错的原因在于,更 ...