Description

一棵树,问至少有 \(k\) 个黑点的路径最大异或和.

Sol

点分治.

用点分治找重心控制树高就不说了,主要是对答案的统计的地方.

将所有路径按点的个数排序.

可以发现当左端点递增的时候右端点单调递减,时刻满足Trie树里的所有元素都是合法的即可,不断把右端点丢进去,用左端点统计答案.

主要跨越根的时候根的贡献计算了两次,需要删掉一次.

对于需要满足不是一颗子树,可以将Trie树上的节点打一个标记,表示这个节点及其子节点都是在某子树下的路径,子树个数大于1的时候这个标记就没用了.

我在维护标记的时候标记位置打错了...居然有95...调了好长时间QAQ...

Code

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define debug(a) cout<<#a<<"="<<a<<" "
  5. const int N = 1e5+50;
  6. const int M = 31;
  7.  
  8. int n,k,kk,rt,ans=-1;
  9. int pow2[M];
  10. int bl[N],v[N],sz[N],t[N];
  11. vector< int > g[N];
  12. int usd[N];
  13.  
  14. struct pr { int x,y,z; };
  15. bool operator < (const pr &a,const pr &b) { return a.x<b.x; }
  16. vector< pr > S;
  17.  
  18. struct Trie {
  19. int cnt,rt;
  20. int ch[N*M][2],s[N*M],bl[N*M];
  21.  
  22. int GetNode() { cnt++;ch[cnt][0]=ch[cnt][1]=s[cnt]=0;return cnt; }
  23. void init() {
  24. cnt=0,rt=GetNode();
  25. }
  26. void insert(int x,int fr) {
  27. int o=rt,r;
  28. for(int i=M-1;~i;i--) {
  29. if(x&pow2[i]) r=1;else r=0;
  30. if(!ch[o][r]) ch[o][r]=GetNode(),bl[ch[o][r]]=fr;
  31. else bl[ch[o][r]]=bl[ch[o][r]]==fr ? fr : 0;
  32. o=ch[o][r],s[o]++;
  33. }
  34. }
  35. int getv(int x,int fr) {
  36. int o=rt,r,res=0;
  37. if(!ch[rt][0] && !ch[rt][1]) return -1;
  38. for(int i=M-1;~i;i--) {
  39. if(x&pow2[i]) r=1;else r=0;
  40. if(s[ch[o][r^1]] && bl[ch[o][r^1]]!=fr) res|=pow2[i],r^=1;
  41. if(bl[ch[o][r]]==fr) return -1;
  42. o=ch[o][r];
  43. }return res;
  44. }
  45. }py;
  46. inline int in(int x=0,char ch=getchar()) { while(ch>'9' || ch<'0') ch=getchar();
  47. while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();return x; }
  48.  
  49. void GetRoot(int u,int fa,int nn) {
  50. t[u]=0,sz[u]=1;
  51. for(vector< int >::iterator i=g[u].begin();i!=g[u].end();i++)
  52. if((*i)!=fa && !usd[(*i)]) GetRoot(*i,u,nn),t[u]=max(t[u],sz[*i]),sz[u]+=sz[*i];
  53. t[u]=max(t[u],nn-sz[u]);
  54. if(t[u]<t[rt]) rt=u;
  55. }
  56. void GetS(int u,int fa,int c,int vv,int ff) {
  57. S.push_back((pr){ c,vv,ff });
  58. if(c>=k) ans=max(ans,vv);
  59. for(vector< int >::iterator i=g[u].begin();i!=g[u].end();i++)
  60. if((*i)!=fa && !usd[*i]) GetS(*i,u,c+bl[*i],vv^v[*i],ff);
  61. }
  62. void GetAns(int u,int fa,int nn) {
  63. usd[u]=1,py.init(),S.clear();if(bl[u]>=k) ans=max(ans,v[u]);
  64. for(vector< int >::iterator i=g[u].begin();i!=g[u].end();i++)
  65. if((*i)!=fa && !usd[(*i)]) GetS((*i),u,bl[u]+bl[(*i)],v[(*i)],*i);
  66. sort(S.begin(),S.end());
  67.  
  68. // cout<<u<<" : "<<nn<<endl;
  69. // for(int i=0;i<(int)S.size();i++) cout<<S[i].x<<" "<<S[i].y<<" "<<S[i].z<<endl;
  70.  
  71. int lim=S.size(),l=0,r=lim-1;
  72. for(;l<lim;l++) {
  73. while(l<r && S[l].x+S[r].x>=k+bl[u]) py.insert(S[r].y,S[r].z),r--;
  74. ans=max(ans,py.getv(S[l].y^v[u],S[l].z));
  75. // debug(l),debug(r),debug(ans)<<endl;
  76. }
  77. // debug(ans)<<endl;
  78. // cout<<"-------------------------"<<endl;
  79.  
  80. int ss;
  81. for(vector< int >::iterator i=g[u].begin();i!=g[u].end();i++)
  82. if((*i)!=fa && !usd[(*i)]) rt=0,ss=sz[(*i)]>sz[u] ? nn-sz[u] : sz[*i],GetRoot((*i),u,ss),GetAns(rt,rt,ss);
  83. }
  84. int main() {
  85. n=in(),k=in();
  86. for(int i=1;i<=n;i++) bl[i]=in();
  87. for(int i=1;i<=n;i++) v[i]=in();
  88. for(int i=1,u,v;i<n;i++) u=in(),v=in(),g[u].push_back(v),g[v].push_back(u);
  89.  
  90. pow2[0]=1;for(int i=1;i<M;i++) pow2[i]=pow2[i-1]<<1;
  91. // for(int i=0;i<M;i++) cout<<pow2[i]<<endl;
  92. rt=0,t[rt]=n+1,GetRoot(1,1,n),GetAns(rt,rt,n);
  93.  
  94. cout<<ans<<endl;
  95. return 0;
  96. }

Tsinsen A1486. 树(王康宁)的更多相关文章

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

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

  2. A1486. 树(王康宁)

    题目:http://www.tsinsen.com/A1486 题解: 其实看到和路径有关的就应该想到点分治. 我们找出重心之后遍历每一棵子树得到它的 { x=经过特殊点的个数,y=到rt的异或和} ...

  3. Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序

    题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s   内存限制:512.0MB    总提交次数:196   AC次数:65   平均分: ...

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

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

  5. Tsinsen A1219. 采矿(陈许旻) (树链剖分,线段树 + DP)

    [题目链接] http://www.tsinsen.com/A1219 [题意] 给定一棵树,a[u][i]代表u结点分配i人的收益,可以随时改变a[u],查询(u,v)代表在u子树的所有节点,在u- ...

  6. Tsinsen A1517. 动态树 树链剖分,线段树,子树操作

    题目 : http://www.tsinsen.com/A1517 A1517. 动态树 时间限制:3.0s   内存限制:1.0GB    总提交次数:227   AC次数:67   平均分:49. ...

  7. 王学长的AAA树

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

  8. 【Tsinsen A1039】【bzoj2638】黑白染色 (BFS树)

    Descroption 原题链接 你有一个\(n*m\)的矩形,一开始所有格子都是白色,然后给出一个目标状态的矩形,有的地方是白色,有的地方是黑色,你每次可以选择一个连通块(四连通块,且不要求颜色一样 ...

  9. 【Tsinsen A1339】JZPLCM (树状数组)

    Description 原题链接 ​ 给定一长度为\(~n~\)的正整数序列\(~a~\),有\(~q~\)次询问,每次询问一段区间内所有数的\(~LCM~\)(即最小公倍数).由于答案可能很大,输出 ...

随机推荐

  1. ACM/ICPC2016 青岛区域赛

    A(hdu5982).(模拟) 题意:输入n对数,将每对数相乘并相加 分析:模拟 B(hdu5983).(模拟) 题意:给你一个二阶魔方,问能否通过一次旋转使得给定魔方的每个面颜色相同 分析:模拟 C ...

  2. SQL Server 2012附加数据库时,错误提示如下:尝试打开或创建物理时,CREATE FILE 遇到操作系统错误 5(拒绝访问。)

    错误提示:Create File遇到操作系统错误5(拒绝访问) 解决方案: 在所有程序-SQL Server 2012-"SQL Server 配置管理器",点击"SQL ...

  3. Android开发之延时执行

    new Handler().postDelayed(new Runnable() { @Override public void run() { //两秒后执行 startMainActivity() ...

  4. C#中两个Form窗口之间的传值(父->子)(子->父)

    //首先定义两个Form,一个为Form1,一个为Form2,其中Form1作为父窗口,Form2作为子窗口 //1.父窗口传值给子窗口 //Form1中代码: public Form1() { In ...

  5. 用vue.js学习es6(三):数组、对象和函数的解构

    一.数组的解构: 以前的方式: var arr = [1,2,3]; console.log(arr[0]); //1 console.log(arr[1]); //2 现在的方式: var [a,b ...

  6. 【BZOJ 1494】【NOI 2007】生成树计数

    http://www.lydsy.com/JudgeOnline/problem.php?id=1494 这道题..因为k很小,而且我们只关心连续的k个节点的连通性,所以把连续的k个点轮廓线上的连通性 ...

  7. Vue.js基础篇实战--一个ToDoList小应用

    距离开始学Vue已经过去一个多月了,总想把学到的东西柔和在一起,做点东西出来,于是有了这个Todolist小应用. 使用vuex 纯粹基础,没有用到web pack,vuex,npm,下次把它改造一下 ...

  8. 调戏OpenShift:一个免费能干的云平台

    一.前因后果 以前为了搞微信的公众号,在新浪sae那里申请了一个服务器,一开始还挺好的 ,有免费的云豆送,但是一直运行应用也要消费云豆,搞得云豆也所剩无几了.作为一名屌丝,日常吃土,就单纯想玩一玩微信 ...

  9. MVC5知识点记录

    IIS/ASP.NET管道 原理永远是重中之重,所以在开篇的地方,先了解一下地址栏输入网址回车之后的故事. 不同IIS版本处理请求也不一样 IIS5 IIS 5.x 运行在进程InetInfo.exe ...

  10. springmvc 格式化使用Jackjson格式化报Failed to write HTTP message

    Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: Co ...