博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LOJ #2013「SCOI2016」幸运数字
阅读量:6080 次
发布时间:2019-06-20

本文共 2600 字,大约阅读时间需要 8 分钟。

时限为什么这么大啊

明摆着放多$ 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
#include
#include
#include
#include
#include
#include
#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 = 0; char zf = 1; char ch = getchar(); while (ch != '-' && !isdigit(ch)) ch = getchar(); if (ch == '-') zf = -1, ch = getchar(); while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar(); return x * zf;}void write(ull y){ if(y<0)putchar('-'),y=-y;if(y>9)write(y/10);putchar(y%10+48);}void writeln(const ull y){write(y);putchar('\n');}int k,m,n,x,y,z,cnt;ull ans[200010];struct xxj{ //线性基 #define sz 60 ull a[sz+1]; xxj(){memset(a,0,sizeof(a));} void insert(ull x){ for(rt i=sz;x;i--)if(x>>i&1){ if(!a[i])return a[i]=x,void(); x^=a[i]; } } bool check(const ull x){ for(rt i=sz;i>=0;i--)if(x>>i&1)if(!a[i])return 1; return 0; } void rebuild(){ for(rt i=sz;i>=0;i--)if(a[i]) for(rt j=i-1;j>=0;j--)if(a[j]>>i&1)a[j]^=a[i]; } ull Max(){ ull ret=0; for(rt i=sz;i>=0;i--)if((ret^a[i])>ret)ret^=a[i]; return ret; } ull Min(){ for(rt i=0;i<=sz;i++)if(a[i])return a[i]; return 0; } ull kth(ull rk){ rebuild();ull ret=0; for(rt i=0,j=0;i<=sz;i++){ while(j<=sz&&!a[j])j++; if(rk>>i&1){ if(j>sz)return 0; ret^=a[j]; }j++; } return ret; }};xxj merge(const xxj x,const xxj y){ xxj ret=y; for(rt i=sz;i>=0;i--)if(x.a[i])ret.insert(x.a[i]); return ret;}#undef szstruct query{ int x,y,id;};vector
ask[40010];int nowmin,all,size[20010],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]=1;int maxsize=0; 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
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]+20000];ask[a[i]+20000].clear(); calc(Root); }}int main(){ n=r;m=r; for(rt i=1;i<=n;i++)v[i]=r; for(rt i=1;i

 

转载于:https://www.cnblogs.com/DreamlessDreams/p/10110444.html

你可能感兴趣的文章
微软职位内部推荐-Senior Software Engineer II-Sharepoint
查看>>
sql 字符串操作
查看>>
【转】Android布局优化之ViewStub
查看>>
网络安全管理技术作业-SNMP实验报告
查看>>
根据Uri获取文件的绝对路径
查看>>
Flutter 插件开发:以微信SDK为例
查看>>
.NET[C#]中NullReferenceException(未将对象引用到实例)是什么问题?如何修复处理?...
查看>>
边缘控制平面Ambassador全解读
查看>>
Windows Phone 7 利用计时器DispatcherTimer创建时钟
查看>>
程序员最喜爱的12个Android应用开发框架二(转)
查看>>
vim学习与理解
查看>>
DIRECTSHOW在VS2005中PVOID64问题和配置问题
查看>>
MapReduce的模式,算法以及用例
查看>>
《Advanced Linux Programming》读书笔记(1)
查看>>
zabbix agent item
查看>>
一步一步学习SignalR进行实时通信_7_非代理
查看>>
AOL重组为两大业务部门 全球裁员500人
查看>>
字符设备与块设备的区别
查看>>
为什么我弃用GNOME转向KDE(2)
查看>>
Redis学习记录初篇
查看>>