1. 程式人生 > >【bzoj 2102】 [HNOI2005]狡猾的商人 帶權並查集維護區間和

【bzoj 2102】 [HNOI2005]狡猾的商人 帶權並查集維護區間和

以為是掃描演算法,想了半天最後看人家說是並查集我一下子就懵逼了,畢竟是第一次用並查集來維護區間和

這裡為啥要用並查集呢,因為每一段的區間和可以為負數,所以如果兩端區間之間沒有端點相交,那麼就是互不影響的,因此,及時兩段線段之間有交集,只要端點不想交就相互獨立,so,維護是不是獨立的集合我們用什麼?沒錯,就是並查集,但是這一道題由於還要判斷是否符合條件,因此單個的並查集是沒有用的,我們想到了帶權並查集。v表示他相對於父親節點的權,那麼每次加入一段就是把兩個端點(x-1和y)連線到了同一個集合,如果本身就是在同一個集合就只用比較v[b]-v[a]==c?

比較麻煩的就是處理這個點到他父親節點的權 v[dy]=c[x]+(c-v[y])這個容易把自己繞進去,好好想

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#define maxn 255
using namespace std;
int T,n,m,fa[maxn],v[maxn];

int find(int x){
	if(fa[x]==x)return x;
	int temp=find(fa[x]);
	v[x]=v[x]+v[fa[x]];
	return fa[x]=temp;
}

int main(){
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);
		memset(v,0,sizeof(v));
		memset(fa,0,sizeof(fa));
		for(int i=0;i<=n;i++)fa[i]=i,v[i]=0;
		bool ok=false;
		for(int a,b,c,i=1;i<=m;i++){
			scanf("%d%d%d",&a,&b,&c);
			if(ok)continue;
			a--;
			int dx=find(a),dy=find(b);
			if(dx==dy&&v[b]-v[a]!=c){
				ok=true;continue;
			}else{
				fa[dy]=dx;
				v[dy]=v[a]+(c-v[b]);
			}
		}
		if(ok)puts("false");
		else puts("true");
	}
	return 0;
}


相關推薦

bzoj 2102 [HNOI2005]狡猾商人 維護區間

以為是掃描演算法,想了半天最後看人家說是並查集我一下子就懵逼了,畢竟是第一次用並查集來維護區間和 這裡為啥要用並查集呢,因為每一段的區間和可以為負數,所以如果兩端區間之間沒有端點相交,那麼就是互不影響

HUD 3038 解決區間矛盾問題

How Many Answers Are Wrong TT and FF are ... friends. Uh... very very good friends -________-b  FF is a bad boy, he is always wooing TT to play

BZOJ1202: [HNOI2005]狡猾商人()

color 人的 problem output etc += 一段 n) memory Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4577 Solved: 2249[Submit][Status][Discuss]

NOIP 校內模擬T1 line(

很無奈 離正解就差一句話 簡單的帶權並查集 沒啥好說的 也可以差分約束 #include<bits/stdc++.h> #define N 100005 #define M 200005 #define D 10005 using namespace std; template<class

POJ1984 Navigation Nightmare

USACO 2004 February傳送門:【POJ】1984 Navigation Nightmare 題目大意: 農夫約翰有 N 個農場,標號 1 到 N.M 條的不同的垂直或水平的道路連線著農場,道路的長度不超過 1000。這些農場的分佈就像下面的地圖一樣,圖中農場用 F1..F7 表示:

bzoj4025 二分圖(線段樹分治+維護路徑長奇偶性)

bzoj4025 二分圖 題意: 神犇有一個n個節點的圖。因為神犇是神犇,所以在T時間內一些邊會出現後消失。神犇要求出每一時間段內這個圖是否是二分圖。 資料範圍 n<=100000,m<=200000,T<=100000,1<

bzoj 1202狡猾商人

傳送門biu~ 設sisi表示前ii個月份的收入和。每條資訊(l,r,v)(l,r,v)相當於是在說sr−sl−1=vsr−sl−1=v,可以用帶權並查集來將l−1l−1月份和rr月份合併。設root

BZOJ 3376[Usaco2004 Open]Cube Stacking 方塊遊戲

inline 記錄 cst cnblogs bsp tac bzoj 開始 scan 這道題一開始以為是平衡樹結果發現復雜度過不去,然後發現我們一直合並而且只是記錄到最低的距離,那麽就是帶權並查集了,帶權並查集的權一般是到根的距離,因為不算根要好打,不過還有一些其他的,具體

BZOJ 1202 狡猾商人 差分約束or

!= pre false 其中 png 超時 差分約束 樹根 cto 題目鏈接: https://www.lydsy.com/JudgeOnline/problem.php?id=1202 題目大意: 刁姹接到一個任務,為稅務部門調查一位商人的賬本,看看賬本是不是偽造的。賬

Bzoj1202/洛谷P2294 [HNOI2005]狡猾商人/差分約束系統)

pen ems http type 判斷 put .com 就是 algo 題面 Bzoj 洛谷 題解 考慮帶權並查集,設\(f[i]\)表示\(i\)的父親(\(\forall f[i]<i\)),\(sum[i]\)表示\(\sum\limits_{j=fa[i]

HDU 3047 Zjnu Stadium

void mem ios ack string blank iostream style csdn http://acm.hdu.edu.cn/showproblem.php?pid=3047 【題意】 http://blog.csdn.net/hj1107402232/a

POJ1988 Cube Stacking 統計

Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 28711  

poj 2492 A Bug's Life

就是給一個無向圖判是否有奇環 用帶權並查集來做,邊權1表示連線的兩個節點異性,否則同性,在%2意義下進行加法運算即可,最後判相同的時候也要%2,因為可能有負數 #include<iostream> #include<cstdio> using namespace std; const

poj 1182 食物鏈

設相等的邊權為0,吃的邊權為,被吃的邊權為2,然後用帶權並查集在%3的意義下做加法即可 關係為簡單環的基本都可以用模環長的方式是用帶權並查集 #include<iostream> #include<cstdio> using namespace std; const int N=50

poj 1733 Parity gamehash+

hash一下然後用帶權並查集做模2下的字首和 #include<iostream> #include<cstdio> #include<map> #include<algorithm> using namespace std; const int N=1000

BZOJ1202:狡猾商人

else class puts tex algorithm str 修改 任務 scrip 1202: [HNOI2005]狡猾的商人 題目鏈接:https://www.lydsy.com/JudgeOnline/problem.php?id=1202 Descriptio

Virtual Friends HDU - 3172題目不難、但有坑點

題目連結   為什麼能這麼埋坑???我還以為我錯了,結果找不到BUG,後來一看Discuss,發現竟是這種問題。。。   一般情況,我們都是while(T--)就行,但這道題可真就不一樣了,它還需要while(scanf("%d", &T)!=EOF)!

洛谷P1196

傳送門:https://www.luogu.org/problemnew/show/P1196#sub 大家都說並查集按秩合併並沒有用,所以我以後大概也不會寫按秩合併了。 而且帶權並查集,不能寫按秩合併好像! 普通的並查集只能維護在不在同一個集合,合併到同一個集合,但是帶權並查集就可以維

資料結構POJ1988——線樹上的

問題描述: 給定30000個方塊,一開始每個方塊各自一摞,每次有兩種操作的方法,一種是將含有編號xx的一摞放在含有編號yy的一摞上,另一種是統計編號xx的方塊下有幾個方塊,每次將第二種操作的結果

模板 HDU 3038

具體學習參考https://blog.csdn.net/sunmaoxiang/article/details/80959300#commentBox 這篇部落格也是我覺得比較好理解的方法——向量法,具體體現在程式碼。 hdu 3038 區間和悖論問題 假如說區間【fx,x】是之前