博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【学术篇】SPOJ COT 树上主席树
阅读量:4988 次
发布时间:2019-06-12

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

之前用树上莫队水过了COT2...
其实COT也可以用树上莫队水过去不过好像复杂度要带个log还是怎么样可能会被卡常数..
那就orz主席吧.... 写了一发然后非常快速的WA掉了...
然鹅bzoj(luogu)搞成了强制在线, 那就真的不能orz莫队智能orz主席了...
结果在luogu写了一发交上去全RE... 然后发现讨论区一帮子病友...
但是根据他们的心得改一波还是RE啊... 后来发现是自己脑抽参数传错了... 于是就WA呗, 那么一xor lastans的点值就很可能不合法就GG咯~

通过写的主席树, 可以知道其实就是维护一个可减的线段树前缀和.

话说本来是想写写主席树的但是构思了一下发现实在讲不清楚那就省了吧OvO
所以搬到树上用一波树上差分就ok了.. 我们令第\(i\)棵主席树储存\(1\sim i\)这条链的前缀和, 那么
\[ ans_{x,y}=sum_x+sum_y-sum_{lca(x,y)}-sum_{fa_{lca(x,y)}} \]
那就跟平常的主席树差不多咯...

代码:

#include 
#include
#include
#include
using namespace std;vector
vec; const int N=222222;const int L=18;inline int gn(int a=0,char c=0,int f=1){ for(;(c<'0'||c>'9')&&c!='-';c=getchar()); if(c=='-') f=-1,c=getchar(); for(;c>='0'&&c<='9';c=getchar()) a=a*10+c-'0'; return a*f;}struct node{ int sum,l,r;}t[N<<5]; int tot;void inser(int num,int &x,int l,int r){ t[++tot]=t[x]; x=tot; ++t[x].sum; if(l==r) return; int mid=(l+r)>>1; if(num<=mid) inser(num,t[x].l,l,mid); else inser(num,t[x].r,mid+1,r);}struct edge{ int to,next;}e[N<<1]; int v[N],tt,n,q;int lca[N][L],d[N],a[N],rt[N];inline void buildedge(int x,int y){ e[++tt].to=y; e[tt].next=v[x]; v[x]=tt; e[++tt].to=x; e[tt].next=v[y]; v[y]=tt;}void dfs(int x){ rt[x]=rt[lca[x][0]]; inser(lower_bound(vec.begin(),vec.end(),a[x])-vec.begin()+1,rt[x],1,n); for(int i=1;i
=0;--i) if(k&(1<
=0;--i) if(lca[x][i]!=lca[y][i]) x=lca[x][i],y=lca[y][i]; return lca[x][0];}int query(int x,int y,int fa,int fafa,int k,int l,int r){ if(l==r) return l; int mid=(l+r)>>1; int sum=t[t[x].l].sum+t[t[y].l].sum-t[t[fa].l].sum-t[t[fafa].l].sum; if(k<=sum) return query(t[x].l,t[y].l,t[fa].l,t[fafa].l,k,l,mid); return query(t[x].r,t[y].r,t[fa].r,t[fafa].r,k-sum,mid+1,r);}int main(){ n=gn(),q=gn(); for(int i=1;i<=n;++i) a[i]=gn(),vec.push_back(a[i]); sort(vec.begin(),vec.end()); vec.erase(unique(vec.begin(),vec.end()),vec.end()); for(int i=1;i

非常遗憾的错过了1A的机会...

我还是太弱了...

转载于:https://www.cnblogs.com/enzymii/p/8438860.html

你可能感兴趣的文章
妙用python之编码转换
查看>>
hdu 4451 Dressing 衣服裤子鞋 简单容斥
查看>>
linux一些基本常识(四)
查看>>
Docker架构
查看>>
C#设计模式(3)——工厂方法模式
查看>>
过目不忘JS正则表达式
查看>>
Colidity-- StoneWall
查看>>
Leetcode 904. Fruit Into Baskets
查看>>
怎样连接REDIS服务端
查看>>
No.026:Remove Duplicates from Sorted Array
查看>>
SpringBoot项目的几种创建方式,启动、和访问
查看>>
解决"disabled". Expected Boolean, got Number with value 0
查看>>
OC--init,initialize,initWithCoder:,initWithFrame:各方法的区别和加载顺序
查看>>
Exponentiation
查看>>
本地jar上传到本地仓库
查看>>
四则运算C++带Qt界面版本,吾王镇楼。。。。。
查看>>
安卓7.0手机拍照闪退问题解决
查看>>
ME525+ Defy+ 刷机指南[zz]
查看>>
支持触屏的jQuery轮播图插件
查看>>
差一点搞混了Transactional注解
查看>>