51nod 1672 區間交(線段樹)

2021-08-07 06:50:19 字數 1886 閱讀 3176

1672 區間交

基準時間限制:1 秒 空間限制:131072 kb 分值: 40 

難度:4級演算法題

小a有乙個含有n個非負整數的數列與m個區間,每個區間可以表示為li,ri。

它想選擇其中k個區間, 使得這些區間的交的那些位置所對應的數的和最大。(是指k個區間共同的交,即每個區間都包含這一段,具體可以參照樣例)

在樣例中,5個位置對應的值分別為1,2,3,4,6,那麼選擇[2,5]與[4,5]兩個區間的區間交為[4,5],它的值的和為10。

input

第一行三個數n,k,m(1<=n<=100000,1<=k<=m<=100000)。

接下來一行n個數ai,表示小a的數列(0<=ai<=10^9)。

接下來m行,每行兩個數li,ri,表示每個區間(1<=li<=ri<=n)。

output

一行表示答案
input示例

5 2 3

1 2 3 4 6

4 52 5

1 4

output示例

10

joe(題目提供者)

c++的執行時限為:1000 ms ,空間限制為:131072 kb 

示例及語言說明請按這裡

允許其他 ac 的使用者檢視此**,分享**才能檢視別人的**並有機會獲得勳章

剛開始想著二分搞搞,然後各種小細節和問題,debug了半天果斷換方法,想著還是拿線段樹搞搞吧,我們可以列舉區間,每遇到乙個區間便把當前區間右端點加入線段樹,這樣我們就能列舉左端點來求解最大值了,當然,前k-1個左端點不用列舉。。。。

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

#define inf 1000000000

#define mod 1000000007

#define maxn 886000

#define pi 3.1415926

#define lowbit(x) (x&-x)

#define eps 1e-9

ll sum[maxn], a[maxn], sm[maxn];

struct node

b[maxn];

bool comp(node a, node b)

void update(ll id, ll l, ll r, ll x)

ll mid = (l + r) / 2;

if (mid >= x)

update(id * 2, l, mid, x);

else

update(id * 2 + 1, mid + 1, r, x);

sum[id] = sum[id * 2] + sum[id * 2 + 1];

} ll query(ll id, ll l, ll r, ll x)

int main(void)

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

scanf("%lld%lld", &b[i].l, &b[i].r);

sort(b + 1, b + m + 1, comp);

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

update(1, 1, n, b[i].r);

for (i = k;i <= m;i++)

printf("%lld\n", ans);

return 0;

}

51nod 1672 區間交 線段樹 貪心

小a有乙個含有n個非負整數的數列與m個區間,每個區間可以表示為li,ri。它想選擇其中k個區間,使得這些區間的交的那些位置所對應的數的和最大。是指k個區間共同的交,即每個區間都包含這一段,具體可以參照樣例 在樣例中,5個位置對應的值分別為1,2,3,4,6,那麼選擇 2,5 與 4,5 兩個區間的區...

51 nod 1672 區間交 列舉 貪心

1672 區間交 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 小a有乙個含有n個非負整數的數列與m個區間,每個區間可以表示為li,ri。它想選擇其中k個區間,使得這些區間的交的那些位置所對應的數的和最大。是指k個區間共同的交,即每個區間都包含這一段,具體可以參...

HDU 5700 區間交(線段樹)

problem description 小a有乙個含有n個非負整數的數列與m個區間。每個區間可以表示為li,ri。它想選擇其中k個區間,使得這些區間的交的那些位置所對應的數的和最大。例如樣例中,選擇 2,5 與 4,5 兩個區間就可以啦。input 多組測試資料 第一行三個數n,k,m 1 n 10...