加權並查集
由於給出資訊的是一些乙個區間的和為多少,我們顯然並不好處理出每乙個點應該為多少,這我們根本做不到
但是我們想一下,如果要求乙個區間\([l,r]\)的和,那麼我們是不是可以利用字首和\(p[r]-p[l-1]\)得到
所以一組資訊\(l,r,k\)其實可以利用字首和寫成\(p[r]-p[l-1]=k\)的形式
於是我們可以考慮將這些這字首和的資訊利用並查集來合併,同時我們還要儲存乙個\(s[i]\)表示\(p[fa[i]]-p[i]\)為多少,即根節點與每個點的差為多少
如果對於一條資訊\(l,r,k\),\(l-1,r\)已經有了關係,即\(l-1\)和\(r\)在乙個並查集裡,我們就看一看\(p[r]-p[l-1]\)即\(p[root]-p[l-1]-(p[root]-p[r])=s[x-1]-s[y]\)是否等於\(k\)就好了
如果\(l-1\)與\(r\)沒有關係,那麼就將這兩個並查集合並一下,這裡也要推一下式子(剛上來這裡的式子推錯了,真尷尬)
之後就是乙個加權並查集的板子了
#include#include#include#define re register
#define maxn 101
int fa[maxn],s[maxn];
inline int read()
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x*r;
}int find(int x)
int n,m,t;
int main()
else
if(!opt) break;
}if(!opt) puts("false");
else puts("true");
}return 0;
}
HNOI2005 狡猾的商人
刁奼接到乙個任務,為稅務部門調查一位商人的賬本,看看賬本是不是偽造的。賬本上記錄了n個月以來的收入情況,其中第i 個月的收入額為ai i 1,2,3 n 1,n 當 ai大於0時表示這個月盈利ai 元,當 ai小於0時表示這個月虧損ai 元。所謂一段時間內的總收入,就是這段時間內每個月的收入額的總和...
HNOI2005狡猾的商人
傳送門 題目意思很簡單,意思是說給你一些區間和,要你判斷這些區間和是否合法。開始只想到了差分約束的方法,就是搞成字首和的形式 su m r sum l 1 w 且 su m r sum l 1 w 這樣利用spfa建圖,利用三角形不等式,即dis v dis x w i 每個條件建出sum r su...
HNOI2005 狡猾的商人
hnoi2005 狡猾的商人 time limit 10 sec memory limit 162 mb description 刁奼接到乙個任務,為稅務部門調查一位商人的賬本,看看賬本是不是偽造的。賬本上記錄了n個月以來的收入情況,其中第i 個月的收入額為ai i 1,2,3 n 1,n 當 ai...