Bzoj4548 小奇的糖果(鍊錶 樹狀陣列)

2022-05-07 19:27:06 字數 1276 閱讀 5299

bzoj

很顯然,我們只需要考慮單獨取線段上方的情況,對於下方的把座標取反再做一遍即可(因為我們只關心最終的答案)

建立樹狀陣列維護乙個橫座標區間內有多少個點,維護雙向鍊錶實現查詢乙個點左(右)橫座標最大(小)的與它相同的點。

首先列舉沒有取到的顏色,找出所有不包含這種顏色的區間,更新答案。

接著考慮兩個相同顏色的點的貢獻,按照縱座標從大到小列舉所有的點,分別在樹狀陣列和雙向鍊錶中刪除當前點,並利用這個點左右兩邊和它顏色相同的點之間的區間內點的個數更新答案。

#include #include #include using std::min; using std::max;

using std::sort; using std::swap;

using std::unique; using std::lower_bound;

typedef long long ll;

templatevoid read(t &x)

while(ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); x *= flag;

}const int n = 1e5 + 10;

int t, n, k, x[n], ans;

struct data p[n];

int disc[n], t[n];//樹狀陣列

int last[n], l[n], r[n];//雙向鍊錶

void add (int x, int y)

int query (int x)

inline bool cmpx(const data &a, const data &b)

inline bool cmpy(const data &a, const data &b)

void update(int l, int r)

void doit ()

for(int i = 1; i <= k; ++i)

update(x[last[i]] + 1, n + 1);

sort(&p[1], &p[n + 1], cmpy);

for(int i = 1, j = 1; i <= n; ++i)

}int main ()

doit(); for(int i = 1; i <= n; ++i) p[i].y = -p[i].y; doit();

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

} return 0;

}

BZOJ 4548 小奇的糖果

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

BZOJ4548 小奇的糖果

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

BZOJ 4548 小奇的糖果

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