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