BZOJ 4548 小奇的糖果

2022-05-21 12:51:11 字數 2277 閱讀 8069

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

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

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

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

對於 $100\%$ 的資料,$n \leqslant 100000$ , $k \leqslant 100000$ , $t \leqslant 3$

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

這道題要我們求一條線段上面的所有點或者是下面的所有點的個數(在滿足題意的1情況下)。這可以轉化為求矩形內部點的個數。

那麼,一共有三種矩形。每個矩形肯定會有左右邊界(因為是線段),那麼三種矩形分別是只有上邊界(情況1),只有下邊界(情況2)和上下邊界都沒有(情況3)。

然後,情況1和情況2具有對稱性。我們只需要把每個點的縱座標取個反就可以由情況1的演算法退出情況2了。因此,我們無需考慮情況2。

首先,我們來考慮情況1的矩形最大可以到**。顯然,這個矩形的左、右、下邊界都受到了同一種顏色的點的制約(或者已經到了所有點之外),因而不能繼續拓展。所以,我們可以考慮列舉下邊界那個點$x$,那麼左邊界就是$x$左邊的點中第乙個縱座標大於他的。右邊界同理。

這種操作是經典的平衡樹操作。但同時也可以使用樹狀陣列加掛鏈來解決。先把所有點按橫座標排好序,相同顏色的點掛好雙向鍊錶,然後再按縱座標從排序,自底向上掃過去,每次從鍊錶中刪去乙個點即可。

這樣做還有乙個好處,就是同時可以對橫座標建乙個樹狀陣列來維護區域內點的個數了。只需一開始把所有點都加進去,然後拿出乙個點作下邊界,就把縱座標等於這個點縱座標的所有點從樹狀陣列中刪去即可。

最後考慮情況3。由於上下邊界都沒有,這實際上轉化成了乙個序列問題。我們可以按橫座標排好序,從前往後掃一邊,每掃到乙個點就用上乙個相同顏色的點與這個點之間點的個數更新一下答案。最後再用最後的點到空區域之間的點更新一下答案即可。

下面貼**(我寫的好像比較醜):

#include#include#include#include#include#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)

#define maxn 100010

using namespace std;

typedef long long llg;

struct datas[maxn],ss[maxn];

int t,n,k,c[maxn],lt[maxn];

int dx[maxn],lx,dy[maxn],ly;

int pr[maxn],ne[maxn],ans;

int w[maxn];

int getint()

bool cmpx(data a,data b)

bool cmpy(data a,data b)

void add(int x,int y)

int sum(int x)

void solve()

for(int i=1;i<=k;i++) ne[lt[i]]=n+1;

sort(s+1,s+n+1,cmpy);

for(int k=1,j;k<=n;k=j) }}

int main()

sort(dx+1,dx+lx+1); lx=unique(dx+1,dx+lx+1)-dx-1;

sort(dy+1,dy+ly+1); ly=unique(dy+1,dy+ly+1)-dy-1;

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

for(int i=1;i<=n;i++) ss[i]=s[i];

solve(); for(int i=1;i<=n;i++) s[i].y=ly+1-s[i].y; solve();

sort(s+1,s+n+1,cmpx);

for(int i=1;i<=k;i++) lt[i]=0;

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

for(int i=1;i<=k;i++) ans=max(ans,n-w[lt[i]]);

for(int i=1;i<=lx;i++) w[i]=0;

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

} return 0;

}

BZOJ 4548 小奇的糖果

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

BZOJ4548 小奇的糖果

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

題解 BZOJ4548 小奇的糖果

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