1. 程式人生 > >[線段樹優化建圖最短路 bfs] BZOJ 3073 [Pa2011]Journeys

[線段樹優化建圖最短路 bfs] BZOJ 3073 [Pa2011]Journeys

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<set>
using namespace std;

inline char nc()
{
	static char buf[100000],*p1=buf,*p2=buf;
	if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }
	return *p1++;
}

inline void read(int &x)
{
	char c=nc(),b=1;
	for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;
	for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}

const int N=500005;

struct edge{
	int l,r;
	int next;
}G[10*N];

int inum,head[4*N];

inline void add(int rt,int l,int r,int p){
	G[p].l=l; G[p].r=r; G[p].next=head[rt]; head[rt]=p;
}

int M;

inline void Build(int n){
	for (M=1;M<n+2;M<<=1);
}

inline void insert(int s,int t,int a,int b)
{
	for (s+=M-1,t+=M+1;s^t^1;s>>=1,t>>=1)
	{
		if (~s&1) add(s^1,a,b,++inum);
		if ( t&1) add(t^1,a,b,++inum);
	}
}

int n,m,P;
int dis[N];

int Q[N],l,r;
//set<int> Set;
//typedef set<int>::iterator ITER;
int Stk[N],pnt;

int fat[N];
int Fat(int u){
	return u==fat[u]?u:fat[u]=Fat(fat[u]);
}

int main()
{
	int a,b,c,d,u;
//	ITER it;
	freopen("t.in","r",stdin);
	freopen("t.out","w",stdout); 
	read(n); read(m); read(P); 
	Build(n);
	for (int i=1;i<=m;i++)
	{
		read(a); read(b); read(c); read(d);
		insert(a,b,c,d); insert(c,d,a,b);
	}
	l=r=-1; Q[++r]=P; dis[P]=0;
//	for (int i=1;i<=n;i++) if (i!=P) Set.insert(i);
	for (int i=1;i<=n+1;i++) fat[i]=i; 
	fat[P]=P+1;
	while (l<r)
	{
		int u=Q[++l]; 
		for (int t=M+u;t;head[t]=0,t>>=1)
			for (int p=head[t];p;p=G[p].next)
			{
//				for (pnt=0,it=Set.lower_bound(G[p].l);it!=Set.end() && *it<=G[p].r;it++)
//					dis[*it]=dis[u]+1,Q[++r]=*it,Stk[++pnt]=*it;
				pnt=0;
				for (int i=Fat(G[p].l);i<=G[p].r;i=Fat(i+1))
					dis[i]=dis[u]+1,Q[++r]=i,Stk[++pnt]=i;
//				while (pnt) Set.erase(Stk[pnt--]);
				while (pnt) fat[Stk[pnt]]=Stk[pnt]+1,pnt--;
			}
	}
	for (int i=1;i<=n;i++) printf("%d\n",dis[i]);
	return 0;


相關推薦

[線段優化短路 bfs] BZOJ 3073 [Pa2011]Journeys

#include<cstdio> #include<cstdlib> #include<algorithm> #include<set> using namespace std; inline char nc() {

Codeforces 787D. Legacy 線段優化+短路

self memset site cti worker for each down end rap output standard output Rick and his co-workers have made a new radioactive formula

787D (線段優化+短路

Legacy Rick and his co-workers have made a new radioactive formula and a lot of bad guys are after them. So Rick wants to give his lega

洛谷3783 SDOI2017 天才黑客(短路+虛+邊轉點+線段優化

題目連結 成功又一次自閉了 怕不是豬國殺之後最自閉的一次 一看到最短路徑。 我們就能推測這應該是個最短路題 現在考慮怎麼建圖 根據題目的意思,我們可以發現,在本題中,邊與邊之間存在一些轉換關係,但是點與點之間並不存在。 那麼我們考慮 邊轉點,點轉邊。 每一條邊拆成

【bzoj4276】[ONTAK2015]Bajtman i Okr?g?y Robin 線段優化+費用流

har brush while inf uil mes queue eof div 題目描述 有n個強盜,其中第i個強盜會在[a[i],a[i]+1],[a[i]+1,a[i]+2],...,[b[i]-1,b[i]]這麽多段長度為1時間中選出一個時間進行搶劫,並計劃搶走

【BZOJ3681】Arietta 鏈剖分+可持久化線段優化+網絡流

des 持久化 -s 過程 void 但是 陽光 建圖 == 【BZOJ3681】Arietta Description Arietta 的命運與她的妹妹不同,在她的妹妹已經走進學院的時候,她仍然留在山村中。但是她從未停止過和戀人 Velding 的書信往來。一天,

CF786B Legacy(線段優化

好想 sin flag date ide init 技術 out nbsp 題意 有n個點,q個詢問,每次詢問有一種操作。操作1:u→[l,r](即u到l,l+1,l+2,...,r距離均為w)的距離為w;操作2:[l,r]→u的距離為w;操作3:u到v的距離為w;求起點到

[bzoj5017][Snoi2017]炸彈 tarjan縮點+線段優化+拓撲

isp stream 現在 aps data fin zoj tput gre 5017: [Snoi2017]炸彈 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 608 Solved: 190[Submit][Stat

BZOJ5017 [SNOI2017]炸彈 - 線段優化+Tarjan

amp col build stx mod ide update 有向圖 style Solution 一個點向一個區間內的所有點連邊, 可以用線段樹優化建圖來優化 : 前置技能傳送門 然後就得到一個有向圖, 一個聯通塊內的炸彈可以互相引爆, 所以進行縮點變成$DAG$

【網路流+線段優化】CF793G Oleg and chess

【題目】 原題地址 有一個 n × n

[CERC2017]Intrinsic Interval[scc+線段優化]

題意 給定一個長度為 \(n\) 的排列,有 \(q\) 次詢問,每次詢問一個區間 \([l,r]\) ,找到最小的包含 \([l,r]\) 的區間,滿足這個區間包含了一段連續的數字。 \(n\leq 10^5\) 分析 考慮相鄰的兩個位置 \(i,i+1\),記兩個位置的值為 $ x ,y(x

codeforces 787D - Legacy 線段優化建,短路

題意: 有n個點,q個詢問, 每次詢問有一種操作。 操作1:u→[l,r](即u到l,l+1,l+2,...,r距離均為w)的距離為w; 操作2:[l,r]→u的距離為w 操作3:u到v的距離為w 最終求起點到其他點的最短距離,到達不了輸出-1   題解 線段樹優化建圖+最短路..

bzoj4383 [POI2015]Pustynia(線段優化+拓撲序dp)

首先我們有樸素的想法,直接建圖拓撲序,倒著dp求每個點的最小值即可。 然而這樣建邊可能是O(n2)的 我們考慮對於一條資訊,我們新建一個節點p,大於的點我們向p連一條邊權為1的邊,小於的點p向它連一條邊權為0的邊。這樣就好多了,然而最壞還是O(n2)的囧

線段優化+費用流Spfa增廣】BZOJ4276(ONTAK2015)[Bajtman i Okrągły Robin]題解

題目概述 有n個強盜,第i個強盜將在[Li,Ri]內選一段長度為1的時間盜竊ci元,每個長度為1的時間只能阻止一個強盜,求最大能挽回的損失。 解題報告 這是分配型別的題目,考慮最大費用最大流。 先將超級源S與每一個強盜i建容量為1,費用為ci的邊。然

bzoj 3073Journeys線段優化

傳送門biu~ 線段樹的每個節點代表一個區間,建兩棵線段樹。 出線段樹每個點向父節點連邊0,表示如果能從這個區間出發也就可以從父區間出發。入線段樹每個點向子節點連邊0,表示如果能到達這個區間也就可以到達子區間。 入線段樹每個點向出線段樹的平行結點連邊0,

CF-787D-線段+短路

http://codeforces.com/problemset/problem/787/D     題目大意是給出一個有向圖,有N個節點,初始節點在S,詢問S到所有點最短路。邊的讀入方式有三種, 1 u v w  表示 u->v有一條邊權為w的邊, 2 v l r w

codeforces 786B Legacy 線段短路

B. Legacy time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Rick and

786B Legacy (線段+短路

B. Legacy time limit per test 2 seconds memory limit per test256 megabytes inputstandard inputoutputstandard output Rick and his co-wor

[bzoj3073][Pa2011]Journeys 線段優化邊的短路

#include <bits/stdc++.h> #define pa pair<int,int> using namespace std; const int N = 30000005; int n, m, S, cnt, vir, last[5000000], dis[500000

POJ1122_FDNY to the Rescue!(逆向+短路)

name map ted 技術分享 ext nod 技術 desc guarantee FDNY to the Rescue! Time Limit: 1000MS Memory Limit: 10000K Total Sub