正题

题目链接:https://www.luogu.org/problem/P4764


题目大意

给出一张图,若干个询问,每个询问求只使用权值在[L,R][L,R][L,R]这个范围内的边组成的最小生成树权值和,强制在线。


解题思路

我们先考虑LLL固定,这时我们发现我们可以从LLL开始往右做最小生成树,若一条边可以产生贡献值就为该边权值,否则权值为0,然后我们在线段树上修改查询即可。

但是现在LLL端点固定,我们考虑从大到小加边,我们加入一条更小的边(x,y,w)(x,y,w)(x,y,w),若x,yx,yx,y不联通就直接加入,若联通就选取x,yx,yx,y路径上权值最大的一条边删去即可,这个我们用LCTLCTLCT可以O(log⁡n)O(\log n)O(logn)维护。

然后因为强制在线所以我们可以用主席树储存答案。

LCTLCTLCT维护最小生成树,我们可以将一条边拆成两个点和一条边,然后路径查询即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
const int N=200010,M=3600010;
int T,n,m,q,ans,from[N],sum[N],val[N],fa[N],root[N];
struct Line_Cut_Tree{#define ls son[x][0]#define rs son[x][1]int son[N][2],fa[N];bool r[N];stack<int> s;bool Nroot(int x){return fa[x]&&(son[fa[x]][0]==x||son[fa[x]][1]==x);}void PushUp(int x){sum[x]=val[x];from[x]=x;if(son[x][0]&&sum[ls]>sum[x]) sum[x]=sum[ls],from[x]=from[ls];if(son[x][1]&&sum[rs]>sum[x]) sum[x]=sum[rs],from[x]=from[rs];return;}void PushR(int x){swap(ls,rs);r[x]^=1;return;}void PushDown(int x){if(r[x])PushR(ls),PushR(rs),r[x]^=1;return;}void Rotate(int x){int y=fa[x],z=fa[y],k=(son[y][1]==x),w=son[x][!k];if(Nroot(y)) son[z][son[z][1]==y]=x;son[x][!k]=y;son[y][k]=w;if(w) fa[w]=y;fa[y]=x;fa[x]=z;PushUp(y);return;}void Splay(int x){int y=x,z=0;s.push(x);while(Nroot(s.top())) s.push(fa[s.top()]);while(!s.empty()) PushDown(s.top()),s.pop();while(Nroot(x)){y=fa[x];z=fa[y];if(Nroot(y))Rotate((son[y][0]==x)^(son[z][0]==y)?x:y);Rotate(x);}PushUp(x);return;}void Access(int x){for(int y=0;x;x=fa[y=x])Splay(x),rs=y,PushUp(x);return;}void MakeRoot(int x){Access(x);Splay(x);PushR(x);return;}int Split(int x,int y){MakeRoot(x);Access(y);Splay(y);return from[y];}void Link(int x,int y){MakeRoot(x);fa[x]=y;Access(x);return;}void Cut(int x,int y){MakeRoot(x);Access(y);Splay(y);fa[son[y][0]]=0;son[y][0]=0;PushUp(y);return;}void Clean(){memset(son,0,sizeof(son));memset(fa,0,sizeof(fa));memset(r,0,sizeof(r));}#undef ls#undef rs
}LCT;
struct Keep_Seq_Tree{int w[M],lson[M],rson[M],cnt;int Insert(int y,int L,int R,int pos,int val){int x=++cnt;w[x]=w[y]+val;lson[x]=lson[y];rson[x]=rson[y];if(L==R) return x;int mid=(L+R)>>1;if(pos<=mid) lson[x]=Insert(lson[y],L,mid,pos,val);else rson[x]=Insert(rson[y],mid+1,R,pos,val);return x;}int Query(int x,int L,int R,int l,int r){if(!x) return 0;if(L>R) return 0;if(L==l&&R==r) return w[x];int mid=(L+R)>>1;if(r<=mid) return Query(lson[x],L,mid,l,r);if(l>mid) return Query(rson[x],mid+1,R,l,r);return Query(lson[x],L,mid,l,mid)+Query(rson[x],mid+1,R,mid+1,r);}
}Tree;
struct Enode{int x,y,w;
}a[N];
int Find(int x)
{return fa[x]==x?x:fa[x]=Find(fa[x]);}
bool cmp(Enode x,Enode y)
{return x.w>y.w;}
int get_idx(int x)
{int l=1,r=m;while(l<=r){int mid=(l+r)>>1;if(a[mid].w>=x) l=mid+1;else r=mid-1;}return min(r,m);
}
int get_idy(int x)
{int l=1,r=m;while(l<=r){int mid=(l+r)>>1;if(a[mid].w>x) l=mid+1;else r=mid-1;}return min(l,m);
}
int main()
{scanf("%d",&T);while(T--){LCT.Clean();Tree.cnt=0;ans=0;memset(val,0,sizeof(val));memset(sum,0,sizeof(sum));memset(from,0,sizeof(from));scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) fa[i]=i;for(int i=1;i<=m;i++)scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);sort(a+1,a+1+m,cmp);for(int i=1;i<=m;i++)val[i+n]=sum[i+n]=a[i].w,from[i+n]=i+n;for(int i=1;i<=m;i++){root[i]=root[i-1];if(Find(a[i].x)==Find(a[i].y)){int p=LCT.Split(a[i].x,a[i].y);LCT.Cut(p,a[p-n].x);LCT.Cut(p,a[p-n].y);root[i]=Tree.Insert(root[i],1,m,p-n,-a[p-n].w);}else fa[fa[a[i].x]]=fa[a[i].y];LCT.Link(a[i].x,i+n);LCT.Link(a[i].y,i+n);root[i]=Tree.Insert(root[i],1,m,i,a[i].w);}scanf("%d",&q);while(q--){int x,y,idx,idy;scanf("%d%d",&x,&y);x-=ans;y-=ans;idx=get_idx(x);idy=get_idy(y);ans=Tree.Query(root[idx],1,m,idy,m);printf("%d\n",ans);}}
}

P4764-[CERC2014]Pork barrel【主席树,LCT,最小生成树】相关推荐

  1. 【BZOJ3514】Codechef MARCH14 GERALD07加强版,LCT+主席树

    Time:2016.08.06 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 今天模拟题T3 结果是看都没看?? n,m<=1000 每次直接暴力并查集,O(n)判断 复杂度 ...

  2. bzoj3514(LCT+主席树)

    题目描述 N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. 题解 对于一个截止时间来说,越晚的变越好. 所以我们可以维护一颗以边的序号为关键字的最大生成树,然后用主席树维 ...

  3. BZOJ3514:GERALD07加强版(LCT,主席树)

    Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密. 接下来 ...

  4. 【洛谷P5385】须臾幻境/【BZOJ3514】Codechef MARCH14 GERALD07加强版【LCT】【主席树】

    题意:有nnn个点mmm条边,qqq次询问连接区间[L,R][L,R][L,R]中的边后的连通块个数.强制在线. n,m,q≤2×105n,m,q\leq 2\times10^5n,m,q≤2×105 ...

  5. [Cnoi2019]须臾幻境(LCT维护最大生成树+主席树/分块)

    文章目录 title solution code title solution 一棵nnn个点的树有n−1n-1n−1条边. 一般的,对于森林而言则有点数-边数=树的个数 那么我们将无向图随便生成一个 ...

  6. 【BZOJ3514】Codechef MARCH14 GERALD07加强版 LCT+主席树

    [BZOJ3514]Codechef MARCH14 GERALD07加强版 Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行 ...

  7. BZOJ3514 Codechef MARCH14 GERALD07加强版 LCT维护最大生成树 主席树

    题面 考虑没有询问,直接给你一个图问联通块怎么做. 并查集是吧. 现在想要动态地做,那么应该要用LCT. 考虑新加进来一条边,想要让它能够减少一个联通块的条件就是现在边的两个端点还没有联通. 如果联通 ...

  8. 【luogu P4899】werewolf 狼人(最小生成树)(主席树)

    werewolf 狼人 题目链接:luogu P4899 题目大意 给你一个无向图,然后每次要从一个地方走到另外一个地方. 然后你在走的过程中要在一个点转换形态,转换之前你只能走大于等于 L 的点,转 ...

  9. BZOJ 3514 Codechef MARCH14 GERALD07 加强版 LCT+主席树

    题意: N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. 分析: 据说有dalao会离线做这题? 看到L和R就能想到主席树?dalao们太强了-- 如果我们给出n个点,m ...

最新文章

  1. Openstack在dashboard界面登录提示无效证书
  2. ElasticSearch插件安装
  3. 调用toString()方法的注意事项
  4. 的引用_懵!啥是Java软引用、弱引用、虚引用?
  5. 第38章:MongoDB-集群--Replica Sets(副本集)---多机的搭建
  6. Unity中提升像素字体清晰度
  7. 白板机器学习笔记 P9-P12线性回归
  8. Android--SharedPreferences数据存储方案
  9. (转)c# Invoke和BeginInvoke区别
  10. On iPad, UIImagePickerController must be presented via UIPopoverController
  11. [渝粤教育] 沈阳理工大学 电子商务基础与应用 参考 资料
  12. 鸿蒙系统可以微信吗,微信鸿蒙版下载-微信华为鸿蒙操作系统版 v7.0.21-91优手机网...
  13. audio音频不能自动播放的解决方法
  14. 学习android开发的网站
  15. 青椒跳槽三线高校后,副教授变教授、140平房子到手、老婆入编...
  16. win10去除桌面快捷方式小箭头
  17. 道通科技自动化测试面试
  18. 刚刚大学毕业,自己搭网站遇到的问题 一:tomcat中同时部署两个项目的问题
  19. python画图入门例子
  20. 【网络安全】MS17-010“永恒之蓝”漏洞的利用

热门文章

  1. php读取excel函数,PHP读取Excel函数Spreadsheet_Excel_Reader
  2. 蜗杆参数法设计_技术贴 | 减速器结构及设计的注意事项
  3. c语言 随时启停程序 按钮,单片机C语言控制单按钮启停程序(高手请进)
  4. mfc从mysql中读取数据类型_在MFC中使用SQlite数据库读取数据
  5. linux truncate文件,linux系统编程:用truncate调整文件大小
  6. html 保存文件指定路径,78.上传文件及在服务器保存文件到任意路径
  7. pearson相关系数_Pearson(皮尔逊)相关系数
  8. java使用教程——组件及事件处理——菜单(添加图标)
  9. 算法设计与分析——贪心算法——活动安排问题
  10. Java当中用 javabean和其他容器存入表格数据 或 利用 容器进行存储表格