时限为什么这么大啊

明摆着放多$ 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$

#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define ull unsigned long long
#define M 40010
#define file(x)freopen(x".in","r",stdin);freopen(x".out","w",stdout)
#define rt register int
#define l putchar('\n')
#define ll long long
#define r read()
using namespace std;
inline ll read(){
ll x = ; char zf = ; char ch = getchar();
while (ch != '-' && !isdigit(ch)) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (isdigit(ch)) x = x * + ch - '', ch = getchar(); return x * zf;
}
void write(ull y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ull y){write(y);putchar('\n');}
int k,m,n,x,y,z,cnt;ull ans[];
struct xxj{//线性基
#define sz 60
ull a[sz+];
xxj(){memset(a,,sizeof(a));}
void insert(ull x){
for(rt i=sz;x;i--)if(x>>i&){
if(!a[i])return a[i]=x,void();
x^=a[i];
}
}
bool check(const ull x){
for(rt i=sz;i>=;i--)if(x>>i&)if(!a[i])return ;
return ;
}
void rebuild(){
for(rt i=sz;i>=;i--)if(a[i])
for(rt j=i-;j>=;j--)if(a[j]>>i&)a[j]^=a[i];
}
ull Max(){
ull ret=;
for(rt i=sz;i>=;i--)if((ret^a[i])>ret)ret^=a[i];
return ret;
}
ull Min(){
for(rt i=;i<=sz;i++)if(a[i])return a[i];
return ;
}
ull kth(ull rk){
rebuild();ull ret=;
for(rt i=,j=;i<=sz;i++){
while(j<=sz&&!a[j])j++;
if(rk>>i&){
if(j>sz)return ;
ret^=a[j];
}j++;
}
return ret;
}
};
xxj merge(const xxj x,const xxj y){
xxj ret=y;
for(rt i=sz;i>=;i--)if(x.a[i])ret.insert(x.a[i]);
return ret;
}
#undef sz
struct query{
int x,y,id;
};
vector<query>ask[];
int nowmin,all,size[],Root,troot;
int F[M],L[M],N[M],a[M];ull v[M];bool vis[M];
void add(int x,int y){
a[++k]=y;
if(!F[x])F[x]=k;
else N[L[x]]=k;
L[x]=k;
}
void getroot(int x,int pre){
size[x]=;int maxsize=;
for(rt i=F[x];i;i=N[i])if(!vis[a[i]]&&a[i]!=pre){
getroot(a[i],x);
size[x]+=size[a[i]];
maxsize=max(maxsize,size[a[i]]);
}
maxsize=max(maxsize,all-size[x]);
if(maxsize<nowmin)nowmin=maxsize,Root=x;
}
int color[M];
void dfs_color(int x,int pre,int col){
color[x]=col;
for(rt i=F[x];i;i=N[i])if(a[i]!=pre&&!vis[a[i]])dfs_color(a[i],x,col);
}
xxj c[];
void dfs_calc(int x,int pre){
if(x==pre)memset(c[x].a,,sizeof(c[x].a));else c[x]=c[pre];
c[x].insert(v[x]);
for(rt i=F[x];i;i=N[i])if(a[i]!=pre&&!vis[a[i]])dfs_calc(a[i],x);
}
void calc(int x){
vis[x]=;color[x]=+x;
for(rt i=F[x];i;i=N[i])if(!vis[a[i]])dfs_color(a[i],x,a[i]);
dfs_calc(x,x);
for(auto i:ask[x]){
if(color[i.x]!=color[i.y])
ans[i.id]=max(ans[i.id],merge(c[i.x],c[i.y]).Max());
}
const int ls=all;
for(auto i:ask[x])if(color[i.x]==color[i.y])ask[color[i.x]+].push_back(i);
for(rt i=F[x];i;i=N[i])if(!vis[a[i]]){
if(size[a[i]]>size[x])all=nowmin=ls-size[x];else all=nowmin=size[a[i]];
getroot(a[i],x);ask[Root].clear();
ask[Root]=ask[a[i]+];ask[a[i]+].clear();
calc(Root);
}
}
int main(){
n=r;m=r;
for(rt i=;i<=n;i++)v[i]=r;
for(rt i=;i<n;i++){
x=r;y=r;
add(x,y);
add(y,x);
}
nowmin=all=n;getroot(,);troot=Root;
for(rt i=;i<=m;i++){
x=r;y=r;
if(x==y)ans[i]=v[x];else
ask[troot].push_back({x,y,i});
}
calc(troot);
for(rt i=;i<=m;i++)writeln(ans[i]);
return ;
}

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. configure - 源代码安装的第一步

    configure是源代码安装的第一步,主要的作用是对即将安装的软件进行配置,检查当前的环境是否满足要安装软件的依赖关系 configure有许多参数可配,具体参见./configure --help ...

  2. Django(十四)分页器(paginator)及自定义分页D

    http://www.mamicode.com/info-detail-1724597.html http://www.cnblogs.com/wupeiqi/articles/5246483.htm ...

  3. 第三十三节,目标检测之选择性搜索-Selective Search

    在基于深度学习的目标检测算法的综述 那一节中我们提到基于区域提名的目标检测中广泛使用的选择性搜索算法.并且该算法后来被应用到了R-CNN,SPP-Net,Fast R-CNN中.因此我认为还是有研究的 ...

  4. 第十三节,使用带有全局平均池化层的CNN对CIFAR10数据集分类

    这里使用的数据集仍然是CIFAR-10,由于之前写过一篇使用AlexNet对CIFAR数据集进行分类的文章,已经详细介绍了这个数据集,当时我们是直接把这些图片的数据文件下载下来,然后使用pickle进 ...

  5. request鉴权的处理和判断

    一般查看蝉道bug管理工具bug列表的时候,会提示 Unauthorized  access,那是因为需要用户名和密码,一般用基本的认证,代码如下: 不是所有的系统都是开放的,有些人是不可以访问的,所 ...

  6. Linux中rpm的使用

    1.安装 rpm -i 需要安装的包文件名 举例如下: rpm -i example.rpm 安装 example.rpm 包: rpm -iv example.rpm 安装 example.rpm ...

  7. 《Apache kafka实战》读书笔记-管理Kafka集群安全之ACL篇

    <Apache kafka实战>读书笔记-管理Kafka集群安全之ACL篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家能看到这篇博客的小伙伴,估计你对kaf ...

  8. shell常见文本处理。(awk 替换换行符等)

    1 文件里有如下行,我想将每行的回车符替换为逗号,并将所有行合并到一行,用awk或sed怎么写啊TOP_COLUMNTOP_MESSAGETOP_OPTIONSTOP_TOPICTOP_VOTETOP ...

  9. Sql Server 游标例子笔记

    create PROCEDURE total_mySaleDuty as BEGIN DECLARE @a int,@error int DECLARE @b int,@errorb int DECL ...

  10. python -- conda pytorch

    Linux上用anaconda安装pytorch Pytorch是一个非常优雅的深度学习框架.使用anaconda可以非常方便地安装pytorch.下面我介绍一下用anaconda安装pytorch的 ...