題解 BZOJ4548 小奇的糖果

2022-05-11 17:12:20 字數 1112 閱讀 3557

本文同步在學弟zcdhj的個人部落格發布,審核需要一段時間.

傳送門考慮題目中獲得的糖果並不包含所有的顏色這句話,發現相當於我們可以直接選取某乙個顏色強制不能選(這樣子一定最優).

然後就可以考慮分開解決上面和下面.

先考慮下面:

列舉顏色然後搞區間(不能包含這一種顏色)

按照橫座標的順序刪點,然後再看刪除的點的顏色的區間是否會被更新

以上操作的話,查詢區間可以用雙向鍊錶,區間求點(和)可以使用樹狀陣列.

差不多就這樣子了.

#include#include#include#include#include#include#includeusing namespace std;

inline int gi()

while(ch>='0' && ch<='9')

return f*sum;

}int ans,n,k,c[500010],x[500010],l[500010],r[500010],last[500010],b[500010];

struct nodep[500010];

int lowbit(int x)

void add(int x,int d)

int query(int x)

bool cmp1(node a,node b)

void solve()

for(int i=1;i<=k;i++)update(x[last[i]]+1,n+1);

sort(p+1,p+n+1,cmp2);

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

}int main()

for(int i=1;i<=n;i++)b[i]=p[i].x;

sort(&b[1],&b[n+1]);

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

solve();

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

solve();

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 分別表示點數和顏...