51nod 1672(優先佇列)(樹狀陣列)

2021-08-25 08:14:53 字數 1670 閱讀 1867

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
#include#include#include#include#include#include#define maxn 100005

#define ll long long

using namespace std;

struct node

for(int i=0;i#include#include#include#include#include#define maxn 100005

#define ll long long

using namespace std;

struct node

for(int i=0;ik) q.pop();

if(q.size()==k)

ans=max(ans,sum[q.top()]-sum[ac[i].st-1]);

}cout樹狀陣列調了好久..

#include#include#include#include#define maxn 100000

#define ll long long

using namespace std;

struct tree

tree[maxn<<2];

struct node

void updata(int p,int x)

int mid=(tree[p].l+tree[p].r)>>1;

if(mid>=x)

updata(p<<1,x);

else

updata(p<<1|1,x);

tree[p].cover=tree[p<<1].cover+tree[p<<1|1].cover;

}int quety(int p,int x)

int main()

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

sort(ac+1,ac+m+1);

built(1,1,n);

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

ll ans=0;

ac[m+1].last=0;

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

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

return 0;

}

51nod 1672 區間交(線段樹)

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

51 nod 1672 區間交 列舉 貪心

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

51nod 1672 區間交 線段樹 貪心

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