BZOJ1202 HNOI2005 狡猾的商人

2022-05-02 15:18:10 字數 1982 閱讀 8834

time limit: 10 sec  memory limit: 162 mb

submit: 4198  solved: 2026

[submit][status][discuss]

刁奼接到乙個任務,為稅務部門調查一位商人的賬本,看看賬本是不是偽造的。賬本上記錄了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

【題解】

一眼並查集,而眼部分和->字首和常見套路。

對於σl..r = w

拆成pre[r] - pre[l - 1]

其中pre[i] = num[1] + num[2] + ... + num[i - 1] + num[i]

用加權並查集維護字首和

即若fa[f1] = f2, 則pre[f2] - pre[f1] = val[cnt1]

val[i]表示i到他父親的權重

推一推式子就能維護了

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8

#define min(a, b) ((a) < (b) ? (a) : (b))

9#define max(a, b) ((a) > (b) ? (a) : (b))

10#define abs(a) ((a) < 0 ? (-1 * (a)) : (a))

11 inline void swap(int &a, int &b)

1215 inline void read(int &x)

1622

23const

int inf = 0x3f3f3f3f;24

const

int maxn = 100 + 10;25

26int

fa[maxn], val[maxn], n, m;

2728

int find(int

x)29

3637

intmain()

3854

else

5561}62

if(i == m) printf("

true\n");

63}64}

65return0;

66 }

bzoj1202

狡猾的商人 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 狡猾的商人

bzoj1202 hnoi2005 狡猾的商人 試題描述 刁奼接到乙個任務,為稅務部門調查一位商人的賬本,看看賬本是不是偽造的。賬本上記錄了n個月以來的收入情況,其中第i 個月的收入額為ai i 1,2,3.n 1,n 當 ai大於0時表示這個月盈利ai 元,當 ai小於0時表示這個月虧損ai 元。...