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

正题

题目链接: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);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 枚举特性 FlagAttribute 的应用

写在前面枚举Enum 全称(Enumeration)&#xff0c;即一种由一组称为枚举数列表的命名常量组成的独特类型。可以看出枚举的出现是为了使我们可以在程序中方便的使用一些特定值的常量&#xff0c;一般的使用大家都比较熟悉&#xff0c;本文主要介绍枚举的特性 FlagAttribute。Flag…

jzoj2908,P1527-[集训队互测 2012]矩阵乘法【整体二分,二维树状数组】

正题 题目链接:https://www.luogu.org/problem/P1527 题目大意 给出一个矩阵&#xff0c;每个询问求子矩阵中的第kkk小数。 解题思路 我们发现我们对于每个询问我们可以二分答案&#xff0c;然后查找该子矩阵中有多少个数≤mid\leq mid≤mid来判断。 但是这样时间复杂度和空…

重温.NET下Assembly的加载过程

最近在工作中牵涉到了.NET下的一个古老的问题&#xff1a;Assembly的加载过程。虽然网上有很多文章介绍这部分内容&#xff0c;很多文章也是很久以前就已经出现了&#xff0c;但阅读之后发现&#xff0c;并没能解决我的问题&#xff0c;有些点写的不是特别详细&#xff0c;让人…

jzoj3410-[GDOI2014模拟]Tree【最小生成树,贪心】

正题 题目大意 在一张图中选择一颗生成树使得边权的方差最小。 解题思路 我们很容易想到一种贪心&#xff0c;那就是在按照边权排好序后选择一段连续的区间然后使用这段区间构成最小生成树&#xff0c;这样时间复杂度是O(m3log⁡m)O(m^3\log m)O(m3logm)&#xff0c;时间复杂…

看eShopOnContainers学一个EventBus

最近在看微软eShopOnContainers 项目&#xff0c;看到事件总线觉得不错&#xff0c;和大家分享一下看完此文你将获得什么&#xff1f;eShop中是如何设计事件总线的实现一个InMemory事件总线eShop中是没有InMemory实现的&#xff0c;这算是一个小小小的挑战发布订阅模式发布订阅…

jzoj3682-Points and Segments【模型转化,欧拉回路】

正题 题目大意 给出若干个区间&#xff0c;然后给每个区间涂颜色(蓝或红)&#xff0c;求一种方案使得每个点的颜色数量差不超过111。 解题思路 我们可以从每个lll向rrr连一条双向边&#xff0c;若此时我们可以跑出欧拉回路&#xff0c;那么这就满足颜色差为0(从l∼rl\sim rl∼…

常用解题算法总结

一、四大基本算法 分治法 动态规划&#xff08;一次买卖股票、多次买卖股票、最大连续子序列和、最大连续子序列积、最长公共子序列&#xff09; 贪心算法 穷举法 二、常用便捷算法 异或法&#xff08;单次偶次数、顺序单次偶次数&#xff09; 位运算&#xff08;单次k次…

创建基于MailKit和MimeKit的.NET基础邮件服务

邮件服务是一般的系统都会拥有和需要的功能&#xff0c;但是对于.NET项目来说&#xff0c;邮件服务的创建和使用会较为的麻烦。.NET对于邮件功能提供了System.Net.Mail用于创建邮件服务&#xff0c;该基础服务提供邮件的基础操作&#xff0c;并且使用也较为的简单。对于真正将该…

欢乐纪中A组赛【2019.8.23】

前言 我好菜 成绩 %%%TRXdalao\%\%\% TRXdalao%%%TRXdalao RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC888(H−2)TRX(H-2)TRX(H−2)TRX120120120202020100100100000121212(H−2)HJW(H-2)HJW(H−2)HJW100100100100100100000000181818(J−3)XXY(J-3)XXY(J−3)XXY80…

Java JVM总结

一、jvm参数 1&#xff09;内存 -Xms -Xmx -Xss -Xloggc:file -Xprof -XX:DisabledExplicitGC -XX:PreBlockSpin -XX:CompileThreshold 2&#xff09;Parallel -XX:SurvivorRatio -XX:PreTenureSizeThreshold -XX:MaxTenuringThreshold -XX:ParallelGCThreads -XX:Us…

EF Core下利用Mysql进行数据存储在并发访问下的数据同步问题

小故事在开始讲这篇文章之前&#xff0c;我们来说一个小故事&#xff0c;纯素虚构&#xff08;真实的存钱逻辑并非如此&#xff09;小刘发工资后&#xff0c;赶忙拿着现金去银行&#xff0c;准备把钱存起来&#xff0c;而与此同时&#xff0c;小刘的老婆刘嫂知道小刘的品性&…

牛客练习赛50-记录

正题 比赛链接:https://ac.nowcoder.com/acm/contest/1080#question 成绩 本届 升高二届 总结 以后还是不要写太多自己不擅长的写法&#xff0c;空间要多检查&#xff0c;不要像个傻逼一样啥都写错。 尽量不要为了省一点空间和时间写一些不舒服的东西&#xff0c;尽量在能…

物联网框架ServerSuperIO在.NetCore实现跨平台的实践路线

正所谓天下大势&#xff0c;不跟风不行。你不跨平台&#xff0c;很low嘛。java说&#xff1a;你们能跨嘛&#xff0c;跨给我看看。C#说&#xff1a;不要强人所难嘛。java说&#xff1a;能部署在云上吗&#xff1f;docker&#xff1f;微服务&#xff1f;C#说&#xff1a;不要强人…

Spring Aop总结

一、什么是AOP 面向方面的编程&#xff08;AOP&#xff09;是一种编程技术&#xff0c;是面向对象编程的补充&#xff0c;它也提供了模块化。 在面向对象编程中&#xff0c;关键的单元是对象&#xff0c;AOP的关键单元是切面&#xff0c;或者说关注点。一些切面可能有集中的代…

P3750-[六省联考2017]分手是祝愿【期望dp】

正题 题目链接:https://www.luogu.org/problem/P3750 题目大意 nnn盏灯和按钮&#xff0c;每次随机选择一个xxx按下后会让xxx的倍数的灯都取反&#xff0c;然后若最少kkk步就可以将所有灯关闭那么直接选择最优策略&#xff0c;求关闭所有灯的期望次数。 解题思路 做期望dpdpd…

使用WebApiClient请求和管理Restful Api

前言本篇文章的内容是WebApiClient应用说明篇&#xff0c;如果你没有了解过WebApiClient&#xff0c;可以先阅读以下相关文章&#xff1a;WebApi client 的面向切面编程我来给.Net设计一款HttpClient.Net45下HttpClient的几个缺陷.net的retrofit--WebApiClient库.net的retrofit…

Spring MVC总结

一、Spring MVC &#xff08;1&#xff09;介绍 Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架。 通过把Model&#xff0c;View&#xff0c;Controller分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂的web应用分成逻辑清晰的几部分&…

拥抱.NET Core系列:MemoryCache 缓存选项

MSCache项目MSCache 目前最新的正式版是 2.0.0&#xff0c;预览版是2.1.0&#xff0c;会与 .NETCore 2.1 一起发布。本篇用了2.0.0版本开源在 GitHub 上&#xff0c;仓库地址是&#xff1a;https://github.com/aspnet/CachingNuGet地址为&#xff1a;https://www.nuget.org/pac…

牛客练习赛51-记录

正题 比赛链接:https://ac.nowcoder.com/acm/contest/1083#question 成绩 可怜的zycT3zycT3zycT3被n0n0n0卡了半天&#xff0c;这里感谢一下排雷 总结 比赛状态较好&#xff0c;后面没有T6T6T6的题解 T1:abcT1:abcT1:abc 题目大意 给出一个字符串&#xff0c;求有多少个abc…

SpringBoot总结

一、SpringBoot &#xff08;1&#xff09;简介 SpringFramework&#xff1a;最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转。使用 DI 或者是 IOC 的时候&#xff0c;可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行。 Spring MVC&…