HDU 5700區間交 百度之星2B

2021-07-12 01:10:53 字數 1556 閱讀 4859

按左端點排序,暴力列舉左端點,尋找這個左端點右邊最右端被覆蓋

>=

k 次的位置,那麼這個長度就是以當前節點為左端點的最大的和。

那麼就是乙個區間覆蓋+更新查詢操作,用一顆線段樹就可以維護。

複雜度:o(

nlog

n)

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

typedef

vector

vi;

typedef pair pii;

#define for(i,x,y) for(int i = x;i < y;++ i)

#define ifor(i,x,y) for(int i = x;i > y;-- i)

#define pb push_back

#define mp make_pair

#define fi first

#define se second

#define lrt rt<<1

#define rrt rt<<1|1

#define lson rt<<1,l,mid

#define rson rt<<1|1,mid+1,r

const

int maxn = 100010;

int n,k,m;

ll a[maxn],sum[maxn];

vi id[maxn];

struct seg

}seg[maxn];

struct treetree[maxn<<2];

void pushup(int rt)

void pushdown(int rt)

}void build(int rt,int l,int r)

void modify(int rt,int l,int r,int val)

pushdown(rt);

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

if(r <= mid) modify(lrt,l,r,val);

else

if(l > mid) modify(rrt,l,r,val);

else

pushup(rt);

}int query(int rt)

void work()

int r = query(1);

if(r >= i) ans = max(ans,sum[r]-sum[i-1]);

}printf("%i64d\n",ans);

}int main()

return

0;}

HDU 5700 區間交(線段樹)

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

hdu 5700 區間交(優先佇列)

思路 現將每條線段按左端點公升序排序,依次往堆裡加右端點,若果size k就pop一下。如果size k並且最小的大於當前l則更新一下。因為這樣每個左端點的對應右端點一定是最大的,這裡堆的作用相當於事實求出左端點比當前左端點小的線段中第k大的右端點,而這個肯定是最大的當前左端點對應的區間。inclu...

hdu 5700 區間交 線段樹 列舉

傳送門 題意 給定序列a1,a2.an以及m個區間,從m個區間中選出k個區間使k個區間相交的部分和最大。思路 預處理字首和。按照r從小到大l從大到小的順序將所有區間排序,用線段樹維護區間第k小。然後列舉區間的右端點,求出當前第k小左端點,然後計算差值即可。include include includ...