[SDOI2019]世界地图(kruskal重构树+虚树)
通过子任务1、3十分显然,子任务4实际上就是线段树,和我下午写的[SDOI2015]道路修建一模一样,堪称“我抄我自己”,不会的可以先做一下这个题。
然后考虑正解,参考了zhoushuyu的博客,首先可以对前i列做MST,就是把前i-1列和第i列合并起来,而这时候只需要把第1和第i列的点作为关键点建立虚树,虚树边权为原树路径最大值,然后每次O(n)对虚树合并即可。后缀也同样做一遍即可。查询时,就是把整张图分成两半,同样只需要维护前后缀的左右两列建立虚树即可,复杂度O(n(m+q)logn)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=;
struct edge{int u,v,w;};
bool operator<(edge a,edge b){return a.w<b.w;}
int n,m,Q,lim,tot,cnt,d1[N][],d2[N][],fa[N],hd[N],v[N],nxt[N],w[N],vis[N];
ll ans;
unsigned int SA,SB,SC;
vector<edge>G;
struct MST{
int tot;ll sum;
vector<edge>G;
MST(){}
MST(int*c)
{
tot=n,sum=;
for(int i=;i<n;i++)G.push_back((edge){i,i+,c[i]});
}
}pre[N],suf[N];
int getweight()
{
SA^=SA<<,SA^=SA>>,SA^=SA<<;
unsigned int t=SA;
SA=SB,SB=SC,SC^=t^SA;
return SC%lim+;
}
int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
void adde(edge x)
{
v[++cnt]=x.v,nxt[cnt]=hd[x.u],w[cnt]=x.w,hd[x.u]=cnt;
v[++cnt]=x.u,nxt[cnt]=hd[x.v],w[cnt]=x.w,hd[x.v]=cnt;
ans+=x.w;
}
bool dfs1(int u,int f)
{
int ret=;
for(int i=hd[u];i;i=nxt[i])if(v[i]!=f)ret+=dfs1(v[i],u);
vis[u]|=(ret>=),ret+=vis[u];
return ret;
}
void dfs2(int u,int f,int lst,int val)
{
if(vis[u])
{
if(lst)G.push_back((edge){vis[u],lst,val});
lst=vis[u],ans-=val,val=;
}
for(int i=hd[u];i;i=nxt[i])if(v[i]!=f)dfs2(v[i],u,lst,max(val,w[i]));
}
MST merge(MST a,MST b,int*c)
{
G.clear(),tot=a.tot+b.tot;
for(int i=;i<a.G.size();i++)G.push_back(a.G[i]);
for(int i=;i<b.G.size();i++)G.push_back((edge){b.G[i].u+a.tot,b.G[i].v+a.tot,b.G[i].w});
for(int i=;i<=n;i++)G.push_back((edge){a.tot-n+i,a.tot+i,c[i]});
sort(G.begin(),G.end());
for(int i=;i<=tot;i++)fa[i]=i,vis[i]=(i<=n||i>tot-n),hd[i]=;
ans=cnt=;
for(int i=;i<G.size();i++)
{
int u=find(G[i].u),v=find(G[i].v);
if(u!=v)adde(G[i]),fa[u]=v;
}
dfs1(,),cnt=;
for(int i=;i<=tot;i++)if(vis[i])vis[i]=++cnt;
G.clear(),dfs2(,,,);
MST ret;ret.tot=cnt,ret.sum=a.sum+b.sum+ans,ret.G=G;
return ret;
}
ll query(MST a)
{
ll ret=a.sum;
for(int i=;i<a.G.size();i++)ret+=a.G[i].w;
return ret;
}
int main()
{
scanf("%d%d%u%u%u%d",&n,&m,&SA,&SB,&SC,&lim);
for(int i=;i<=n;i++)for(int j=;j<=m;j++)d1[j][i]=getweight();
for(int i=;i<n;i++)for(int j=;j<=m;j++)d2[j][i]=getweight();
pre[]=MST(d2[]),suf[m]=MST(d2[m]);
for(int i=;i<m;i++)pre[i]=merge(pre[i-],MST(d2[i]),d1[i-]);
for(int i=m-;i>;i--)suf[i]=merge(MST(d2[i]),suf[i+],d1[i]);
scanf("%d",&Q);
while(Q--)
{
int l,r;scanf("%d%d",&l,&r);
printf("%lld\n",query(merge(suf[r+],pre[l-],d1[m])));
}
}
[SDOI2019]世界地图(kruskal重构树+虚树)的更多相关文章
- isaster(Comet OJ - Contest #11D题+kruskal重构树+线段树+倍增)
目录 题目链接 思路 代码 题目链接 传送门 思路 \(kruskal\)重构树\(+\)线段树\(+\)倍增 代码 #include <set> #include <map> ...
- luoguP4197:Peaks(Kruskal重构树+主席树)或者(点分树+离线)
题意:有N座山,M条道路.山有山高,路有困难值(即点权和边权).现在Q次询问,每次给出(v,p),让求从v出发,只能结果边权<=p的边,问能够到达的山中,第K高的高度(从大到小排序). 思路:显 ...
- 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1202 Solved: 321[Submit][Sta ...
- UOJ#407. 【IOI2018】狼人 Kruskal,kruskal重构树,主席树
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ407.html 题解 套路啊. 先按照两个节点顺序各搞一个kruskal重构树,然后问题转化成两棵krus ...
- LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)
LOJ 洛谷 这题不就是Peaks(加强版)或者归程么..这算是\(IOI2018\)撞上\(NOI2018\)的题了? \(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入 ...
- BZOJ3545&3551[ONTAK2010]Peaks——kruskal重构树+主席树+dfs序+树上倍增
题目描述 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问,每组询问询问从点v开始只 ...
- luogu4197 Peaks (kruskal重构树+主席树)
按照边权排序建出kruskal重构树,每次就变成了先找一个权值<=x的最远的祖先,然后看这个子树的第k小.离散化一下,在dfs序上做主席树即可 而且只需要建叶节点的主席树 注意输出的是第k小点的 ...
- 洛谷P4197 Peaks(Kruskal重构树 主席树)
题意 题目链接 往后中文题就不翻译了qwq Sol 又是码农题..出题人这是强行把Kruskal重构树和主席树拼一块了啊.. 首先由于给出的限制条件是<=x,因此我们在最小生成树上走一定是最优的 ...
- [BZOJ3551][ONTAK2010]Peaks(加强版)(Kruskal重构树,主席树)
3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2438 Solved: 763[Submit][ ...
随机推荐
- HDU _2546 01背包问题
A - 饭卡 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- DevOps专题|玩转Kubernetes网络
Kubernetes无疑是当前最火热的容器编排工具,网络是kubernetes中非常重要的一环, 本文主要介绍一些相应的网络原理及术语,以及kubernetes中的网络方案和对比. Kubernete ...
- 吴裕雄--天生自然 PHP开发学习:数据类型
<?php $x = "Hello world!"; echo $x; echo "<br>"; $x = 'Hello world!'; e ...
- 2020/2/1 PHP代码审计之变量覆盖漏洞
0x00 变量覆盖简介 变量覆盖是指变量未被初始化,我们自定义的参数值可以替换程序原有的变量值. 0x01 漏洞危害 通常结合程序的其他漏洞实现完整的攻击,比如文件上传页面,覆盖掉原来白名单的列表,导 ...
- POJ 1159:Palindrome 最长公共子序列
Palindrome Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 56273 Accepted: 19455 Desc ...
- unix中嘚vim编辑器
在linux家族中,vim编辑器是系统自带的文本编辑器,其功能强大自不必说了. 偶有小白,刚接触linux,要修改某个文本文件,不可能像WINDOWS那样操作,更有甚者,进入VI编辑器后,无法退出以致 ...
- JSP编码问题解决方法
最近再看JSP相关知识,被中文乱码搞的很头大.找了好多方法终于找到了一个简单可行的方案. JSP中request和response操作默认编码为"ISO-8859-1",这是中文乱 ...
- HTML5 可缩放矢量图形(1)—SVG基础
参考文档1 SVG基础 SVG介绍 概念:SVG 是使用 XML 来描述二维图形和绘图程序的语言.(理解就是一个在网页上使用笔画图的过程) 什么是SVG SVG 指可伸缩矢量图形 (Scalable ...
- CAR-T|Single cell plan|Extracellular RNA|
生物医疗大数据 安吉丽娜朱莉发现抑癌基因事件,BRCA突变与乳腺癌关联. 个体化测序商品23 and me 多组学数据研究:eg:太空和地球双胞胎发现生化指标差不多. 研究模式和工业模式相结合. 研究 ...
- 用Emoji和照片挑战大众点评,YOBO玩转新点评方式能引领潮流吗?
对于一家企业来说,要想获得长久生命力的必备元素是什么?是技术底蕴和海量资金?但诺基亚.摩托罗拉和黑莓等巨头的崩塌,已经证明再稳固的基础都有可能只是沙子做的.是让人工智能.云计算.大数据等前沿技术赋能于 ...