时限为什么这么大啊

明摆着放多$ log$的做法过啊$QAQ$

LOJ #2013


题意

有$ Q$次询问,每次询问树上一条链,点有点权,你需要选择一些链上的点使得异或和尽量大

点数$ \leq 2*10^4$ 询问数$ \leq 2*10^5$ 值域不超过$ 2^{64}$


$ Solution$

直接点分

把询问用$ vector$挂在当前点分中心上

计算一个点的时候

递归计算它统率的子树,在每个点挂上从自己到根的线性基,

每次相当于继承父亲的线性基并插入一个数

然后将询问分成两类

不过当前点分中心的:下放到之后的点分计算

经过当前点分中心的:每次进行一次线性基合并然后求线性基最大值

总复杂度$ O(Q·60^2+n·60·log \ n)$


$My \ code$

  1. #include<ctime>
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<algorithm>
  7. #include<queue>
  8. #define ull unsigned long long
  9. #define M 40010
  10. #define file(x)freopen(x".in","r",stdin);freopen(x".out","w",stdout)
  11. #define rt register int
  12. #define l putchar('\n')
  13. #define ll long long
  14. #define r read()
  15. using namespace std;
  16. inline ll read(){
  17. ll x = ; char zf = ; char ch = getchar();
  18. while (ch != '-' && !isdigit(ch)) ch = getchar();
  19. if (ch == '-') zf = -, ch = getchar();
  20. while (isdigit(ch)) x = x * + ch - '', ch = getchar(); return x * zf;
  21. }
  22. void write(ull y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
  23. void writeln(const ull y){write(y);putchar('\n');}
  24. int k,m,n,x,y,z,cnt;ull ans[];
  25. struct xxj{//线性基
  26. #define sz 60
  27. ull a[sz+];
  28. xxj(){memset(a,,sizeof(a));}
  29. void insert(ull x){
  30. for(rt i=sz;x;i--)if(x>>i&){
  31. if(!a[i])return a[i]=x,void();
  32. x^=a[i];
  33. }
  34. }
  35. bool check(const ull x){
  36. for(rt i=sz;i>=;i--)if(x>>i&)if(!a[i])return ;
  37. return ;
  38. }
  39. void rebuild(){
  40. for(rt i=sz;i>=;i--)if(a[i])
  41. for(rt j=i-;j>=;j--)if(a[j]>>i&)a[j]^=a[i];
  42. }
  43. ull Max(){
  44. ull ret=;
  45. for(rt i=sz;i>=;i--)if((ret^a[i])>ret)ret^=a[i];
  46. return ret;
  47. }
  48. ull Min(){
  49. for(rt i=;i<=sz;i++)if(a[i])return a[i];
  50. return ;
  51. }
  52. ull kth(ull rk){
  53. rebuild();ull ret=;
  54. for(rt i=,j=;i<=sz;i++){
  55. while(j<=sz&&!a[j])j++;
  56. if(rk>>i&){
  57. if(j>sz)return ;
  58. ret^=a[j];
  59. }j++;
  60. }
  61. return ret;
  62. }
  63. };
  64. xxj merge(const xxj x,const xxj y){
  65. xxj ret=y;
  66. for(rt i=sz;i>=;i--)if(x.a[i])ret.insert(x.a[i]);
  67. return ret;
  68. }
  69. #undef sz
  70. struct query{
  71. int x,y,id;
  72. };
  73. vector<query>ask[];
  74. int nowmin,all,size[],Root,troot;
  75. int F[M],L[M],N[M],a[M];ull v[M];bool vis[M];
  76. void add(int x,int y){
  77. a[++k]=y;
  78. if(!F[x])F[x]=k;
  79. else N[L[x]]=k;
  80. L[x]=k;
  81. }
  82. void getroot(int x,int pre){
  83. size[x]=;int maxsize=;
  84. for(rt i=F[x];i;i=N[i])if(!vis[a[i]]&&a[i]!=pre){
  85. getroot(a[i],x);
  86. size[x]+=size[a[i]];
  87. maxsize=max(maxsize,size[a[i]]);
  88. }
  89. maxsize=max(maxsize,all-size[x]);
  90. if(maxsize<nowmin)nowmin=maxsize,Root=x;
  91. }
  92. int color[M];
  93. void dfs_color(int x,int pre,int col){
  94. color[x]=col;
  95. for(rt i=F[x];i;i=N[i])if(a[i]!=pre&&!vis[a[i]])dfs_color(a[i],x,col);
  96. }
  97. xxj c[];
  98. void dfs_calc(int x,int pre){
  99. if(x==pre)memset(c[x].a,,sizeof(c[x].a));else c[x]=c[pre];
  100. c[x].insert(v[x]);
  101. for(rt i=F[x];i;i=N[i])if(a[i]!=pre&&!vis[a[i]])dfs_calc(a[i],x);
  102. }
  103. void calc(int x){
  104. vis[x]=;color[x]=+x;
  105. for(rt i=F[x];i;i=N[i])if(!vis[a[i]])dfs_color(a[i],x,a[i]);
  106. dfs_calc(x,x);
  107. for(auto i:ask[x]){
  108. if(color[i.x]!=color[i.y])
  109. ans[i.id]=max(ans[i.id],merge(c[i.x],c[i.y]).Max());
  110. }
  111. const int ls=all;
  112. for(auto i:ask[x])if(color[i.x]==color[i.y])ask[color[i.x]+].push_back(i);
  113. for(rt i=F[x];i;i=N[i])if(!vis[a[i]]){
  114. if(size[a[i]]>size[x])all=nowmin=ls-size[x];else all=nowmin=size[a[i]];
  115. getroot(a[i],x);ask[Root].clear();
  116. ask[Root]=ask[a[i]+];ask[a[i]+].clear();
  117. calc(Root);
  118. }
  119. }
  120. int main(){
  121. n=r;m=r;
  122. for(rt i=;i<=n;i++)v[i]=r;
  123. for(rt i=;i<n;i++){
  124. x=r;y=r;
  125. add(x,y);
  126. add(y,x);
  127. }
  128. nowmin=all=n;getroot(,);troot=Root;
  129. for(rt i=;i<=m;i++){
  130. x=r;y=r;
  131. if(x==y)ans[i]=v[x];else
  132. ask[troot].push_back({x,y,i});
  133. }
  134. calc(troot);
  135. for(rt i=;i<=m;i++)writeln(ans[i]);
  136. return ;
  137. }

LOJ #2013「SCOI2016」幸运数字的更多相关文章

  1. loj#2013. 「SCOI2016」幸运数字 点分治/线性基

    题目链接 loj#2013. 「SCOI2016」幸运数字 题解 和树上路径有管...点分治吧 把询问挂到点上 求出重心后,求出重心到每个点路径上的数的线性基 对于重心为lca的合并寻味,否则标记下传 ...

  2. loj #2013. 「SCOI2016」幸运数字

    #2013. 「SCOI2016」幸运数字 题目描述 A 国共有 n nn 座城市,这些城市由 n−1 n - 1n−1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以 ...

  3. 【LOJ】 #2013. 「SCOI2016」幸运数字

    题解 最大异或和,明显是个线性基 然而还有那么多路径--那就树分治,反正点数看起来很少,就是为了让人乘上一个60的常数嘛 把一个树的点分树记录下来,然后看看询问的两个点彼此相同的最后一个父亲是谁,把这 ...

  4. AC日记——「SCOI2016」幸运数字 LiBreOJ 2013

    「SCOI2016」幸运数字 思路: 线性基: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 20005 # ...

  5. 「洛谷3292」「BZOJ4568」「SCOI2016」幸运数字【倍增LCA+线性基+合并】

    [bzoj数据下载地址]不要谢我 先讲一下窝是怎么错的... \(MLE\)是因为数组开小了.. 看到异或和最大,那么就会想到用线性基. 如果不会线性基的可以参考一下我的学习笔记:「线性基」学习笔记a ...

  6. loj2013 「SCOI2016」幸运数字

    点分治+线性基 (为了这六个字窝调了一下午一晚上QAQ #include <iostream> #include <cstring> #include <cstdio&g ...

  7. loj#2015. 「SCOI2016」妖怪 凸函数/三分

    题目链接 loj#2015. 「SCOI2016」妖怪 题解 对于每一项展开 的到\(atk+\frac{dnf}{b}a + dnf + \frac{atk}{a} b\) 令$T = \frac{ ...

  8. loj#2016. 「SCOI2016」美味

    题目链接 loj#2016. 「SCOI2016」美味 题解 对于不带x的怎么做....可持久化trie树 对于带x,和trie树一样贪心 对于答案的二进制位,从高往低位贪心, 二进制可以表示所有的数 ...

  9. loj#2012. 「SCOI2016」背单词

    题目链接 loj#2012. 「SCOI2016」背单词 题解 题面描述有点不清楚. 考虑贪心 type1的花费一定不会是优的,不考虑, 所以先把后缀填进去,对于反串建trie树, 先填父亲再填儿子, ...

随机推荐

  1. C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码

    本文介绍在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码.网上文章大多只是简单介绍内置参数的设置,根据我的使用目的,增加了自定义目标二维码图片尺寸和白边 ...

  2. Day034--Python--锁, 信号量, 事件, 队列, 生产者消费者模型, joinableQueue

    进程同步: 1. 锁 (重点)    锁通常被用来实现对共享资源的同步访问.为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其它线程已经获得了该锁, ...

  3. Day9--Python--函数入门

    函数神马是函数: 函数是对功能或动作的封装函数的定义: def 函数名(形参列表): #参数 函数体(return) 调用: ret = 函数名(实参列表) 函数名就是变量名: 函数名的命名规则:变量 ...

  4. android studio adb.exe已停止工作(全面成功版 进程的查询和开启)

    先输入adb看是否存在. 如果不存在则:在系统path里添加C:\Users\nubia\AppData\Local\Android\sdk\platform-tools 因为这个目录里有adb 或者 ...

  5. SSH整合redis和MongoDB错误笔记

    由于毕设中做的是图片搜索网站,选择前端框用SSH,因为之间接触过SSH框架,略有了解,但没有深究,现在在整合redis和mongodb的过程中遇到很多错误,也是十分痛苦,只能通过百度和一步步尝试着解决 ...

  6. C内存分配

    calloc和realloc与malloc的区别 calloc和realloc的原型如下: void *calloc ( size_t num_elements, size_t element_siz ...

  7. ajax请求封装函数

    写封装函数的套路 1.先写出这个函数原来的基本用法 2.写一个没有形参空函数,将上一步的代码直接作为函数体, 3.根据使用过程中,抽象出来需要变的东西作为形参 function ajax (metho ...

  8. day08-(xml&&tomcat)

    回顾: jdbc: java语言操作数据库 jdbc是一套规范,oracle公司制定的 驱动:jdbc的实现类,由数据库厂商提供 使用步骤: .导入jar包(驱动) .注册驱动 Class.forNa ...

  9. ElasticSearch的插件(Plugins)介绍

    ElasticSearch的插件(Plugins)介绍 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 目前可以扩展ElasticSearch功能的插件有很多,比如:添加自定义的映 ...

  10. hive metastore && hiveserver2 . 基本配置

    <?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-s ...