CF464E The Classic Problem(线段树 最短路)

CF464E The Classic Problem

\(\bigstar\texttt{Hint}\):发现没有什么好的突破口?为什么不想想怎样才能实现题目中 \(2^x\) 的加减法呢?

可见每次加减法,我们要做的是将添加的 \(1\) 和右边的连续的 \(1\) 合并为一整段,可以用线段树 \(\mathcal{O(\log n)}\) 实现。

怎样比较大小呢?考虑如何找到两个串第一个不同的位置,则我们需要的就是二分区间、比较这两段区间是否相同。用一个 Hash 即可。

然后就成为了屎题

#define Maxn 100005
#define Maxm 1800005
#define mod 1000000007
int n,m,s,t,tot,MAX,tp,All;
int uu[Maxn],vv[Maxn],dd[Maxn],Pow2[Maxm];
int hea[Maxn],nex[Maxn<<1],ver[Maxn<<1],edg[Maxn<<1];
int pre[Maxn],sta[Maxn];
bool vis[Maxn];
inline void add(int x,int y,int d){ ver[++tot]=y,nex[tot]=hea[x],hea[x]=tot,edg[tot]=d; }
struct TREE
{int Hash,ls,rs,rmost,laz; // pushdown !!!!TREE(int H=0,int Ls=0,int Rs=0,int Rmost=-1,int Laz=-1):Hash(H),ls(Ls),rs(Rs),rmost(Rmost),laz(Laz){}inline void Push(int x,int nl,int nr){if(x==0) Hash=0,rmost=nr,laz=x;else Hash=(Pow2[nr-nl+1]-1+mod)%mod,rmost=-1,laz=x;}
}tree[Maxm<<4];
inline void pushdown(int p,int nl,int nr)
{if(tree[p].laz!=-1){int mid=(nl+nr)>>1;tree[p].ls=++All,tree[tree[p].ls].Push(tree[p].laz,nl,mid);tree[p].rs=++All,tree[tree[p].rs].Push(tree[p].laz,mid+1,nr);tree[p].laz=-1;}
}
inline void pushup(int p,int nl,int nr)
{int lson=tree[p].ls,rson=tree[p].rs,mid=(nl+nr)>>1;tree[p].Hash=(1ll*tree[lson].Hash*Pow2[nr-mid]%mod+tree[rson].Hash)%mod;tree[p].rmost=max(tree[lson].rmost,tree[rson].rmost);
}
bool Comp(int pl,int pr,int nl,int nr)
{if(nl==nr) return tree[pl].Hash<tree[pr].Hash;pushdown(pl,nl,nr),pushdown(pr,nl,nr);int mid=(nl+nr)>>1;if(tree[tree[pl].ls].Hash!=tree[tree[pr].ls].Hash)return Comp(tree[pl].ls,tree[pr].ls,nl,mid);else return Comp(tree[pl].rs,tree[pr].rs,mid+1,nr);
}
int Find(int p,int nl,int nr,int l,int r)
{if(nl>=l && nr<=r) return tree[p].rmost;pushdown(p,nl,nr);int mid=(nl+nr)>>1,ret=-inf;if(mid>=l) ret=max(ret,Find(tree[p].ls,nl,mid,l,r));if(mid<r) ret=max(ret,Find(tree[p].rs,mid+1,nr,l,r));return ret;
}
bool Check0(int p,int nl,int nr,int x)
{if(nl==nr) return tree[p].Hash==0;pushdown(p,nl,nr);int mid=(nl+nr)>>1;if(mid>=x) return Check0(tree[p].ls,nl,mid,x);return Check0(tree[p].rs,mid+1,nr,x);
}
void change(int pl,int pr,int nl,int nr,int l,int r,int x)
{if(nl>=l && nr<=r) { tree[pr].Push(x,nl,nr); return; }pushdown(pl,nl,nr);tree[pr]=tree[pl];int mid=(nl+nr)>>1;if(mid>=l)tree[pr].ls=++All,tree[All]=tree[tree[pl].ls],change(tree[pl].ls,tree[pr].ls,nl,mid,l,r,x);if(mid<r)tree[pr].rs=++All,tree[All]=tree[tree[pl].rs],change(tree[pl].rs,tree[pr].rs,mid+1,nr,l,r,x);pushup(pr,nl,nr);
}
struct NODE
{int num,dist_rt;NODE(int N=0,int D=0):num(N),dist_rt(D){}bool friend operator < (NODE x,NODE y){ return Comp(y.dist_rt,x.dist_rt,1,MAX); }int friend operator + (NODE p,int x){int n2=++All;if(Check0(p.dist_rt,1,MAX,x)) change(p.dist_rt,n2,1,MAX,x,x,1);else{int pos=Find(p.dist_rt,1,MAX,1,x),n1=++All;change(p.dist_rt,n1,1,MAX,pos+1,x,0);change(n1,n2,1,MAX,pos,pos,1);}return n2;}
}ds[Maxn];
inline void Short_path()
{priority_queue<NODE> q;ds[s]=NODE(s,1);for(int i=1;i<=n;i++) if(i!=s) ds[i]=NODE(i,2);q.emplace(s,0);while(!q.empty()){NODE cur=q.top(); q.pop();int Now=cur.num;if(vis[Now]) continue;vis[Now]=true;for(int i=hea[Now];i;i=nex[i]){NODE tmp=NODE(ver[i],ds[Now]+edg[i]);if(ds[ver[i]]<tmp)ds[ver[i]]=tmp,pre[ver[i]]=Now,q.push(ds[ver[i]]);}}
}
int main()
{n=rd(),m=rd(),All=2;for(int i=1;i<=m;i++) uu[i]=rd(),vv[i]=rd(),dd[i]=rd(),MAX=max(MAX,dd[i]);MAX=MAX*log2(n)+1000;for(int i=1;i<=m;i++)add(uu[i],vv[i],MAX-dd[i]),add(vv[i],uu[i],MAX-dd[i]);s=rd(),t=rd(),Pow2[0]=1;for(int i=1;i<=MAX;i++) Pow2[i]=Pow2[i-1]*2%mod;if(s==t) { printf("0\n1\n%d\n",s); return 0; }memset(pre,-1,sizeof(pre));tree[1].Push(0,1,MAX);tree[2].Push(1,1,MAX);Short_path();if(pre[t]==-1) printf("-1\n");else{sta[++tp]=t;for(int x=pre[t];x!=-1;x=pre[x]) sta[++tp]=x;printf("%d\n%d\n",tree[ds[t].dist_rt].Hash,tp);for(int i=tp;i>=1;i--) printf("%d ",sta[i]);printf("\n");}return 0;
}

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

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

相关文章

C. Longest Simple Cycle

C. Longest Simple Cycle 题意&#xff1a; 有n条链&#xff0c;第i条链上有c[i]个点&#xff0c;a[i]为第i条链的顶点与第i-1条链的连接点&#xff0c;b[i]为第i条链的最后一个点与第i-1条链的连接点。通过上面的方法连接链会产生很多的环&#xff0c;问这些环的最大长度。 …

【CF813F】Bipartite Checking(线段树分治+可删除并查集)

文章目录titlesolutioncodetitle You are given an undirected graph consisting of n vertices. Initially there are no edges in the graph. Also you are given q queries, each query either adds one undirected edge to the graph or removes it. After each query you…

在.Net Core WebAPI下给Swagger增加导出离线文档功能

一丶前言最近刚接触到Swagger&#xff0c;在github上下载了它的源码和demo学习了一遍&#xff0c;发现这个组件非常好用&#xff0c;不过不足的是它没有导出离线文档的功能&#xff0c;于是乎我就想给它加一个导出功能Swagger Github开源地址二丶思路其实说白了api文档就是一个…

YBTOJ洛谷P4331:数字序列(左偏树)

文章目录题目描述数据范围解析代码题目描述 数据范围 n<1e6n<1e6n<1e6 解析 先考虑简单情况 如果原数列是单调递增的&#xff0c;显然应该使biaib_ia_ibi​ai​ 如果单调递减&#xff0c;应该取中位数 那么原数列如果分成单调递减的几段&#xff0c;那么每一段都取中…

P8441 旭日东升(二维数点经典套路)

P8441 旭日东升 维护一个不可重集合的序列 \(a\)&#xff0c;长度为 \(n\)。支持以下两种操作&#xff1a; l r x 对于每个 \(l\le i\le r\)&#xff0c;将 \(x\) 并入 \(a_i\)。l r 设 \(S\) 把每个 \(l\le i\le r\) 的 \(a_i\) 并在一起的集合&#xff0c;输出 \(S\) 中所有元…

深搜、广搜、搜索剪枝

搜索与回溯讲解 文章目录深搜方向向量&#xff1a;DFS代码&#xff1a;题目讲解&#xff1a;八皇后问题字符序列自然数的拆分广搜BFS代码&#xff1a;题目讲解&#xff1a;瓷砖关系网络bfs与dfs的用途与区别搜索剪枝可行性剪枝最优性剪枝记忆化搜索搜索顺序剪枝题目&#xff1a…

使用logdashboard查看可视化日志

logdashboard日志面板是我在Github写的一个开源项目&#xff0c;旨在让查看日志变的方便快捷。在线预览现在功能有日志检索、趋势图、异常堆栈快速查看、日志详情等logdashboard支持自定义日志模型可以记录更多自定义的属性。logdashboard支持的日志来源有以下两种&#xff0c;…

数论分块专题复习(余数求和+模积和+Ice Rain+The Fool)

文章目录前提知识复习T1&#xff1a;余数求和titlesolutioncodeT2&#xff1a;Ice RaintitlesolutioncodeT3&#xff1a;The FooltitlesolutioncodeT4&#xff1a;模积和titlesolutioncode前提知识复习 整除分块是用于快速处理形似下列式子的方法&#xff0c;是解决莫比乌斯反…

领域驱动设计,让程序员心中有码(六)

领域驱动设计-聚合&#xff0c;一种极简的思维模式引言作为IT技术产业飞速发展的产物&#xff0c;软件工程学已经成为当今时代非常重要的一个学科。作为一名资深的软件开发从业者&#xff0c;我们需要学习的东西实际上已经远远超出了原本在大学教育阶段所接受的知识深度和广度&…

hdu 5094 Maze

题意&#xff1a; n*m大的迷宫 &#xff0c;有p种钥匙。钥匙最多有10种。 然后一个k&#xff0c;然后k行表示 (x1,y1),(x2,y2)直接有门或者墙。 如果g0 &#xff0c;就是有墙&#xff0c; 如果g>0 表示有门&#xff0c;且门需要第g把钥匙才能开。 然后下来一个s&#xff…

数论分块练习([CF830 C]Bamboo Partition + [hdu 6395]Sequence )

文章目录T1&#xff1a;SequencetitlesolutionT2&#xff1a;Bamboo PartitiontitlesolutioncodeT1&#xff1a;Sequence title 传送 solution 一眼就是很裸的矩阵加速 ⌊pl⌋\lfloor\frac{p}{l}\rfloor⌊lp​⌋分块矩阵加速就可以了 [BA1][DC⌊pl⌋010001]\begin{bmatrix}…

YBTOJ:染颜色(KDtree)

文章目录题目描述数据范围解析代码题目描述 数据范围 n≤105,T≤5n\le10^5,T\le5n≤105,T≤5 解析 关键是对问题的转化 考虑一次修改&#xff0c;一个点需要满足哪些条件才可以满足 1.与x的距离不超过lll 2.在x的子树内 这两个条件可以转化为对深度的限制和对dfs序的限制 这样…

Kubernetes初探[1]:部署你的第一个ASP.NET Core应用到k8s集群

Kubernetes简介Kubernetes是Google基于Borg开源的容器编排调度引擎&#xff0c;作为CNCF&#xff08;Cloud Native Computing Foundation&#xff09;最重要的组件之一&#xff0c;它的目标不仅仅是一个编排系统&#xff0c;而是提供一个规范&#xff0c;可以让你来描述集群的架…

01分数规划

参考文章 01分数规划 什么是01分数规划&#xff1a; 给定n个a[i]和b[i]&#xff0c;a[i]和b[i]绑定在一起要选同时选&#xff0c;求sum(a[i]) 除以 sum(b[i]) 的最大值&#xff0c;sum为求和函数 对于这种问题我们可以多定义一个数组x[1…n]&#xff0c;x为bool型只取0或者1,…

CF1156D 0-1-Tree(换根DP)

牛犇犇titlesolutioncodetitle 戳一戳 solution 直接设dp[i][k]dp[i][k]dp[i][k]表示以iii为根时&#xff0c;子树内&#xff0c;边权为kkk时的答案 &#xff08;定义写得好复杂&#xff0c;可略过&#xff09; 考虑对于点uuu&#xff0c;vvv是他的一个儿子&#xff0c;两点…

Entity Framework 6.3 和 EF Core 3.0 路线图

尽管脱离了 .NET Core 发布循环&#xff0c;但是 EF Core 正在开发其 3.0 路线图。除此之外&#xff0c;还对原来的 Entity Framework 进行了一些重要的变更。更多服务器端的查询将 LINQ 查询转换为对应的 SQL 查询通常是比较困难的&#xff0c;甚至是不可能的。许多 QRM 只能在…

EFCore+Mysql仓储层建设(分页、多字段排序、部分字段更新)

前沿园子里已有挺多博文介绍了EFCoreMysql/MSSql如何进行使用&#xff0c;但实际开发不会把EF层放在Web层混合起来&#xff0c;需要多个项目配合结构清晰的进行分层工作&#xff0c;本文根据个人实践经验总结将各个项目进行分层&#xff0c;仅供想自己搭建,包含数据仓储以及分页…

[FWT] 时隔一年再回首FWT(快速沃尔什变换),我终于不再是个门外汉

时隔一年再回首FWT&#xff0c;我似乎有了新理解&#xff1f;&#xff1f; 添加了原理的推导&#xff0c;以前就只有模板… 文章目录引入or&#xff08;或&#xff09;卷积原理FWT_or正变换FWT_or逆变换模板and&#xff08;与&#xff09;卷积原理FWT_and正变换FWT_and逆变换模…

Loj #149. 01 分数规划(01分数规划模板题)

链接 题意&#xff1a; 题解&#xff1a; 详细解法看这里 这里说个点&#xff0c;eps一定要开足够小&#xff0c;我一开始开的1e-5&#xff0c;结果就过了90%的数据&#xff0c;开到1e-7就足够了 代码&#xff1a; #include<bits/stdc.h> typedef long long ll; usin…

如何测试 ASP.NET Core Web API

在本文中&#xff0c;我们将研究如何测试你的 ASP .NET Core 2.0 Web API 解决方案。我们将了解使用单元测试进行内部测试&#xff0c;使用全新的 ASP .NET Core 的集成测试框架来进行外部测试。本文要点正确理解并使用单元测试和你的 ASP .NET Core Web API 解决方案一样重要。…