题目: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. 树(王康宁)的更多相关文章

  1. 【Tsinsen-A1486】树(王康宁) 点分治 + Trie

    A1486. 树(王康宁) 时间限制:1.0s   内存限制:512.0MB   总提交次数:455   AC次数:97   平均分:52.62 查看未格式化的试题   提交   试题讨论 试题来源 ...

  2. Tsinsen A1486. 树(王康宁)

    Description 一棵树,问至少有 \(k\) 个黑点的路径最大异或和. Sol 点分治. 用点分治找重心控制树高就不说了,主要是对答案的统计的地方. 将所有路径按点的个数排序. 可以发现当左端 ...

  3. 搭建Django链接MySQL流程(python2版)

    之前生成选型python3,除了用的python3的pymysql模块之外其他的都是一样的. 1.首先搭建mysql(Mariadb)数据库(单点)         安装方式分为yum安装,rpm包安 ...

  4. 王学长的AAA树

    让我们响应王学长的号召勇敢的分开写splay和lct吧! 分开写大法好!!!!!!!!!!!杜教的ch[4]弱爆了!!!! #include <stdio.h> #include < ...

  5. 「模拟8.18」字符串(卡特兰数)·乌鸦喝水(树状数组,二分)·所驼门王的宝藏(tarjan,拓扑)

    最近好颓啊,所以啥都做不出来 简单说一下这次考试,分机房了,还分不同考卷,果然我还是留在二机房的蒟蒻, 大概也只有这样的简单题,才能勉强水个rank 3吧........ 其实不必管在哪个机房,努力便 ...

  6. 算法与数据结构(十一) 平衡二叉树(AVL树)

    今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...

  7. HDU 4417 (划分树+区间小于k统计)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目大意:给定一个区间,以及一个k值,求该区间内小于等于k值的数的个数.注意区间是从0开始的 ...

  8. EF4.0、4.3创建表达式树状动态查询总结

    ---------------------------------------------快速适用 效果: where name like '%王%' and Age>=35 or Age< ...

  9. Atitti 图像处理 特征提取的科技树 attilax总结

    Atitti 图像处理 特征提取的科技树 attilax总结 理论 数学,信号处理,图像,计算机视觉 图像处理 滤波 图像处理 颜色转换 图像处理 压缩编码 图像处理 增强 图像处理 去模糊 图像处理 ...

随机推荐

  1. linux下通过acl配置灵活目录文件权限(可用于ftp,web服务器的用户权限控制)

    linux下通过acl配置灵活目录文件权限(可用于ftp,web服务器的用户权限控制) 发表于2012//07由feng linux 本身的ugo rwx的权限,对于精确的权限控制很是力不从心的,ac ...

  2. uva 11374

    Problem D: Airport Express In a small city called Iokh, a train service, Airport-Express, takes resi ...

  3. poj 3684

    Physics Experiment Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 784   Accepted: 266 ...

  4. DF学Mysql(一)——数据库基本操作

    1.创建数据库 create Database <数据库名>; 注意:1)数据库名由字母.下划线.@.#和$组成 2)首字母不能是数字和$符号 3)不允许有空格和特殊字符 2.查看数据库 ...

  5. Javascript nextElementSibling和nextSibling

    function next(ele) { if (typeof ele.nextElementSibling == 'object') { return ele.nextElementSibling; ...

  6. (1)搭建opencv-android环境

    前言: 本文目的是指导在windows平台搭建一个opencv for android 的开发环境,作者参考了很多网上的教程,本文所使用的各种软件.插件都是截止到写这篇文章的最新版本,作者在实际搭建环 ...

  7. springmvc的系统学习之配置方式

    资源:尚学堂  邹波 springmvc框架视频  一.springMVC 工作流程        页面请求---->控制器(Controller DispatcherServlet)----& ...

  8. Linux zip解压/压缩并指定目录

    方法如下: 压缩并指定目录举例:zip -r /home/kms/kms.zip /home/kms/server/kms 解压并指定目录 举例:unzip /home/kms/kms.zip -d ...

  9. SQL Server Configuration Manager出错

    在 Windows 桌面上,单击“开始”,然后单击“运行”.  在“打开”框中,键入 MMC,然后单击“确定”.  在“控制台”窗口中,单击菜单栏上的“文件”,然后单击“添加/删除管理单元”.  在“ ...

  10. Android核心分析之二十八Android GDI之Surface&Canvas

    Surface&Canvas Canvas为在画布的意思.Android上层的作图几乎都通过Canvas实例来完成,其实Canvas更多是一种接口的包装.drawPaints ,drawPoi ...