BZOJ4548 小奇的糖果

2022-05-09 15:13:29 字數 2345 閱讀 4029

試題描述

有 \(n\) 個彩色糖果在平面上。小奇想在平面上取一條水平的線段,並拾起它上方或下方的所有糖果。求出最多能夠拾起多少糖果,使得獲得的糖果並不包含所有的顏色。

輸入包含多組測試資料,第一行輸入乙個正整數 \(t\) 表示測試資料組數。

接下來 \(t\) 組測試資料,對於每組測試資料,第一行輸入兩個正整數 \(n\)、\(k\),分別表示點數和顏色數。

接下來 \(n\) 行,每行描述乙個點,前兩個數 \(x, y (|x|, |y| \le 2^ - 1)\) 描述點的位置,最後乙個數 \(z (1 \le z ≤ k)\) 描述點的顏色。

輸出對於每組資料在一行內輸出乙個非負整數 \(ans\),表示答案

輸入示例

1

10 3

1 2 3

2 1 1

2 4 2

3 5 3

4 4 2

5 1 2

6 3 1

6 7 1

7 2 3

9 4 2

輸出示例
5
資料規模及約定

對於 \(100\%\) 的資料,\(n \le 100000,k \le 100000,t \le 3\)

題解此題和那道題是雙倍經驗關係。

然而我那道題的做法在這裡直接 t 飛了,所以再講乙個不那麼慢的做法。(雖然也是基本墊底)

如果給出的點沒有提到所有顏色,就直接輸出 \(n\)。

列舉不能包含的那個顏色 \(c\),令所有顏色為 \(c\) 的點的集和為 \(s_c\)。將 \(s_c\) 中的點按 \(x\) 座標排序,然後我們從左到右依次考慮每個點,並以 \(y\) 座標為關鍵字維護單調棧,當刪除單調棧中的元素時統計一下極大子矩形的答案。詢問矩形內部點數可以用主席樹乙個 \(\log n\) 做。

#include #include #include #include #include #include #include using namespace std;

#define rep(i, s, t) for(int i = (s), mi = (t); i <= mi; i++)

#define dwn(i, s, t) for(int i = (s), mi = (t); i >= mi; i--)

int read()

while(isdigit(c))

return x * f;

}#define maxn 100010

#define maxnode 2000010

#define pii pair #define x first

#define y second

#define mp(x, y) make_pair(x, y)

int n, k, nx[maxn], ny[maxn];

pii ps[maxn];

vector col[maxn];

bool cmpy(pii a, pii b)

int tot, rt[maxn], sumv[maxnode], lc[maxnode], rc[maxnode];

void update(int& y, int x, int l, int r, int p)

int query(int o, int l, int r, int ql, int qr)

int query(int xl, int xr, int yl, int yr)

int s[maxn], top;

void work()

sort(nx + 1, nx + n + 1);

sort(ny + 1, ny + n + 1);

rep(i, 1, n)

ps[i].x = lower_bound(nx + 1, nx + n + 1, ps[i].x) - nx,

ps[i].y = lower_bound(ny + 1, ny + n + 1, ps[i].y) - ny;

rep(c, 1, k)

} sort(ps + 1, ps + n + 1, cmpy);

int j = 1;

rep(i, 1, n)

int ans = 0;

rep(c, 1, k)

s[++top] = i;

} while(top)

// up

rep(i, 0, (int)col[c].size() - 1)

s[++top] = i;

} while(top)

} printf("%d\n", ans);

return ;

}int main()

BZOJ 4548 小奇的糖果

有 n 個彩色糖果在平面上。小奇想在平面上取一條水平的線段,並拾起它上方或下方的所有糖果。求出最多能夠拾 起多少糖果,使得獲得的糖果並不包含所有的顏色。包含多組測試資料,第一行輸入乙個正整數 t 表示測試資料組數。接下來 t 組測試資料,對於每組測試資料,第一行輸入兩個正整數 n k,分別表示點數和...

BZOJ 4548 小奇的糖果

有 n 個彩色糖果在平面上。小奇想在平面上取一條水平的線段,並拾起它上方或下方的所有糖果。求出最多能夠拾起多少糖果,使得獲得的糖果並不包含所有的顏色。包含多組測試資料,第一行輸入乙個正整數 t 表示測試資料組數。接下來 t 組測試資料,對於每組測試資料,第一行輸入兩個正整數 n k 分別表示點數和顏...

題解 BZOJ4548 小奇的糖果

本文同步在學弟zcdhj的個人部落格發布,審核需要一段時間.傳送門考慮題目中獲得的糖果並不包含所有的顏色這句話,發現相當於我們可以直接選取某乙個顏色強制不能選 這樣子一定最優 然後就可以考慮分開解決上面和下面.先考慮下面 列舉顏色然後搞區間 不能包含這一種顏色 按照橫座標的順序刪點,然後再看刪除的點...