codeforces1169C 二分答案 思維

2021-10-08 13:25:18 字數 1592 閱讀 9247

1700的題,然而比賽的時候沒有做出來。。

題意:給你乙個n表示序列長度為n,還有乙個m表示這個序列的最大值小於m

然後對這個陣列進行多次操作,一次操作為 對ai,aj,ap,等k個數進行+1且對m取模,最後讓這個序列變成乙個不遞減的序列,可以證明通過x次操作你是一定可以使這個陣列符合條件,現在的問題是求得最少的操作次數x。

思路:從題意可以看出這個題目的答案一定是在0~m之間,因為對於任何乙個陣列操作至多m次之後都可以變成0000的陣列,所以對答案進行二分,然後對每個操作次數x進行分析,可以得出以下結論:

mx表示前i個數的最大值

1、如果這個數小於前面陣列的最大值,那麼只需要a[i]+x>=mx就行

2、如果這個數大於前面陣列的最大值,那麼如果這個數

a[i]+x>m :表示取模之後變小了,這裡又分兩種情況:

1、如果a[i]+x-m=mx,就意味著,我可以不加那麼多x,即mx不進行更新

a[i]+x#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

typedef pair<

int,

int> pii;

#define rep(i, a, n) for(int i = a; i < n; i++)

#define per(i, a, n) for(int i = n-1; i >= a; i--)

#define ios std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

#define inf 1ll<<60

#define fopen freopen("file.in","r",stdin);freopen("file.out","w",stdout);

#define fclose fclose(stdin);fclose(stdout);

#define pi 3.14159265358979323846

const

int maxn =

3e5+10;

inline

intread()

while

(isdigit

(ch)

)return x*f;

}int a[maxn]

;int n, m;

bool

check

(int x)

}else

}return1;

}int

main()

else l = mid+1;

}printf

("%d\n"

, ans)

;return0;

}

CodeForces 1169C(二分 思維)

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

Codeforces 587C 樹上倍增

題意 求樹上兩點路徑中的前 a 10 小的點權值。思路 類似lca倍增演算法來儲存 i 2 j 路上的 前 10 小個 的點權值。然後要寫乙個權值合併 具體求 u v 的話,就是先分別計算 和 減1是lca會重疊 然後再合併,輸出答案。include include include include ...

Codeforces 976C 題解報告

對資料進行排序 1 按左邊的數從小到大排 2 若左邊的數相等,則按右邊的數從大到小排。排序之後,若乙個數的右邊的數小於等於上乙個數的右邊的數,則這兩個數必然符合題意。比如2 13 2 12 1 11排序之後,變為 1 11 2 13 2 12因為12 13,則有 2,12 被包含在它的上乙個數 2,...