LOJ #2013「SCOI2016」幸运数字
时限为什么这么大啊
明摆着放多$ log$的做法过啊$QAQ$
题意
有$ 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」幸运数字的更多相关文章
- loj#2013. 「SCOI2016」幸运数字 点分治/线性基
题目链接 loj#2013. 「SCOI2016」幸运数字 题解 和树上路径有管...点分治吧 把询问挂到点上 求出重心后,求出重心到每个点路径上的数的线性基 对于重心为lca的合并寻味,否则标记下传 ...
- loj #2013. 「SCOI2016」幸运数字
#2013. 「SCOI2016」幸运数字 题目描述 A 国共有 n nn 座城市,这些城市由 n−1 n - 1n−1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以 ...
- 【LOJ】 #2013. 「SCOI2016」幸运数字
题解 最大异或和,明显是个线性基 然而还有那么多路径--那就树分治,反正点数看起来很少,就是为了让人乘上一个60的常数嘛 把一个树的点分树记录下来,然后看看询问的两个点彼此相同的最后一个父亲是谁,把这 ...
- AC日记——「SCOI2016」幸运数字 LiBreOJ 2013
「SCOI2016」幸运数字 思路: 线性基: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 20005 # ...
- 「洛谷3292」「BZOJ4568」「SCOI2016」幸运数字【倍增LCA+线性基+合并】
[bzoj数据下载地址]不要谢我 先讲一下窝是怎么错的... \(MLE\)是因为数组开小了.. 看到异或和最大,那么就会想到用线性基. 如果不会线性基的可以参考一下我的学习笔记:「线性基」学习笔记a ...
- loj2013 「SCOI2016」幸运数字
点分治+线性基 (为了这六个字窝调了一下午一晚上QAQ #include <iostream> #include <cstring> #include <cstdio&g ...
- loj#2015. 「SCOI2016」妖怪 凸函数/三分
题目链接 loj#2015. 「SCOI2016」妖怪 题解 对于每一项展开 的到\(atk+\frac{dnf}{b}a + dnf + \frac{atk}{a} b\) 令$T = \frac{ ...
- loj#2016. 「SCOI2016」美味
题目链接 loj#2016. 「SCOI2016」美味 题解 对于不带x的怎么做....可持久化trie树 对于带x,和trie树一样贪心 对于答案的二进制位,从高往低位贪心, 二进制可以表示所有的数 ...
- loj#2012. 「SCOI2016」背单词
题目链接 loj#2012. 「SCOI2016」背单词 题解 题面描述有点不清楚. 考虑贪心 type1的花费一定不会是优的,不考虑, 所以先把后缀填进去,对于反串建trie树, 先填父亲再填儿子, ...
随机推荐
- C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码
本文介绍在 C# 中使用 ThoughtWorks.QRCode.dll 生成指定尺寸和边框宽度的二维码.网上文章大多只是简单介绍内置参数的设置,根据我的使用目的,增加了自定义目标二维码图片尺寸和白边 ...
- Day034--Python--锁, 信号量, 事件, 队列, 生产者消费者模型, joinableQueue
进程同步: 1. 锁 (重点) 锁通常被用来实现对共享资源的同步访问.为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其它线程已经获得了该锁, ...
- Day9--Python--函数入门
函数神马是函数: 函数是对功能或动作的封装函数的定义: def 函数名(形参列表): #参数 函数体(return) 调用: ret = 函数名(实参列表) 函数名就是变量名: 函数名的命名规则:变量 ...
- android studio adb.exe已停止工作(全面成功版 进程的查询和开启)
先输入adb看是否存在. 如果不存在则:在系统path里添加C:\Users\nubia\AppData\Local\Android\sdk\platform-tools 因为这个目录里有adb 或者 ...
- SSH整合redis和MongoDB错误笔记
由于毕设中做的是图片搜索网站,选择前端框用SSH,因为之间接触过SSH框架,略有了解,但没有深究,现在在整合redis和mongodb的过程中遇到很多错误,也是十分痛苦,只能通过百度和一步步尝试着解决 ...
- C内存分配
calloc和realloc与malloc的区别 calloc和realloc的原型如下: void *calloc ( size_t num_elements, size_t element_siz ...
- ajax请求封装函数
写封装函数的套路 1.先写出这个函数原来的基本用法 2.写一个没有形参空函数,将上一步的代码直接作为函数体, 3.根据使用过程中,抽象出来需要变的东西作为形参 function ajax (metho ...
- day08-(xml&&tomcat)
回顾: jdbc: java语言操作数据库 jdbc是一套规范,oracle公司制定的 驱动:jdbc的实现类,由数据库厂商提供 使用步骤: .导入jar包(驱动) .注册驱动 Class.forNa ...
- ElasticSearch的插件(Plugins)介绍
ElasticSearch的插件(Plugins)介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 目前可以扩展ElasticSearch功能的插件有很多,比如:添加自定义的映 ...
- hive metastore && hiveserver2 . 基本配置
<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-s ...