博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CF786B] Legacy
阅读量:4486 次
发布时间:2019-06-08

本文共 2599 字,大约阅读时间需要 8 分钟。

Description

有 n 个点 \((n\leq 10^5)\),三种操作:

  1 u v w 从u向v连一条权值为w的有向边 

2 u L R w 从u向[L,R]的所有结点连一条权值为w的有向边 

3 u L R w 从[L,R]的所有结点向u连一条权值为w的有向边

Solution

解锁了线段树优化建图的姿势。

感觉有点玄乎啊,优化建图实际上就是让线段树上的节点做一个中转,中转叶子节点到叶子节点的道路。

这老哥写的不错

注意边的空间要开大点!

Code

#include
#include
#include
#include
#define N 100005#define int long long#define min(A,B) ((A)<(B)?(A):(B))#define max(A,B) ((A)>(B)?(A):(B))#define swap(A,B) ((A)^=(B)^=(A)^=(B))int vis[N<<2];int root1,root2;int n,m,s,cnt,tot;int lch[N<<2],rch[N<<2];int dis[N<<2],head[N<<2];struct Edge{ int to,nxt,dis;}edge[N*20];struct Node{ int now,dis; friend bool operator<(Node a,Node b){ return a.dis>b.dis; }};void add(int x,int y,int z){ edge[++cnt].to=y; edge[cnt].nxt=head[x]; edge[cnt].dis=z; head[x]=cnt;}void build1(int &cur,int l,int r){ if(l==r){ cur=l; return; } cur=++tot; int mid=l+r>>1; build1(lch[cur],l,mid); build1(rch[cur],mid+1,r); add(cur,lch[cur],0);add(cur,rch[cur],0);}void build2(int &cur,int l,int r){ if(l==r){ cur=l; return; } cur=++tot; int mid=l+r>>1; build2(lch[cur],l,mid); build2(rch[cur],mid+1,r); add(lch[cur],cur,0);add(rch[cur],cur,0);}int getint(){ int x=0,f=0;char ch=getchar(); while(!isdigit(ch)) f|=ch=='-',ch=getchar(); while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); return f?-x:x;}void modify1(int cur,int l,int r,int ql,int qr,int x,int y){ if(ql<=l and r<=qr){ add(x,cur,y); return; } int mid=l+r>>1; if(ql<=mid) modify1(lch[cur],l,mid,ql,qr,x,y); if(mid
>1; if(ql<=mid) modify2(lch[cur],l,mid,ql,qr,x,y); if(mid
pq; pq.push((Node){s,0}); while(pq.size()){ Node u=pq.top();pq.pop(); if(vis[u.now]) continue; vis[u.now]=1; for(int i=head[u.now];i;i=edge[i].nxt){ int to=edge[i].to; if(dis[to]>u.dis+edge[i].dis){ dis[to]=u.dis+edge[i].dis; pq.push((Node){to,dis[to]}); } } }}signed main(){ n=getint(),m=getint(),s=getint();tot=n; build1(root1,1,n);build2(root2,1,n); while(m--){ int opt=getint(); if(opt==1){ int a=getint(),b=getint(),c=getint(); add(a,b,c); } else if(opt==2){ int a=getint(),b=getint(),c=getint(),d=getint(); modify1(root1,1,n,b,c,a,d); } else{ int a=getint(),b=getint(),c=getint(),d=getint(); modify2(root2,1,n,b,c,a,d); } } for(int i=1;i<=(n<<2);i++) dis[i]=2e18; dis[s]=0; dijkstra(); for(int i=1;i<=n;i++){ if(dis[i]>=2e18) printf("-1 "); else printf("%I64d ",dis[i]); } return 0;}

转载于:https://www.cnblogs.com/YoungNeal/p/9297023.html

你可能感兴趣的文章
ruby 模块 的引入
查看>>
CI Weekly #21 | iOS 持续集成快速入门指南
查看>>
xml 校验
查看>>
Jquery获取输入框属性file,ajax传输后端,下载图片
查看>>
深入浅出Visual_C动态链接库(Dll)编程(宋宝华)----整理(word)
查看>>
docker运行环境安装-后续步骤(二)
查看>>
Python学习——02-Python基础——【3集合与函数】
查看>>
NPOI导出excel表格应用
查看>>
tensorflow从入门到放弃-0
查看>>
解锁scott用户
查看>>
多态的理解
查看>>
AspNet Core 发布到Linux系统和发布IIS 注意项
查看>>
Windows添加.NET Framework 3.0 NetFx3 失败 - 状态为:0x800f0950
查看>>
隐藏显示终端的光标(shell echo,linux c printf)
查看>>
SQL Server 存储过程
查看>>
JSP 标准标签库(JSTL)(JSP Standard Tag Library)
查看>>
导入项目遇到的问题: Some projects cannot be imported because they already exist in the workspace....
查看>>
华为:字符集合
查看>>
用Okhttp框架登录之后的Cookie设置到webView中(转)
查看>>
Java_Activiti5_菜鸟也来学Activiti5工作流_之入门简单例子(一)
查看>>