51nod1685 第K大區間2

2021-07-12 07:43:26 字數 2063 閱讀 8040

1685 第k大區間2

基準時間限制:1.5 秒 空間限制:131072 kb 分值: 160 

難度:6級演算法題

現給出n個數,求將所有長度為奇數的區間的值排序後,第k大的值為多少。

樣例解釋:

[l,r]表示區間的值

[1]:3

[2]:1

[3]:2

[4]:4

[1,3]:2

[2,4]:2

第三大是2

input

第一行兩個數n和k(1<=n<=100000,k<=奇數區間的數量)

第二行n個數,0<=每個數<2^31

output

乙個數表示答案。
input示例

4 3

3 1 2 4

output示例

2
二分答案t,統計中位數大於等於t的區間有多少個。

設a[i]為前i個數中有a[i]個數》=t,若奇數區間[l,r]的中位數》=t,則(a[r]-a[l-1])*2>r-l+1,即(a[r]*2-r)>(a[l-1]*2-l+1)。

設b[i]=a[i]*2-i,統計每個b[i]有多少個b[j]

卡在統計上了,想用multiset二分發現不成,樹狀陣列記錄前面b[x]的值,直接統計。

**:

//#pragma comment(linker, "/stack:102400000,102400000") 

#pragma warning(disable:4996)

#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

#define ll_inf 0x3fffffffffffffff

#define int_inf 0x3fffffff

#define mem(a, b) memset(a, b, sizeof(a))

#define pper(i,n,m) for(int i = n;i >= m; i--)

#define repp(i, n, m) for (int i = n; i <= m; i++)

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

#define sa(n) scanf("%d", &(n))

#define mp make_pair

#define ff first

#define ss second

#define pb push_back

const int maxn = 4 * 200005;

const ll mod = 1e9 + 7;

const double pi = acos(-1.0);

ll n, k;

ll val[maxn], b[maxn];

ll d[2][maxn];

int lowbit(int x)

void add(int pos, int x, int v)

}ll get(int pos, int x)

return res;

}bool check(ll x)

else

}for (i = 1; i <= n; i++)

mem(d, 0);

ll res = 0, sum = 0;

add(0, 2 * n, 1);

for (i = 1; i <= n; i++)

return res >= k;

}void solve()

ll le = 0, ri = int_inf;

ll mid;

while (le < ri)

else

}printf("%lld", le);

}int main()

題解 51nod 1685第K大區間2

二分答案 感覺這個思路好像挺常用的 求第 k 大 二分第 k 大的值 檢驗當前二分的值排名是第幾。前提 排名與數值大小成單調性變化。於是對於這題我們也不例外,二分一下最後中位數的值是多少,把陣列中的值 k 的變成 1 k 的變成 1 k 的為 0 那麼,乙個中位數為 k 的區間區間和為 0 乙個中位...

51Nod 1686 第K大區間

題意 中文題,定義乙個區間的值為其眾數出現的次數。現給出n個數,求將所有區間的值排序後,第k大的值為多少。離散化二分答案加尺取判斷 include include includeusing namespace std const int maxn 100006 typedef long long l...

51nod 1686 第K大區間

1686 第k大區間 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 定義乙個區間的值為其眾數出現的次數。現給出n個數,求將所有區間的值排序後,第k大的值為多少。input 第一行兩個數n和k 1 n 100000,k n n 1 2 第二行n個數,0 每個數 2...