听说正解点分树?我不会就对了

此题是 \([LNOI2014]LCA\) 强化版,也是差分一下,转化为区间加区间和

不过权值有大小要求,那么我们按照权值排序,依次加入主席树,询问的时候 \(lower\_bound\) 一下找到区间 \([l,r]\)

在主席树上实现区间加,肯定要标记永久化。每次最多修改 \(2\lfloor \log^n\rfloor\) 个区间,所以一次最多会开出 \(4\lfloor \log^n\rfloor-1\) 个结点,空间复杂度理论上是 \(O(4n\log^2n)\),时间复杂度 \(O(n\log^2 n)\)

但是神奇的是,在 \(n\leq 150000\) 的时候,我空间只开了 \(100\) 倍就过了(雾

\(Code\ Below:\)

#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define mp make_pair
#define F first
#define S second
using namespace std;
const int maxn=150000+10;
const int inf=0x3f3f3f3f;
int n,q,A,val[maxn],head[maxn],tot;pii a[maxn];
int dep[maxn],top[maxn],siz[maxn],son[maxn],fa[maxn],id[maxn],tim;
int T[maxn],L[maxn*100],R[maxn*100],cnt;ll dis[maxn],sumE[maxn],sumdis[maxn],sum[maxn*100],lazy[maxn*100];struct node{int to,next,val;
}e[maxn<<1];inline int read(){register int x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return (f==1)?x:-x;
}inline void addedge(int x,int y,int w){e[++tot].to=y;e[tot].val=w;e[tot].next=head[x];head[x]=tot;
}void dfs1(int x,int f){siz[x]=1;fa[x]=f;dep[x]=dep[f]+1;int maxson=-1;for(int i=head[x],y;i;i=e[i].next){y=e[i].to;if(y==f) continue;val[y]=e[i].val;dis[y]=dis[x]+e[i].val;dfs1(y,x);siz[x]+=siz[y];if(siz[y]>maxson){maxson=siz[y];son[x]=y;}}
}void dfs2(int x,int topf){id[x]=++tim;sumE[tim]=val[x];top[x]=topf;if(son[x]) dfs2(son[x],topf);for(int i=head[x],y;i;i=e[i].next){y=e[i].to;if(y==fa[x]||y==son[x]) continue;dfs2(y,y);}
}void update(int &now,int pre,int Le,int Ri,int l,int r){now=++cnt;L[now]=L[pre];R[now]=R[pre];lazy[now]=lazy[pre];sum[now]=sum[pre]+(sumE[min(Ri,r)]-sumE[max(Le,l)-1]);if(Le <= l && r <= Ri){lazy[now]++;return ;}int mid=(l+r)>>1;if(Le <= mid) update(L[now],L[pre],Le,Ri,l,mid);if(Ri > mid) update(R[now],R[pre],Le,Ri,mid+1,r);
}ll query(int u,int v,int Le,int Ri,int l,int r){if(Le <= l && r <= Ri) return sum[v]-sum[u];int mid=(l+r)>>1;ll ans=(lazy[v]-lazy[u])*(sumE[min(Ri,r)]-sumE[max(Le,l)-1]);if(Le <= mid) ans+=query(L[u],L[v],Le,Ri,l,mid);if(Ri > mid) ans+=query(R[u],R[v],Le,Ri,mid+1,r);return ans;
}inline void modify(int i,int x){T[i]=T[i-1];while(top[x]!=1){update(T[i],T[i],id[top[x]],id[x],1,n);x=fa[top[x]];}update(T[i],T[i],1,id[x],1,n);
}inline ll ask(int u,int v,int x){ll ans=0;while(top[x]!=1){ans+=query(T[u],T[v],id[top[x]],id[x],1,n);x=fa[top[x]];}ans+=query(T[u],T[v],1,id[x],1,n);return ans;
}int main()
{n=read(),q=read(),A=read();int x,y,w;for(int i=1;i<=n;i++) a[i]=mp(read(),i);for(int i=1;i<n;i++){x=read(),y=read(),w=read();addedge(x,y,w);addedge(y,x,w);}dfs1(1,0);dfs2(1,1);sort(a+1,a+n+1);for(int i=1;i<=n;i++) sumE[i]+=sumE[i-1],sumdis[i]=sumdis[i-1]+dis[a[i].S];for(int i=1;i<=n;i++) modify(i,a[i].S);int u,l,r;ll lastans=0;while(q--){u=read(),l=read(),r=read();x=(l+lastans)%A;y=(r+lastans)%A;if(x>y) swap(x,y);l=lower_bound(a+1,a+n+1,mp(x,0))-a;r=upper_bound(a+1,a+n+1,mp(y,inf))-a-1;printf("%lld\n",lastans=dis[u]*(r-l+1)+(sumdis[r]-sumdis[l-1])-2*ask(l-1,r,u));lastans%=A;}return 0;
}

转载于:https://www.cnblogs.com/owencodeisking/p/10225992.html

[HNOI2015]开店(树剖+主席树+标记永久化)相关推荐

  1. 洛谷P4216 [SCOI2015]情报传递(树剖+主席树)

    传送门 我们可以进行离线处理,把每一个情报员的权值设为它开始收集情报的时间 那么设询问的时间为$t$,就是问路径上有多少个情报员的权值小于等于$t-c-1$ 这个只要用主席树上树就可以解决了,顺便用树 ...

  2. BZOJ3531-[Sdoi2014]旅行(树剖+线段树动态开点)

    传送门 完了今天才知道原来线段树的动态开点和主席树是不一样的啊 我们先考虑没有宗教信仰的限制,那么就是一个很明显的树剖+线段树,路径查询最大值以及路径和 然后有了宗教信仰的限制该怎么做呢? 先考虑暴力 ...

  3. 学习笔记:可持久化线段树(主席树):静态 + 动态

    学习笔记:可持久化线段树(主席树):静态 + 动态 前置知识: 线段树.线段树分享可以看:@秦淮岸.@ZYzzz.@妄想の岚がそこに 树状数组.\(BIT\)分享可以看:@T-Sherlock.Chi ...

  4. 可持久化线段树(主席树)【舰娘系列】【自编题】

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60083619 向大(hei)佬(e)势力学(di ...

  5. BZOJ 4817: [Sdoi2017]树点涂色(LCT+树剖+线段树)

    题目描述 Bob有一棵 nn 个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. Bob ...

  6. BZOJ4034 树上操作(树剖 线段树大模板)

    BZOJ4034 long long 是大坑点 貌似long long 跟int 乘起来会搞事情?... A了这题线段树和树剖的基础OK 嘛 重点过掉的还是线段树区间更新的lazy tag吧 #inc ...

  7. 【bzoj3524】【Poi2014】【Couriers】可持久化线段树(主席树)水题

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62485671 向大(hei)佬(e)势力学(di ...

  8. 树剖+线段树||树链剖分||BZOJ1984||Luogu4315||月下“毛景树”

    题面:月下"毛景树" 题解:是道很裸的树剖,但处理的细节有点多(其实是自己线段树没学好).用一个Dfs把边权下移到点权,用E数组记录哪些边被用到了:前三个更新的操作都可以合并起来, ...

  9. 【洛谷】P3919 【模板】可持久化线段树(主席树)

    题目 传送门:QWQ 分析 主席树的模板,囤着 代码 #include <bits/stdc++.h> using namespace std; const int N=1000010; ...

最新文章

  1. 谷歌大改Transformer注意力,速度、内存利用率都提上去了
  2. PowerDesigner打开设计文件后提示failed to read the fileXXX的解决办法
  3. SQL Server 2014 内存优化表(1)实现内存优化表
  4. Xamarin图表开发基础教程(7)OxyPlot框架
  5. 【驱动笔记9】初探IRP
  6. 使用puppeteer爬 EXTJS
  7. mysql空密码php_WAMP中如何修改mysql默认空密码_MySQL
  8. JavaScript之match()方法讲解
  9. DCMTK:DIMSE_dumpMessage()的测试程序
  10. noip2012-day2-t2
  11. php 中 t怎么打开,怎么在PHP项目中实现一个explort() 功能
  12. 【POJ - 2909 】Goldbach's Conjecture (哥德巴赫猜想,数论,知识点结论)
  13. 不能用了 重装系统git_怎么用光盘重装系统?
  14. html5获取城市,HTML5 geolocation API获得用户当前城市名
  15. java abstract类和abstract方法
  16. JQuery动态循环绑定事件
  17. C与C++关于*与的传参解析
  18. MVC和MTV初步认识+django的一个简单应用(萌新交流互动,欢迎大家指出错误)
  19. 不用U盘从linux重装win系统,不用U盘和光盘安装win7旗舰版系统
  20. 【文献阅读】机器学习中的超参数窃取Stealing Hyperparameters in Machine Learning

热门文章

  1. 网络传输---HttpURLConnection
  2. nginx配置和安装
  3. iOS 开发 申请定位
  4. Ant构建与部署Java项目---入门
  5. 【语法】NSMutableArray可变数组
  6. 奇妙的算法(2)—— 求平方根
  7. 《Web Load Testing For Dummie》读书笔记
  8. squid日志中关键字的含义
  9. 某化工学院安装锐捷elog
  10. Hotmail怎么进不去?!