二分 差分 思維

2022-05-29 19:03:16 字數 1596 閱讀 8507

二分(差分+思維)

當猜了乙個數\(x\),總共有三種情況:

裁判說數大了,那麼裁判說對的取值範圍是(-∞,x]

裁判說數小了,那麼裁判說對的取值範圍是[x,+∞)

裁判說數一樣,那麼裁判說對的取值範圍是[x,x]

那麼我們只需要求最大有多少個區間重疊了就行了,問題就轉化成了區間的修改,單點查詢,可以考慮差分了。

注意題目資料\(n\)只有100000,但是所猜的數是在\(int\)範圍內的,所以我們可以離散化

對於三種情況:'+': cf[1]++,cf[pos]--;  '-':cf[pos+1]++;  '.':cf[pos]++, cf[pos+1]--;

但是這樣是錯的:

比如下面這個樣例我們應該輸出2,如果單純的直接離散化然後查詢我們輸出答案就是1

3 -5 +

為什麼會錯呢:我們模擬一下上面錯誤的過程,最終我們的cf陣列是這樣的cf[1]=1,cf[2]=0;

其實這兩個共同覆蓋了4,但是我們並沒有體現出來(如果這裡講的不太清楚,可以看看這裡講的:here)

那麼怎麼避免這種錯誤呢,如果相鄰數字間距大於1的話,在我們可以在其中加上任意乙個數字。

ac_code:

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7 typedef long

long

ll;8

#define endl '\n'

9const

int maxn = 1e6+10;10

const

int inf = 0x3f3f3f3f;11

12struct

nodee[maxn];

1617

intb[maxn];

18int

cf[maxn];

19int

n;20

21int

main()

2230 sort(b+1,b+1+n);

31int num=unique(b+1,b+1+n)-(b+1

);32

int reu=num;

33for(int i=1;i)

36 sort(b+1,b+1+num);

37for(int i=0;i)

43else

if( e[i].s[0]=='-'

)46else

if( e[i].s[0]=='+'

)50}51

int mx=-1;52

int f=cf[1

];53 mx=f;

54for(int i=2;i<=num;i++)59}

60 printf("

%d\n

",mx);

61return0;

62 }

參考:here

金牌廚師(二分 差分)

乙個廚師可以做出辣度範圍是 1,n 的菜。現在有 m 個同學,每個同學可以接受的辣度範圍是 l i,r i 廚師每天會選擇一部分同學,做出讓他們都滿意的菜。滿意程度定義為選出的同學的人數 k 和能讓這部分同學都接受的菜的種類數 x 這裡理解為一種辣度對應一種菜 兩者中的最小值,即 min k,x 求...

攀爬 二分, 思維

若存在乙個合法的攀爬序列,則其形式一定是 ak i 1 m ai bi la sum limits m a i b i geq l ak i 1 m ai bi l,於是考慮列舉 a ka k ak 設 di ai b id i a i b i di ai bi 按 d dd從大到小排序,然後 o ...

D Max Median 二分 思維

d.max median 二分 思維 題目大意 給你乙個長度為n的序列,乙個長度為 x 的中位數是 這個序列重新排序之後的 frac 向下取整的位置,讓你求長度至少為 k 的子串行的最大中位數是多少?題解 include using namespace std typedef long long l...