【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
【POJ】1984 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 game【hash+帶權並查集】
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】是之前