Codeforces 1156C 尺取法 二分

2022-06-28 04:36:12 字數 674 閱讀 8578

題意:給你乙個陣列,問裡面最多能匹配出多少對,滿足abs(a[i] - a[j]) >= k;

思路:首先肯定要排序。

思路1(尺取法):看了dreamoon的**明白的。我們可以尋找乙個最長的段,這段的最大值和最小值的差小於k,假設陣列長度是n,那麼答案是min(n / 2, n - mx)。為什麼呢?如果mx大於n / 2,容易發現我們最多只能構造出n - mx對,mx小於同理。

**:

#include #define ll long long

#define db double

#define inf 0x3f3f3f3f

#define pii pairusing namespace std;

const int maxn = 200010;

int a[maxn], re[maxn], tot;

bool v[maxn];

int main()

sort(a + 1, a + 1 + n);

int l = 1, r = 1;

int mx = 0;

for(; r <= n; r++)

printf("%d\n", min(n / 2, n - mx));

}

思路2:二分。

二分取前幾個元素,判斷只和後幾個元素能不能匹配即可。

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,...

CodeForces 948C 解題報告

題目鏈結 這道題看出來了是一道stl題,本來一開始用佇列去做,結果tle,在這裡先給出tle include using namespace std typedef long long ll const int maxn 1e5 10 int n,v maxn t maxn int main els...