二分(差分+思維)
當猜了乙個數\(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參考:hereusing
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 }
金牌廚師(二分 差分)
乙個廚師可以做出辣度範圍是 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...