模板:线段树优化建图

前言

百川到海,天下归一

解析

线段树优化建图是用于对一个区间的点连边时的优化方法
建一棵in树一棵出树分别往上和下指即可
大概长这样
在这里插入图片描述
(pia的洛谷的照片)

建树

正常动态开点即可

void build(int &k,int l,int r){tr[k=++tot]=(tree){0,0};if(l==r){addline(k,l);return;}build(tr[k].ls,l,mid);build(tr[k].rs,mid+1,r);addline(k,tr[k].ls);addline(k,tr[k].rs);//printf("k=%d l=%d r=%d ls=%d rs=%d\n",k,l,r,tr[k].ls,tr[k].rs);return;
}

连边

和线段树的通常操作很类似

void add(int k,int l,int r,int x,int y,int o){//printf("add:k=%d l=%d r=%d x=%d y=%d o=%d\n",k,l,r,x,y,o);if(x<=l&&r<=y){//printf("  o=%d k=%d\n",o,k);addline(o,k);return;}if(x<=mid) add(tr[k].ls,l,mid,x,y,o);if(y>mid) add(tr[k].rs,mid+1,r,x,y,o);return;
}

区间对区间连边

不需要对入树和出树两两相连,只需要新开一个虚点,都对虚点连边即可
这样总的加边数就是单log的

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=5e5+100;
const int M=1e6+100;
ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=x*10+(c^48);c=getchar();}return x*f;
}inline void Max(int &x,int y){if(x<y) x=y;}int n;
struct node{int to,nxt,w;
}p[N*205];
int fi[N<<3],cnt;
inline void addline(int x,int y,int w){//if(w)//printf("%d %d %d\n",x,y,w);p[++cnt]=(node){y,fi[x],w};fi[x]=cnt;return;
}
int ls[N<<3],rs[N<<3],rin,rout,tot;
#define mid ((l+r)>>1)
void build(int &k,int l,int r,int op){k=++tot;if(l==r){//printf("(%d %d) k=%d ls=%d rs=%d op=%d\n",l,r,k,0,0,op);if(op==0) addline(k,l,0);else addline(l,k,0);return;}build(ls[k],l,mid,op);build(rs[k],mid+1,r,op);if(op==0){addline(k,ls[k],0);addline(k,rs[k],0);}else{addline(ls[k],k,0);addline(rs[k],k,0);}//printf("(%d %d) k=%d ls=%d rs=%d op=%d\n",l,r,k,ls[k],rs[k],op);return;
}
void add(int k,int l,int r,int x,int y,int o,int op){if(x<=l&&r<=y){if(op==0) addline(o,k,op);else addline(k,o,op);return;}if(x<=mid) add(ls[k],l,mid,x,y,o,op);if(y>mid) add(rs[k],mid+1,r,x,y,o,op);return;
}
int s,m;
int dis[N<<3],vis[N<<3];
deque<int>q;
int main(){#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);#endifmemset(fi,-1,sizeof(fi));cnt=-1;n=read();m=read();s=read();tot=n;build(rin,1,n,0);build(rout,1,n,1);for(int i=1;i<=m;i++){int a=read(),b=read(),c=read(),d=read();/*for(int j=a;j<=b;j++){for(int k=c;k<=d;k++){if(j==k) continue;addline(j,k,1);addline(k,j,1);}      }*/int o=++tot;add(rin,1,n,a,b,o,0);add(rout,1,n,c,d,o,1);o=++tot;add(rin,1,n,c,d,o,0);add(rout,1,n,a,b,o,1);/*find(rout,1,n,a,b,c,d);find(rout,1,n,c,d,a,b);*/}memset(dis,0x3f,sizeof(dis));q.push_back(s);dis[s]=0;while(!q.empty()){int now=q.front();q.pop_front();if(vis[now]) continue;vis[now]=1;for(int i=fi[now];~i;i=p[i].nxt){int to=p[i].to;if(dis[now]+p[i].w>=dis[to]) continue;dis[to]=dis[now]+p[i].w;if(p[i].w) q.push_back(to);else q.push_front(to);}}for(int i=1;i<=n;i++) printf("%d\n",dis[i]);
}
/**/

thanks for reading!

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

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

相关文章

Binary Search

01 分数划分 什么 01 分数划分&#xff0c;叫 Binary Search 多好。 P1642 规划 可以二分答案 \(x\)&#xff0c;考虑选择 \(n-m\) 个数使得答案 \(\ge x\)。 \[\dfrac{\sum w(i)}{\sum c(i)}\ge x \]\[\sum w(i)\ge \sum (x\times c(i)) \]\[\sum(w(i)-x\times c(i))\ge 0 \]之…

CF1556F-Sports Betting【状压dp,数学期望】

正题 题目链接:https://www.luogu.com.cn/problem/CF1556F 题目大意 nnn个点的一张竞赛图&#xff0c;每个点有一个权值aia_iai​&#xff0c;(i,j)(i,j)(i,j)之间的边iii连jjj的概率是aiaiaj\frac{a_i}{a_ia_j}ai​aj​ai​​&#xff0c;否则jjj连iii。 现在期望有多少个点…

[非旋平衡树]fhq_treap概念及模板,例题:普通平衡树,文艺线段树

文章目录概念全套模板push_up模板split拆树模板(按权值拆)split拆树模板(按个数拆)merge合并模板&#xff08;地址版&#xff09;merge合并模板&#xff08;带返回根&#xff09;区间模板insert插入模板delete删除模板find_kth找第k大模板get_rank找排名模板pre找前驱模板suf找…

P4381 [IOI2008]Island

P4381 [IOI2008]Island 题意&#xff1a; 给你一棵基环树森林&#xff0c;求出基环树的直径之和. 题解&#xff1a; 对于基环树,我们将环看作根,那么直径有两种情况:: 1.不经过环,也就是环上某个点的子树内部,对于这种情况,直接在子树内部处理直径,更新答案即可; 2.经过环…

20210912模拟

文章目录总结复盘总结 190pts 50403070 今天吸取了昨天的教训&#xff0c;没有再像之前一样先死磕一道题&#xff0c;把命运押在切题上&#xff0c;整体时间分配还算合理 要认真审题&#xff01; 今天T1少看了条件&#xff0c;T4一开始看错题意浪费了时间… 复盘 先看题 乍…

surging 微服务引擎 1.0 正式发布

surging 是一个分布式微服务引擎,提供高性能RPC远程服务调用&#xff0c;服务引擎支持http、TCP、WS、Mqtt协议,采用Zookeeper、Consul作为surging服务的注册中心&#xff0c;集成了哈希一致性&#xff0c;随机&#xff0c;轮询、压力最小优先作为负载均衡的算法&#xff0c;底…

CF1594F-Ideal Farm【构造】

正题 题目链接:https://www.luogu.com.cn/problem/CF1594F 题目大意 给出n,s,kn,s,kn,s,k&#xff0c;求是否所有的长度为nnn且和为sss的正整数序列都有一段和为kkk的区间。 1≤T≤105,1≤n,s,k≤10181\leq T\leq 10^5,1\leq n,s,k\leq 10^{18}1≤T≤105,1≤n,s,k≤1018 解题…

P4178 Tree

P4178 Tree 题意&#xff1a; 给定一棵 n 个节点的树&#xff0c;每条边有边权&#xff0c;求出树上两点距离小于等于 k 的点对数量。 题解&#xff1a; 点分治的模板题是求等于K的路径条数 本题是求小于等于K的路径条数&#xff0c;我们只需要改变统计答案即可 原本统计答…

YBTOJ:彩色圆环

文章目录前言题目描述InputOutputSample InputSample Output解析代码前言 尽信书&#xff0c;则不如无书 题目描述 Input 仅有一行&#xff0c;该行给出依次两个正整数N, M&#xff0c;分别表示宝石的个数和宝石在变化时可能变成的颜色种类数。 Output 应仅有一行&#xff0…

【2019CSP-J 普及组题解】数字游戏(number),公交换乘(transfer),纪念品(souvenir),加工领奖(work) CSP普及游记

文章目录T1&#xff1a;数字游戏题目CODET2&#xff1a;公交换乘题目CODET3&#xff1a;纪念品题目题解CODET4&#xff1a;加工领奖题目题解CODE关于普及组的想法&游记T1&#xff1a;数字游戏 题目 小 K 同学向小 P 同学发送了一个长度为 8 的 01 字符串来玩数字游戏&…

搭建基于Docker社区版的Kubernetes本地集群

Kubernetes的本地集群搭建是一件颇费苦心的活&#xff0c;网上有各种参考资源&#xff0c;由于版本和容器的不断发展&#xff0c;搭建的方式也是各不相同&#xff0c;这里基于Docker CE的18.09.0版本&#xff0c;在Mac OS、Win10下分别搭建了一次。一、Mac OS下搭建安装Docker …

【做题记录】统计区间(哈希/扫描线)

交题链接 给你一个长度为 \(n(n\le 10^6)\) 的序列&#xff0c;其中每个元素都在 \([1,n]\) 范围中。 询问有多少个区间满足区间中的元素都恰好出现 \(2\) 次。 \(\texttt{solution}~\texttt{1:}\) 哈希 我们考虑如果元素个数 \(\le 64\) 时我们怎么做&#xff1a; 给每个元素分…

2021牛客OI赛前集训营-交替【生成函数】

正题 题目链接:https://ac.nowcoder.com/acm/contest/20108/B 题目大意 给出一个长度为nnn的序列aaa&#xff0c;每次 如果nnn是偶数&#xff0c;则对于所有的i<ni<ni<n令新的ai′ai′ai1′a_ia_ia_{i1}ai′​ai′​ai1′​如果nnn是奇数&#xff0c;则对于所有的i…

Infinite Tree

Infinite Tree 题意&#xff1a; 题解&#xff1a; 参考博客 看了好一阵子才明白。。。emm。 我们先按照题意画出一部分树 我们先不考虑复杂度&#xff0c;这题应该怎么做&#xff1f; 题目给了每个点的权值w[i]&#xff0c;问一个点到所有的节点路径长度*点权之和最小是多少…

模板:高斯消元

文章目录前言解析step1 选择主元代码step2 消元step3代码完整代码高斯消元&#xff0c;就是按照高斯的方法消元 前言 考虑我们手算是如何解多元线性方程组的 要么加减消元&#xff0c;要么代入消元 但显然对于编程来说&#xff0c;加减消元更具有普适性 如何进行呢&#xff1f…

IdentityServer4-从数据库获取User登录并对Claims授权验证(五)

本节将在第四节基础上介绍如何实现IdentityServer4从数据库获取User进行验证&#xff0c;并对Claim进行权限设置。一、新建Web API资源服务&#xff0c;命名为ResourceAPI&#xff08;1&#xff09;新建API项目&#xff0c;用来进行user的身份验证服务。&#xff08;2&#xff…

周末狂欢赛1(玩游戏/Game,函数,JOIOI王国)

狂欢1T1&#xff1a;玩游戏 / Game题目题解代码实现T2&#xff1a;函数题目题解代码实现T3&#xff1a;JOIOI王国题目题解代码实现T1&#xff1a;玩游戏 / Game 题目 ljcc 和他的学妹在玩游戏&#xff0c;这个游戏共有 n 轮&#xff0c;在第 i 轮获胜会获得 i 分&#xff0c;…

CF1286D-LCC【动态dp,数学期望】

正题 题目链接:https://www.luogu.com.cn/problem/CF1286D 题目大意 nnn个粒子&#xff0c;第iii个在xix_ixi​&#xff0c;速度是viv_ivi​&#xff0c;有pi100\frac{p_i}{100}100pi​​的概率朝左飞&#xff0c;有1−pi1001-\frac{p_i}{100}1−100pi​​的概率往右飞&#x…

CF613D Kingdom and its Cities

CF613D Kingdom and its Cities 题目&#xff1a; 给定一棵有n 个节点的树&#xff0c;树上有一些关键点(key)。接下来有q组询问&#xff0c;每次给出ki 个key&#xff0c;要求删去一些点&#xff0c;使得这些key不相连。要求删去的最少的点数。 1<n<100000 1<q<…

YBTOJ洛谷P3750:分手是祝愿(期望dp)

传送门 文章目录解析代码解析 首先&#xff0c;开关开关两次等于没动&#xff0c;所有对于一个解来说&#xff0c;开关的状态只有开与不开之分 接下来的一个关键点是&#xff1a;每一个开关的效果无法被其他开关操作的组合代替 所以这个题应该只有唯一解 那么我们可以不计代价…