刁奼接到乙個任務,為稅務部門調查一位商人的賬本,看看賬本是不是偽造的。賬本上記錄了n個月以來的收入情況,其中第i 個月的收入額為ai(i=1,2,3...n-1,n), 。當 ai大於0時表示這個月盈利ai 元,當 ai小於0時表示這個月虧損ai 元。所謂一段時間內的總收入,就是這段時間內每個月的收入額的總和。 刁奼的任務是秘密進行的,為了調查商人的賬本,她只好跑到商人那裡打工。她趁商人不在時去偷看賬本,可是她無法將賬本偷出來,每次偷看賬本時她都只能看某段時間內賬本上記錄的收入情況,並且她只能記住這段時間內的總收入。 現在,刁奼總共偷看了m次賬本,當然也就記住了m段時間內的總收入,你的任務是根據記住的這些資訊來判斷賬本是不是假的。
第一行為乙個正整數w,其中w < 100,表示有w組資料,即w個賬本,需要你判斷。每組資料的第一行為兩個正整數n和m,其中n < 100,m < 1000,分別表示對應的賬本記錄了多少個月的收入情況以及偷看了多少次賬本。接下來的m行表示刁奼偷看m次賬本後記住的m條資訊,每條資訊佔一行,有三個整數s,t和v,表示從第s個月到第t個月(包含第t個月)的總收入為v,這裡假設s總是小於等於t。
包含w行,每行是true或false,其中第i行為true當且僅當第i組資料,即第i個賬本不是假的;第i行為false當且僅當第i組資料,即第i個賬本是假的。
2 3 3
1 2 10
1 3 -5
3 3 -15
5 31 5 100
3 5 50
1 2 51
true
false
題解
帶權並查集,畫個圖自己推一推就比較容易理解了,要注意向量圖注意方向。
推薦另一道類似的題codevs4246
1 #include2 #include3 #include4#define maxn 110
5using
namespace
std;
6int
t,m,n,a,b,val,tmp;
7int
fa[maxn],d[maxn];
8int find(intx)9
16int
main()
1728
for(int i=1 ; i<=m ; ++i)
2940
else
4144}45
if(tmp)printf("
true\n");
46else printf("
false\n");
47}48return0;
49}50 ?
狡猾的商人 bzoj1202,HNOI2005
ac通道 分析 因為每月的總收入可以為正,也可以為負,所以要比較兩個區間是否相符,當且僅當它們邊界都相同時才能比較。我們設w i 表示第1 i個月的總收入與第1 fa i 1 個月的總收入之差,及第fa i i個月的總收入。如圖。若i 1,j在同乙個集合中,則第i j個月的總收入為w j w i 1...
BZOJ1202 HNOI2005 狡猾的商人
把輸出的false打成flase了 一直沒注意到 先將區間和轉成字首和 那麼就知道了若干條形如sr sl 1 c 的資訊 能判斷出賬本是假的當且僅當通過已知的資訊得到的sr sl 1 c 於是維護乙個帶權並查集,當 r 和l 1在同乙個集合裡的時候,利用維護的和根的差算出sr sl 1 判斷是否和 ...
BZOJ1202 HNOI2005 狡猾的商人
time limit 10 sec memory limit 162 mb submit 4198 solved 2026 submit status discuss 刁奼接到乙個任務,為稅務部門調查一位商人的賬本,看看賬本是不是偽造的。賬本上記錄了n個月以來的收入情況,其中第i 個月的收入額為ai...