二分最小值,如果你能實現這個最小值是可以實現的,那麼一定是最優的,因為每次區間+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次操作你是一定可以使這個陣列符合條件,現在的問題是...