小a有乙個含有n個非負整數的數列與m個區間,每個區間可以表示為li,ri。
它想選擇其中k個區間, 使得這些區間的交的那些位置所對應的數的和最大。(是指k個區間共同的交,即每個區間都包含這一段,具體可以參照樣例)
在樣例中,5個位置對應的值分別為1,2,3,4,6,那麼選擇[2,5]與[4,5]兩個區間的區間交為[4,5],它的值的和為10。
剛看到題目感覺很可以用掃瞄線做,後來問了lynstery大佬,發現掃瞄線不可以,然後就get到了新操作——線段樹上二分。只要列舉左端點,我們要的最優解一定是所有左端點在當前點左邊的線段中右端點在它右邊的右端點的第k大(線段樹二分)。
#include
#include
#include
#define maxn 100006
#define ll long long
using
namespace
std;
inline
char nc()
inline
int _read()
struct datatree[maxn*4];
int n,k,m,tot,num[maxn],lnk[maxn],nxt[maxn],son[maxn];
ll ans,sum[maxn];
void add(int x,int y)
void build(int p,int l,int r)
void update(int p,int k,int t)
update(p<<1,k,t);update(p<<1|1,k,t);
tree[p].num=tree[p<<1].num+tree[p<<1|1].num;
}int query(int p,int k)
int main()
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個區間共同的交,即每個區間都包含這一段,具體可以參...
HDU 5700 區間交(線段樹)
problem description 小a有乙個含有n個非負整數的數列與m個區間。每個區間可以表示為li,ri。它想選擇其中k個區間,使得這些區間的交的那些位置所對應的數的和最大。例如樣例中,選擇 2,5 與 4,5 兩個區間就可以啦。input 多組測試資料 第一行三個數n,k,m 1 n 10...