按左端點排序,暴力列舉左端點,尋找這個左端點右邊最右端被覆蓋
>=
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...