狡猾的商人 bzoj1202,HNOI2005

2021-07-09 14:54:38 字數 857 閱讀 9065

ac通道:

[分析]

因為每月的總收入可以為正,也可以為負,所以要比較兩個區間是否相符,當且僅當它們邊界都相同時才能比較。我們設w[i]表示第1~i個月的總收入與第1~(fa[i]-1)個月的總收入之差,及第fa[i]~i個月的總收入。

如圖。

若i-1,j在同乙個集合中,則第i~j個月的總收入為w[j]-w[i-1];

當輸入s,t,w時,若s-1,t在同乙個集合中,則判斷w是否等於(w[t]-w[s-1]),若不相等,則直接輸出false。

如圖。

當輸入s,t,w時,若s-1,t不再同乙個集合中,則合併兩個集合,fa[find(s-1)]=find(t),然後更新舊的find(s-1)到新的find(s-1)的w[find(s-1)]。

如圖,w[find(s-1)]=ab=ad-(bc+cd)=w[t]-w[s-1]-w (w[s-1]為未更新前的值)

最後,在路徑壓縮的時候,要記得w[x]+=w[fa[x]]。

#include #include using namespace std;

int t,n,m;

int fa[20000],w[20000];

int find(int x)

int main()

}else

} printf("true\n");

nxt:;

} return 0;

}

bzoj1202 狡猾的商人

如果這個賬本是真的話,那麼對於乙個s,t,在圖上,兩個點之間任意一條路徑的長度都必須相等,不然這個賬本就不是真的。用並查集在維護這個資訊,也就是字首和,字首和就是前i個月收入的錢,那麼對於任意一行資料 s t v 都有 sum s sum t v 然後在並查集的時候,查詢父親節點的時候,將sum值累...

bzoj1202 狡猾的商人

time limit 10 sec memory limit 162 mb submit 3569 solved 1717 submit status discuss 刁奼接到乙個任務,為稅務部門調查一位商人的賬本,看看賬本是不是偽造的。賬本上記錄了n個月以來的收入情況,其中第i 個月的收入額為ai...

BZOJ 1202 狡猾的商人

先處理成字首和關係,然後可以很明顯得看得出這是乙個差分約束。那麼就是最短路問題了。順便複習了一下spfa加slf優化是怎麼寫的,也學習到了另乙個stl deque雙向佇列。include include include include include include include include ...