小a有乙個含有n個非負整數的數列與m個區間。每個區間可以表示為li,ri。
它想選擇其中k個區間, 使得這些區間的交的那些位置所對應的數的和最大。
例如樣例中,選擇[2,5]與[4,5]兩個區間就可以啦。
多組測試資料
第一行三個數n,k,m(1≤n≤100000,1≤k≤m≤100000)。
接下來一行n個數ai,表示lyk的數列(0≤ai≤109)。
接下來m行,每行兩個數li,ri,表示每個區間(1≤li≤ri≤n)。
一行表示答案
5 2 3
1 2 3 4 6
4 52 5
1 4離線線段樹,線段樹維護區間和就好了
我暴力列舉左端點,然後每次使得在這個左端點上的區間的右端點++就好了
那麼顯然從i開始到這個位置的字首和,就是這個點覆蓋了多少次
#includeusing namespace std;
const int maxn = 1e5+7;
int n,k,m;
long long t[maxn*4],sum[maxn],a[maxn],l,r;
vectore[maxn];
void build(int x,int l,int r)
void update(int x,int l,int r,int pos)
int mid=(l+r)/2;
if(pos<=mid)update(x<<1,l,mid,pos);
else update(x<<1|1,mid+1,r,pos);
t[x]=t[x<<1]+t[x<<1|1];
}int query(int x,int l,int r,int p)
printf("%lld\n",ans);
}int main()
HDU 5700 區間交(線段樹)
problem description 小a有乙個含有n個非負整數的數列與m個區間。每個區間可以表示為li,ri。它想選擇其中k個區間,使得這些區間的交的那些位置所對應的數的和最大。例如樣例中,選擇 2,5 與 4,5 兩個區間就可以啦。input 多組測試資料 第一行三個數n,k,m 1 n 10...
hdu 5700 區間交 線段樹 列舉
傳送門 題意 給定序列a1,a2.an以及m個區間,從m個區間中選出k個區間使k個區間相交的部分和最大。思路 預處理字首和。按照r從小到大l從大到小的順序將所有區間排序,用線段樹維護區間第k小。然後列舉區間的右端點,求出當前第k小左端點,然後計算差值即可。include include includ...
hdu 5700 區間交(優先佇列)
思路 現將每條線段按左端點公升序排序,依次往堆裡加右端點,若果size k就pop一下。如果size k並且最小的大於當前l則更新一下。因為這樣每個左端點的對應右端點一定是最大的,這裡堆的作用相當於事實求出左端點比當前左端點小的線段中第k大的右端點,而這個肯定是最大的當前左端點對應的區間。inclu...