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<=奇數區間的數量)output第二行n個數,0<=每個數<2^31
乙個數表示答案。input示例
4 3output示例3 1 2 4
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...