Codeforces460C 二分 線段樹

2021-08-04 18:26:44 字數 1221 閱讀 4376

二分最小值,如果你能實現這個最小值是可以實現的,那麼一定是最優的,因為每次區間+1,原來存在的最小值的個數還是存在的,但是新的可能會多起來,所以最小值遞增還是最優到最優的;考慮如果不能實現這個最小值,那麼他一定是比之前這個值少的,因為最小值不變,而且個數變少;區間維護可以線段樹。

#include 

using namespace std;

typedef long long ll;

const int n=1e5+10;

struct segt;

segt q[n*4];

char id[n];

int n,m,w;

int a[n];

void build(int num,int l ,int r)

int mid=(l+r)>>1;

build(2

*num,l,mid);

build(2

*num+1,mid+1,r);

q[num].sum=q[2*num].sum+q[2*num+1].sum;

}void pushdown(int num)

}void update(int num,int

s,int t,int v)

pushdown(num);

int mid=(q[num].left+q[num].right)>>1;

if(mid>=t)

update(2

*num,s,t,v);

else

if(midupdate(2

*num+1,s,t,v);

else

q[num].sum=q[2*num].sum+q[2*num+1].sum;

}int query(int num,int

x)bool judge(int k)

else

if(ti>m) return false;

}return true;

}int main()

int left=tmin,right=tmax+m;

while(leftint mid=left+(right-left+1)/2;

if(judge(mid))

left=mid;

else

right=mid-1;

}printf("%d\n",left);

return

0;}

CodeForces 1169C(二分 思維)

codeforces 1169c 1 思路 每次可以選取任意幾個數字進行 ai 1 m的操作,所以最多m次讓序列變為非遞減序列。讓所有的元素值保持盡可能的小,能使最終的運算元最小。所以可以二分查詢需要進行修改的次數tim。2 include include include includeusing ...

codeforces 835C 二維字首和

題意 給出一些點的值,查詢在乙個時間點一段區間的值。點的值會隨時間每次增加一,然後取 k 1 的模。思路 以為k是 10,所以可以把每個時刻每一段的字首和弄出來,然後查詢的時候就行。ps 乙個點不只是乙個值,在這個地方被卡。二維字首和的構造和維護可以複習一下。includeusing namespa...

codeforces1169C 二分答案 思維

1700的題,然而比賽的時候沒有做出來。題意 給你乙個n表示序列長度為n,還有乙個m表示這個序列的最大值小於m 然後對這個陣列進行多次操作,一次操作為 對ai,aj,ap,等k個數進行 1且對m取模,最後讓這個序列變成乙個不遞減的序列,可以證明通過x次操作你是一定可以使這個陣列符合條件,現在的問題是...